Skip to content

Commit 319f73e

Browse files
committed
Merge branch 'PHP-8.0'
* PHP-8.0: Fixed bug #80742 (Opcache JIT makes some boolean logic unexpectedly be true)
2 parents 803779e + fad87a2 commit 319f73e

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-3
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7119,7 +7119,7 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, z
71197119
break;
71207120
case ZEND_IS_NOT_IDENTICAL:
71217121
if (exit_addr) {
7122-
|1:
7122+
| jp >1
71237123
| je &exit_addr
71247124
|1:
71257125
} else {
@@ -7212,10 +7212,10 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, z
72127212
case ZEND_IS_NOT_EQUAL:
72137213
case ZEND_IS_NOT_IDENTICAL:
72147214
| jp >1
7215-
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
7215+
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
72167216
| je => target_label
72177217
|1:
7218-
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
7218+
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
72197219
break;
72207220
case ZEND_IS_SMALLER:
72217221
if (swap) {

ext/opcache/tests/jit/bug80742.phpt

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
--TEST--
2+
Bug #80742 (Opcache JIT makes some boolean logic unexpectedly be true)
3+
--FILE--
4+
<?php
5+
6+
function checkGroundState(float $movY, float $dy) : void{
7+
var_dump($movY != $dy, $movY < 0, ($movY != $dy and $movY < 0));
8+
var_dump("wow!");
9+
}
10+
11+
checkGroundState(0, 0);
12+
13+
function eq(float $a, float $b, $c, $d) {
14+
if ($a == $b) {
15+
echo 1;
16+
}
17+
if ($a == $b) {
18+
} else {
19+
echo 2;
20+
}
21+
if ($a != $b) {
22+
echo 3;
23+
}
24+
if ($a != $b) {
25+
} else {
26+
echo 4;
27+
}
28+
if ($a === $b) {
29+
echo 5;
30+
}
31+
if ($a === $b) {
32+
} else {
33+
echo 6;
34+
}
35+
if ($a !== $b) {
36+
echo 7;
37+
}
38+
if ($a !== $b) {
39+
} else {
40+
echo 8;
41+
}
42+
echo "\n";
43+
var_dump(
44+
$a == $b && $c,
45+
$a != $b && $c,
46+
$a === $b && $c,
47+
$a !== $b && $c,);
48+
var_dump(
49+
$a == $b || $d,
50+
$a != $b || $d,
51+
$a === $b || $d,
52+
$a !== $b || $d);
53+
}
54+
eq(3.0, 3.0, true, false);
55+
eq(3.0, 2.0, true, false);
56+
eq(3.0, NAN, true, false);
57+
eq(NAN, NAN, true, false);
58+
--EXPECT--
59+
bool(false)
60+
bool(false)
61+
bool(false)
62+
string(4) "wow!"
63+
1458
64+
bool(true)
65+
bool(false)
66+
bool(true)
67+
bool(false)
68+
bool(true)
69+
bool(false)
70+
bool(true)
71+
bool(false)
72+
2367
73+
bool(false)
74+
bool(true)
75+
bool(false)
76+
bool(true)
77+
bool(false)
78+
bool(true)
79+
bool(false)
80+
bool(true)
81+
2367
82+
bool(false)
83+
bool(true)
84+
bool(false)
85+
bool(true)
86+
bool(false)
87+
bool(true)
88+
bool(false)
89+
bool(true)
90+
2367
91+
bool(false)
92+
bool(true)
93+
bool(false)
94+
bool(true)
95+
bool(false)
96+
bool(true)
97+
bool(false)
98+
bool(true)

0 commit comments

Comments
 (0)