]> granicus.if.org Git - php/commitdiff
Fix COALESCE jump optimization
authorNikita Popov <nikita.ppv@gmail.com>
Sat, 17 Feb 2018 11:41:57 +0000 (12:41 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Sat, 17 Feb 2018 11:42:21 +0000 (12:42 +0100)
ext/opcache/Optimizer/dfa_pass.c
ext/opcache/tests/jmp_elim_004.phpt [new file with mode: 0644]

index 4a7ba6ba6942107026b99d59a22f6502c68f0d71..9e16a9c55c9e2d47f1edd4b123363c9eac390c8a 100644 (file)
@@ -819,14 +819,12 @@ optimize_jmpnz:
                                                } else {
                                                        zend_ssa_var *var = &ssa->vars[ssa_op->result_def];
                                                        if (var->use_chain < 0 && var->phi_use_chain == NULL) {
-                                                               ssa_op->result_def = -1;
                                                                if (opline->result_type & (IS_TMP_VAR|IS_VAR)) {
                                                                        zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition);
                                                                }
-                                                               zend_ssa_unlink_use_chain(ssa, opline - op_array->opcodes, ssa_op->op1_use);
-                                                               ssa_op->op1_use = -1;
-                                                               ssa_op->op1_use_chain = -1;
                                                                opline->opcode = ZEND_JMP;
+                                                               opline->result_type = IS_UNUSED;
+                                                               zend_ssa_remove_result_def(ssa, ssa_op);
                                                                COPY_NODE(opline->op1, opline->op2);
                                                                take_successor_0(ssa, block_num, block);
                                                                goto optimize_jmp;
diff --git a/ext/opcache/tests/jmp_elim_004.phpt b/ext/opcache/tests/jmp_elim_004.phpt
new file mode 100644 (file)
index 0000000..e31af3d
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Incorrect empty basic block elimination
+--INI--
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--FILE--
+<?php
+
+function test() {
+    $foo = "test";
+    var_dump($foo ?? "default");
+}
+test();
+
+?>
+--EXPECT--
+string(4) "test"