mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Fixed SSA reconstruction
This commit is contained in:
parent
d01453b129
commit
251a5599b4
@ -1213,14 +1213,14 @@ static inline zend_ssa_phi **zend_ssa_next_use_phi_ptr(zend_ssa *ssa, int var, z
|
|||||||
|
|
||||||
/* May be called even if source is not used in the phi (useful when removing uses in a phi
|
/* May be called even if source is not used in the phi (useful when removing uses in a phi
|
||||||
* with multiple identical operands) */
|
* with multiple identical operands) */
|
||||||
static inline void zend_ssa_remove_use_of_phi_source(zend_ssa *ssa, zend_ssa_phi *phi, int source) /* {{{ */
|
static inline void zend_ssa_remove_use_of_phi_source(zend_ssa *ssa, zend_ssa_phi *phi, int source, zend_ssa_phi *next_use_phi) /* {{{ */
|
||||||
{
|
{
|
||||||
zend_ssa_phi **cur = &ssa->vars[source].phi_use_chain;
|
zend_ssa_phi **cur = &ssa->vars[source].phi_use_chain;
|
||||||
while (*cur && *cur != phi) {
|
while (*cur && *cur != phi) {
|
||||||
cur = zend_ssa_next_use_phi_ptr(ssa, source, *cur);
|
cur = zend_ssa_next_use_phi_ptr(ssa, source, *cur);
|
||||||
}
|
}
|
||||||
if (*cur) {
|
if (*cur) {
|
||||||
*cur = zend_ssa_next_use_phi(ssa, source, *cur);
|
*cur = next_use_phi;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
@ -1229,7 +1229,7 @@ static void zend_ssa_remove_uses_of_phi_sources(zend_ssa *ssa, zend_ssa_phi *phi
|
|||||||
{
|
{
|
||||||
int source;
|
int source;
|
||||||
FOREACH_PHI_SOURCE(phi, source) {
|
FOREACH_PHI_SOURCE(phi, source) {
|
||||||
zend_ssa_remove_use_of_phi_source(ssa, phi, source);
|
zend_ssa_remove_use_of_phi_source(ssa, phi, source, zend_ssa_next_use_phi(ssa, source, phi));
|
||||||
} FOREACH_PHI_SOURCE_END();
|
} FOREACH_PHI_SOURCE_END();
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
@ -1289,7 +1289,7 @@ static inline void zend_ssa_remove_phi_source(zend_ssa *ssa, zend_ssa_phi *phi,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Variable only used in one operand, remove the phi from the use chain. */
|
/* Variable only used in one operand, remove the phi from the use chain. */
|
||||||
zend_ssa_remove_use_of_phi_source(ssa, phi, var_num);
|
zend_ssa_remove_use_of_phi_source(ssa, phi, var_num, phi->use_chains[pred_offset]);
|
||||||
phi->use_chains[pred_offset] = NULL;
|
phi->use_chains[pred_offset] = NULL;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
10
ext/opcache/tests/ssa_bug_008.phpt
Normal file
10
ext/opcache/tests/ssa_bug_008.phpt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
--TEST--
|
||||||
|
Incorrect CFG/SSA reconstruction
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
if (!is_int($info = gc_collect_cycles()) || ($info < 100)) {
|
||||||
|
echo gettype($info)."\n";
|
||||||
|
}
|
||||||
|
--EXPECT--
|
||||||
|
integer
|
||||||
|
|
Loading…
Reference in New Issue
Block a user