[php-src] Issue #20838: JIT compiler in 1255 mode produces wrong result of arithmetical operations
[email protected] (HubbGit)
| Newsgroups | php.bugs |
|---|---|
| Message-ID | <[email protected]> |
Issue: https://github.com/php/php-src/issues/20838
Author: HubbGit
### Description
The following code:
```php
<?php
$result = json_decode( '[{"ID":"49"},{"ID":"1080"},{"ID":"4415"},{"ID":"4763"},{"ID":"4926"},{"ID":"4933"},{"ID":"4935"},{"ID":"4938"},{"ID":"4939"},{"ID":"4947"},{"ID":"4952"},{"ID":"4953"},{"ID":"4962"},{"ID":"8558"},{"ID":"14888"},{"ID":"16879"},{"ID":"100003"},{"ID":"100007"},{"ID":"100013"},{"ID":"100017"},{"ID":"100019"},{"ID":"100027"},{"ID":"100031"},{"ID":"106427"},{"ID":"217955"},{"ID":"240000"},{"ID":"240010"},{"ID":"240021"},{"ID":"240079"},{"ID":"240210"},{"ID":"240227"},{"ID":"240249"},{"ID":"240273"},{"ID":"240333"},{"ID":"240335"},{"ID":"300024"},{"ID":"310001"},{"ID":"310025"},{"ID":"310034"},{"ID":"310042"},{"ID":"310111"},{"ID":"310191"},{"ID":"310219"},{"ID":"310236"},{"ID":"310322"},{"ID":"310356"},{"ID":"310360"},{"ID":"310394"},{"ID":"310405"},{"ID":"310411"}]', true );
$result1 = json_decode( '[{"ID":"1080","cat":"6","vote":"2"},{"ID":"4415","cat":"1","vote":"5"},{"ID":"4415","cat":"5","vote":"-5"},{"ID":"4763","cat":"1","vote":"5"},{"ID":"4926","cat":"1","vote":"5"},{"ID":"4933","cat":"1","vote":"4"},{"ID":"4935","cat":"1","vote":"5"},{"ID":"4938","cat":"1","vote":"5"},{"ID":"4939","cat":"1","vote":"5"},{"ID":"4947","cat":"1","vote":"4"},{"ID":"4952","cat":"1","vote":"3"},{"ID":"4953","cat":"1","vote":"5"},{"ID":"4962","cat":"1","vote":"4"},{"ID":"8558","cat":"1","vote":"3"},{"ID":"14888","cat":"4","vote":"5"},{"ID":"16879","cat":"4","vote":"-2"},{"ID":"16879","cat":"6","vote":"3"},{"ID":"100003","cat":"1","vote":"0"},{"ID":"100007","cat":"1","vote":"4"},{"ID":"100013","cat":"1","vote":"0"},{"ID":"100017","cat":"6","vote":"4"},{"ID":"100017","cat":"4","vote":"-4"},{"ID":"100019","cat":"1","vote":"1"},{"ID":"100027","cat":"1","vote":"3"},{"ID":"100031","cat":"1","vote":"2"},{"ID":"106427","cat":"5","vote":"-5"},{"ID":"217955","cat":"4","vote":"-1"},{"ID":"217955","cat":"4","vote":"-1"},{"ID":"240000","cat":"1","vote":"2"},{"ID":"240010","cat":"1","vote":"4"},{"ID":"240021","cat":"1","vote":"3"},{"ID":"240079","cat":"1","vote":"4"},{"ID":"240079","cat":"7","vote":"4"},{"ID":"240079","cat":"6","vote":"2"},{"ID":"240210","cat":"1","vote":"3"},{"ID":"240227","cat":"1","vote":"3"},{"ID":"240249","cat":"1","vote":"5"},{"ID":"240273","cat":"1","vote":"5"},{"ID":"240333","cat":"1","vote":"2"},{"ID":"240335","cat":"1","vote":"4"},{"ID":"300024","cat":"3","vote":"4"},{"ID":"300024","cat":"1","vote":"5"},{"ID":"310001","cat":"1","vote":"3"},{"ID":"310025","cat":"1","vote":"3"},{"ID":"310034","cat":"1","vote":"4"},{"ID":"310042","cat":"1","vote":"2"},{"ID":"310111","cat":"1","vote":"5"},{"ID":"310191","cat":"1","vote":"3"},{"ID":"310219","cat":"1","vote":"5"},{"ID":"310236","cat":"1","vote":"1"},{"ID":"310322","cat":"1","vote":"3"},{"ID":"310356","cat":"1","vote":"2"},{"ID":"310360","cat":"1","vote":"3"},{"ID":"310360","cat":"4","vote":"-5"},{"ID":"310394","cat":"1","vote":"1"},{"ID":"310394","cat":"3","vote":"2"},{"ID":"310405","cat":"1","vote":"5"},{"ID":"310411","cat":"1","vote":"4"}]', true );
foreach ( $result as $arr )
{
$v=[];
foreach ( $result1 as $arr1 )
{
if ($arr1['ID']==$arr['ID']) $v[]=$arr1;
}
TLVotesStatUpdateBAD($arr['ID'], $v);
}
function TLVotesStatUpdateBAD(int $id, ?array $v=null) : float
{
static $k;
if (!isset($k)) $k=json_decode('{"4":{"tp":"20","st":"sum"},"3":{"tp":"30","st":"caa"},"2":{"tp":"60","st":"sum"},"1":{"tp":"50","st":"unique"},"5":{"tp":"50","st":"caa"},"6":{"tp":"20","st":"caa"},"7":{"tp":"60","st":"caa"},"8":{"tp":"60","st":"caa"},"255":{"tp":"0","st":"correction"}}',TRUE);
$pav=50;
$s=0.0;
$corrections=0;
$av=[];
$avc=[];
foreach ( $v as $arr )
{
if ($k[$arr['cat']]['st']=='unique') $av[$arr['cat']]=$arr['vote'];
elseif ($k[$arr['cat']]['st']=='correction')
{
$av[$arr['cat']]=$arr['vote'];
$corrections++;
}
else
{
if ($arr['vote']<0) $arr['vote']=$arr['vote']/2;
$av[$arr['cat']]??=0;
$avc[$arr['cat']]??=0;
$av[$arr['cat']]+=$arr['vote'];
$avc[$arr['cat']]++;
}
}
if (($c=count($av)))
{
$c-=$corrections;
foreach ($av as $key => $value)
{
if ($k[$key]['st']=='correction') $s+=$value;
else
{
if ($k[$key]['st']=='caa') $value=$value/$avc[$key];
$s+=$value/5 * $k[$key]['tp'] * (1 + 50/$k[$key]['tp'] * $pav/(100*$c));
echo "$value/5 * {$k[$key]['tp']} * (1 + 50/{$k[$key]['tp']} * $pav/(100*$c))\n";
echo $value/5 * $k[$key]['tp'] * (1 + 50/$k[$key]['tp'] * $pav/(100*$c));
echo "\n";
}
}
}
//echo("$id $c\n");
echo("$id $s\n\n");
return $s;
}
```
Resulted in this output:
```
WRONG RESULTS WHEN opcache.jit=1255
/usr/bin/php -d opcache.enable_cli=1 -d opcache.jit=1255 0.test.php
49 0
2/5 * 20 * (1 + 50/20 * 50/(100*1))
18
1080 18
5/5 * 50 * (1 + 50/50 * 50/(100*2))
62.5
-2.5/5 * 50 * (1 + 50/50 * 50/(100*2))
-31.25
4415 31.25
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4763 75
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4926 75
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
4933 60
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4935 75
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4938 75
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4939 75
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
4947 60
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
4952 45
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4953 75
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
4962 60
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
8558 45
5/5 * 20 * (1 + 50/20 * 50/(100*1))
45
14888 45
-1/5 * 20 * (1 + 50/20 * 50/(100*2))
-6.5
3/5 * 20 * (1 + 50/20 * 50/(100*2))
19.5
16879 13
0/5 * 50 * (1 + 50/50 * 50/(100*1))
0
100003 0
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
100007 60
0/5 * 50 * (1 + 50/50 * 50/(100*1))
0
100013 0
4/5 * 20 * (1 + 50/20 * 50/(100*2))
26
-2/5 * 20 * (1 + 50/20 * 50/(100*2))
-13
100017 13
1/5 * 50 * (1 + 50/50 * 50/(100*1))
15
100019 15
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
100027 45
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
100031 30
-2.5/5 * 50 * (1 + 50/50 * 50/(100*1))
-37.5
106427 -37.5
-1/5 * 20 * (1 + 50/20 * 50/(100*1))
-9
217955 -9
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
240000 30
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
240010 60
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
240021 45
4/5 * 50 * (1 + 50/50 * 50/(100*3))
46.666666666667
4/5 * 60 * (1 + 50/60 * 50/(100*3))
54.666666666667
2/5 * 20 * (1 + 50/20 * 50/(100*3))
11.333333333333
240079 112.66666666667
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
240210 45
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
240227 45
5/5 * 50 * (1 + 50/50 * 50/(100*1))
3.7054923438093E-322
240249 3.7054923438093E-322
5/5 * 50 * (1 + 50/50 * 50/(100*1))
3.7054923438093E-322
240273 3.7054923438093E-322
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
240333 30
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
240335 60
4/5 * 30 * (1 + 50/30 * 50/(100*2))
34
5/5 * 50 * (1 + 50/50 * 50/(100*2))
62.5
300024 96.5
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310001 45
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310025 45
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
310034 60
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
310042 30
5/5 * 50 * (1 + 50/50 * 50/(100*1))
3.7054923438093E-322
310111 3.7054923438093E-322
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310191 45
5/5 * 50 * (1 + 50/50 * 50/(100*1))
3.7054923438093E-322
310219 3.7054923438093E-322
1/5 * 50 * (1 + 50/50 * 50/(100*1))
15
310236 15
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310322 45
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
310356 30
3/5 * 50 * (1 + 50/50 * 50/(100*2))
37.5
-2.5/5 * 20 * (1 + 50/20 * 50/(100*2))
-16.25
310360 21.25
1/5 * 50 * (1 + 50/50 * 50/(100*2))
12.5
2/5 * 30 * (1 + 50/30 * 50/(100*2))
17
310394 29.5
5/5 * 50 * (1 + 50/50 * 50/(100*1))
3.7054923438093E-322
310405 3.7054923438093E-322
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
310411 60
```
But I expected this output instead:
```
RIGHT RESULTS WHEN opcache.jit=1251
/usr/bin/php -d opcache.enable_cli=1 -d opcache.jit=1251 0.test.php'
49 0
2/5 * 20 * (1 + 50/20 * 50/(100*1))
18
1080 18
5/5 * 50 * (1 + 50/50 * 50/(100*2))
62.5
-2.5/5 * 50 * (1 + 50/50 * 50/(100*2))
-31.25
4415 31.25
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4763 75
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4926 75
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
4933 60
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4935 75
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4938 75
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4939 75
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
4947 60
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
4952 45
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
4953 75
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
4962 60
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
8558 45
5/5 * 20 * (1 + 50/20 * 50/(100*1))
45
14888 45
-1/5 * 20 * (1 + 50/20 * 50/(100*2))
-6.5
3/5 * 20 * (1 + 50/20 * 50/(100*2))
19.5
16879 13
0/5 * 50 * (1 + 50/50 * 50/(100*1))
0
100003 0
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
100007 60
0/5 * 50 * (1 + 50/50 * 50/(100*1))
0
100013 0
4/5 * 20 * (1 + 50/20 * 50/(100*2))
26
-2/5 * 20 * (1 + 50/20 * 50/(100*2))
-13
100017 13
1/5 * 50 * (1 + 50/50 * 50/(100*1))
15
100019 15
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
100027 45
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
100031 30
-2.5/5 * 50 * (1 + 50/50 * 50/(100*1))
-37.5
106427 -37.5
-1/5 * 20 * (1 + 50/20 * 50/(100*1))
-9
217955 -9
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
240000 30
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
240010 60
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
240021 45
4/5 * 50 * (1 + 50/50 * 50/(100*3))
46.666666666667
4/5 * 60 * (1 + 50/60 * 50/(100*3))
54.666666666667
2/5 * 20 * (1 + 50/20 * 50/(100*3))
11.333333333333
240079 112.66666666667
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
240210 45
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
240227 45
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
240249 75
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
240273 75
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
240333 30
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
240335 60
4/5 * 30 * (1 + 50/30 * 50/(100*2))
34
5/5 * 50 * (1 + 50/50 * 50/(100*2))
62.5
300024 96.5
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310001 45
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310025 45
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
310034 60
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
310042 30
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
310111 75
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310191 45
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
310219 75
1/5 * 50 * (1 + 50/50 * 50/(100*1))
15
310236 15
3/5 * 50 * (1 + 50/50 * 50/(100*1))
45
310322 45
2/5 * 50 * (1 + 50/50 * 50/(100*1))
30
310356 30
3/5 * 50 * (1 + 50/50 * 50/(100*2))
37.5
-2.5/5 * 20 * (1 + 50/20 * 50/(100*2))
-16.25
310360 21.25
1/5 * 50 * (1 + 50/50 * 50/(100*2))
12.5
2/5 * 30 * (1 + 50/30 * 50/(100*2))
17
310394 29.5
5/5 * 50 * (1 + 50/50 * 50/(100*1))
75
310405 75
4/5 * 50 * (1 + 50/50 * 50/(100*1))
60
310411 60
```
### PHP Version
```plain
PHP 8.4.16 (cli) (built: Dec 16 2025 16:03:34) (NTS gcc x86_64)
Copyright (c) The PHP Group
Built by Fedora Project
Zend Engine v4.4.16, Copyright (c) Zend Technologies
with Zend OPcache v8.4.16, Copyright (c), by Zend Technologies
```
### Operating System
Fedora 42 Linux 6.14.2-300.fc42.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Apr 10 21:50:55 UTC 2025 x86_64 GNU/Linux