Skip to content

Commit cd45bd0

Browse files
committed
JIT: Fixed incorrect code generation for JMPZ
1 parent c69ffa8 commit cd45bd0

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,13 +1638,6 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
16381638
break;
16391639
case ZEND_JMPZ:
16401640
case ZEND_JMPNZ:
1641-
if (/*opline > op_array->opcodes + ssa->cfg.blocks[b].start && ??? */
1642-
opline->op1_type == IS_TMP_VAR &&
1643-
((opline-1)->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
1644-
/* smart branch */
1645-
break;
1646-
}
1647-
/* break missing intentionally */
16481641
case ZEND_JMPZNZ:
16491642
case ZEND_JMPZ_EX:
16501643
case ZEND_JMPNZ_EX:
@@ -5003,13 +4996,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
50034996
goto done;
50044997
case ZEND_JMPZ:
50054998
case ZEND_JMPNZ:
5006-
if (/*opline > op_array->opcodes + ssa->cfg.blocks[b].start && ??? */
5007-
opline->op1_type == IS_TMP_VAR &&
5008-
((opline-1)->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
5009-
/* smart branch */
5010-
break;
5011-
}
5012-
/* break missing intentionally */
50134999
case ZEND_JMPZNZ:
50145000
case ZEND_JMPZ_EX:
50155001
case ZEND_JMPNZ_EX:

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15465,10 +15465,20 @@ static zend_bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zen
1546515465
case ZEND_POST_DEC:
1546615466
op1_info = OP1_INFO();
1546715467
return opline->op1_type == IS_CV && !(op1_info & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - MAY_BE_LONG));
15468-
case ZEND_BOOL:
15469-
case ZEND_BOOL_NOT:
1547015468
case ZEND_JMPZ:
1547115469
case ZEND_JMPNZ:
15470+
if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
15471+
if (!ssa->cfg.map) {
15472+
return 0;
15473+
}
15474+
if (opline > op_array->opcodes + ssa->cfg.blocks[ssa->cfg.map[opline-op_array->opcodes]].start &&
15475+
((opline-1)->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) {
15476+
return 0;
15477+
}
15478+
}
15479+
/* break missing intentionally */
15480+
case ZEND_BOOL:
15481+
case ZEND_BOOL_NOT:
1547215482
case ZEND_JMPZNZ:
1547315483
case ZEND_JMPZ_EX:
1547415484
case ZEND_JMPNZ_EX:

ext/opcache/tests/jit/jmpz_002.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
JIT JMPZ: Separate JMPZ for "smart branch" may be only emitted by function JIT
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
opcache.protect_memory=1
9+
--FILE--
10+
<?php
11+
function test($b) {
12+
if ($b ? 0 : (X>0)){
13+
echo "Not taken\n";
14+
}
15+
}
16+
test(true);
17+
?>
18+
DONE
19+
--EXPECT--
20+
DONE

0 commit comments

Comments
 (0)