]> granicus.if.org Git - php/commitdiff
Remove result def during jmp_set optimization
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 22 Feb 2019 12:41:47 +0000 (13:41 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 22 Feb 2019 12:41:47 +0000 (13:41 +0100)
ext/opcache/Optimizer/dfa_pass.c
ext/opcache/tests/opt/jmp_001.phpt [new file with mode: 0644]

index d50747eef17b6fd4f20703fad27f0ca5f0c4eea0..8ea96d4bb97947e8ab328070eb01897ed2a91fd6 100644 (file)
@@ -836,6 +836,7 @@ optimize_jmpnz:
                                                        MAKE_NOP(opline);
                                                        removed_ops++;
                                                        take_successor_1(ssa, block_num, block);
+                                                       zend_ssa_remove_result_def(ssa, ssa_op);
                                                        goto optimize_nop;
                                                }
                                        }
diff --git a/ext/opcache/tests/opt/jmp_001.phpt b/ext/opcache/tests/opt/jmp_001.phpt
new file mode 100644 (file)
index 0000000..3ec84ed
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+JMP 001: JMP_SET with constant arg
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.opt_debug_level=0x20000
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+function test() {
+    $var = null;
+    $var = $var ?: test2();
+    return $var;
+}
+?>
+--EXPECTF--
+$_main: ; (lines=1, args=0, vars=0, tmps=0)
+    ; (after optimizer)
+    ; %s:1-8
+L0 (8):     RETURN int(1)
+
+test: ; (lines=4, args=0, vars=1, tmps=1)
+    ; (after optimizer)
+    ; %s:2-6
+L0 (4):     INIT_FCALL_BY_NAME 0 string("test2")
+L1 (4):     V1 = DO_FCALL_BY_NAME
+L2 (4):     CV0($var) = QM_ASSIGN V1
+L3 (5):     RETURN CV0($var)