Skip to content

Commit fad87a2

Browse files
committed
Fixed bug #80742 (Opcache JIT makes some boolean logic unexpectedly be true)
1 parent edb9229 commit fad87a2

File tree

3 files changed

+103
-3
lines changed

3 files changed

+103
-3
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ PHP NEWS
2626
. Fixed bug #80634 (write_property handler of internal classes is skipped on
2727
preloaded JITted code). (Dmitry)
2828
. Fixed bug #80682 (opcache doesn't honour pcre.jit option). (Remi)
29+
. Fixed bug #80742 (Opcache JIT makes some boolean logic unexpectedly be
30+
true). (Dmitry)
2931

3032
- OpenSSL:
3133
. Fixed bug #80747 (Providing RSA key size < 512 generates key that crash

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7138,7 +7138,7 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, z
71387138
break;
71397139
case ZEND_IS_NOT_IDENTICAL:
71407140
if (exit_addr) {
7141-
|1:
7141+
| jp >1
71427142
| je &exit_addr
71437143
|1:
71447144
} else {
@@ -7231,10 +7231,10 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, z
72317231
case ZEND_IS_NOT_EQUAL:
72327232
case ZEND_IS_NOT_IDENTICAL:
72337233
| jp >1
7234-
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
7234+
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
72357235
| je => target_label
72367236
|1:
7237-
| SET_ZVAL_TYPE_INFO res_addr, IS_FALSE
7237+
| SET_ZVAL_TYPE_INFO res_addr, IS_TRUE
72387238
break;
72397239
case ZEND_IS_SMALLER:
72407240
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)