[php-src] Issue #9175: Multiplication operand order
| From: | mario-deluna | Date: | Thu, 28 Jul 2022 10:07:03 +0000 |
| Subject: | [php-src] Issue #9175: Multiplication operand order | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-242045@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/9175
Author: mario-deluna
### Description
In reference to [#3735](https://github.com/php/php-src/pull/3735), I'm struggling with a very
similar problem. I'm working on a GL math extension and have encountered a roadblock with
matrix multiplication.
As [@weltling](https://github.com/weltling) pointed out, the order is critical, and I can see that
this commit https://github.com/php/php-src/commit/1165a9068cbf3c3c24a78b47e0effcf9b90ec5bc
removed
ZEND_MUL from one of the optimizer passes. I'm not 100% certain the
swapping occurs in the optimizer as I ran into the swapped arguments also with the opcache turned
off and opcache.optimization_level=0x00000000.
The extension utilizes the do_operation handler. Here is example code to explain myself
better.
The problem only occurs when multiplying three or more objects in one expression.
```php
<?php
use GL\Math\Mat4;
$m1 = new Mat4(
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16
);
$m2 = new Mat4(
16, 15, 14, 13,
12, 11, 10, 9,
8, 7, 6, 5,
4, 3, 2, 1
);
$m3 = new Mat4(
0.16, 0.15, 0.14, 0.13,
0.12, 0.11, 0.10, 0.90,
0.80, 0.70, 0.60, 0.50,
0.40, 0.30, 0.20, 0.10
);
// works fine, correct order
var_dump($m1 * $m2);
// incorrect result, order of execution is:
// logged: MUL(tmp_res, $m1 * $m2), MUL(returnval, $m3 * tmp_res)
var_dump($m1 * $m2 * $m3);
// you can workaround using parenthesis
// logged: MUL(tmp_res, $m2 * $m3), MUL(returnval, $m1 * tmp_res)
var_dump($m1 * ($m2 * $m3));
// but for the expected result it should not matter where parenthesis are set and the order should
be fixed.
```
I've tried to look for workarounds by somehow detecting when and if they have been swapped but
have had no luck yet.
I gladly open a pull request if this requires some work in php-src itself, but I would
kindly ask for some hints and direction on where this might happen.
Kind regards Mario
### PHP Version
PHP 8.1.5
### Operating System
MacOS 12.4