Replace conditions, that should be always true, by ZEND_ASSERT()

This commit is contained in:
Dmitry Stogov 2017-07-11 11:57:33 +03:00
parent 9915b1f5cd
commit 4872d139b5
4 changed files with 43 additions and 41 deletions

View file

@ -1192,13 +1192,14 @@ static void sccp_visit_phi(scdf_ctx *scdf, zend_ssa_phi *phi) {
MAKE_TOP(&result); MAKE_TOP(&result);
SCP_DEBUG("Handling PHI("); SCP_DEBUG("Handling PHI(");
if (phi->pi >= 0) { if (phi->pi >= 0) {
if (phi->sources[0] >= 0 && scdf_is_edge_feasible(scdf, phi->pi, phi->block)) { ZEND_ASSERT(phi->sources[0] >= 0);
if (scdf_is_edge_feasible(scdf, phi->pi, phi->block)) {
join_phi_values(&result, &ctx->values[phi->sources[0]]); join_phi_values(&result, &ctx->values[phi->sources[0]]);
} }
} else { } else {
for (i = 0; i < block->predecessors_count; i++) { for (i = 0; i < block->predecessors_count; i++) {
if (phi->sources[i] >= 0 ZEND_ASSERT(phi->sources[i] >= 0);
&& scdf_is_edge_feasible(scdf, predecessors[i], phi->block)) { if (scdf_is_edge_feasible(scdf, predecessors[i], phi->block)) {
SCP_DEBUG("val, "); SCP_DEBUG("val, ");
join_phi_values(&result, &ctx->values[phi->sources[i]]); join_phi_values(&result, &ctx->values[phi->sources[i]]);
} else { } else {

View file

@ -282,7 +282,8 @@ int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ss
} }
} else { } else {
for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) { for (j = 0; j < ssa->cfg.blocks[p->block].predecessors_count; j++) {
if (p->sources[j] >= 0 && ssa->vars[p->sources[j]].no_val) { ZEND_ASSERT(p->sources[j] >= 0);
if (ssa->vars[p->sources[j]].no_val) {
ssa_vars[p->sources[j]].no_val = 0; /* used indirectly */ ssa_vars[p->sources[j]].no_val = 0; /* used indirectly */
zend_bitset_incl(worklist, p->sources[j]); zend_bitset_incl(worklist, p->sources[j]);
} }
@ -854,7 +855,8 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int
} }
} else { } else {
for (i = 0; i < ssa->cfg.blocks[p->block].predecessors_count; i++) { for (i = 0; i < ssa->cfg.blocks[p->block].predecessors_count; i++) {
if (p->sources[i] >= 0 && ssa->var_info[p->sources[i]].has_range) { ZEND_ASSERT(p->sources[i] >= 0);
if (ssa->var_info[p->sources[i]].has_range) {
/* union */ /* union */
tmp->underflow |= ssa->var_info[p->sources[i]].range.underflow; tmp->underflow |= ssa->var_info[p->sources[i]].range.underflow;
tmp->min = MIN(tmp->min, ssa->var_info[p->sources[i]].range.min); tmp->min = MIN(tmp->min, ssa->var_info[p->sources[i]].range.min);
@ -3328,17 +3330,18 @@ int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script
} }
UPDATE_SSA_TYPE(tmp, j); UPDATE_SSA_TYPE(tmp, j);
for (i = 0; i < blocks[p->block].predecessors_count; i++) { for (i = 0; i < blocks[p->block].predecessors_count; i++) {
if (p->sources[i] >= 0) { zend_ssa_var_info *info;
zend_ssa_var_info *info = &ssa_var_info[p->sources[i]];
if (info->type & MAY_BE_OBJECT) { ZEND_ASSERT(p->sources[i] >= 0);
if (first) { info = &ssa_var_info[p->sources[i]];
ce = info->ce; if (info->type & MAY_BE_OBJECT) {
is_instanceof = info->is_instanceof; if (first) {
first = 0; ce = info->ce;
} else { is_instanceof = info->is_instanceof;
is_instanceof |= info->is_instanceof; first = 0;
ce = join_class_entries(ce, info->ce, &is_instanceof); } else {
} is_instanceof |= info->is_instanceof;
ce = join_class_entries(ce, info->ce, &is_instanceof);
} }
} }
} }

View file

@ -1061,15 +1061,16 @@ int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_
ssa_vars[phi->ssa_var].var = phi->var; ssa_vars[phi->ssa_var].var = phi->var;
ssa_vars[phi->ssa_var].definition_phi = phi; ssa_vars[phi->ssa_var].definition_phi = phi;
if (phi->pi >= 0) { if (phi->pi >= 0) {
if (phi->sources[0] >= 0) { zend_ssa_phi *p;
zend_ssa_phi *p = ssa_vars[phi->sources[0]].phi_use_chain;
while (p && p != phi) { ZEND_ASSERT(phi->sources[0] >= 0);
p = zend_ssa_next_use_phi(ssa, phi->sources[0], p); p = ssa_vars[phi->sources[0]].phi_use_chain;
} while (p && p != phi) {
if (!p) { p = zend_ssa_next_use_phi(ssa, phi->sources[0], p);
phi->use_chains[0] = ssa_vars[phi->sources[0]].phi_use_chain; }
ssa_vars[phi->sources[0]].phi_use_chain = phi; if (!p) {
} phi->use_chains[0] = ssa_vars[phi->sources[0]].phi_use_chain;
ssa_vars[phi->sources[0]].phi_use_chain = phi;
} }
if (phi->has_range_constraint) { if (phi->has_range_constraint) {
/* min and max variables can't be used together */ /* min and max variables can't be used together */
@ -1086,15 +1087,16 @@ int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_
int j; int j;
for (j = 0; j < ssa->cfg.blocks[i].predecessors_count; j++) { for (j = 0; j < ssa->cfg.blocks[i].predecessors_count; j++) {
if (phi->sources[j] >= 0) { zend_ssa_phi *p;
zend_ssa_phi *p = ssa_vars[phi->sources[j]].phi_use_chain;
while (p && p != phi) { ZEND_ASSERT(phi->sources[j] >= 0);
p = zend_ssa_next_use_phi(ssa, phi->sources[j], p); p = ssa_vars[phi->sources[j]].phi_use_chain;
} while (p && p != phi) {
if (!p) { p = zend_ssa_next_use_phi(ssa, phi->sources[j], p);
phi->use_chains[j] = ssa_vars[phi->sources[j]].phi_use_chain; }
ssa_vars[phi->sources[j]].phi_use_chain = phi; if (!p) {
} phi->use_chains[j] = ssa_vars[phi->sources[j]].phi_use_chain;
ssa_vars[phi->sources[j]].phi_use_chain = phi;
} }
} }
} }
@ -1315,9 +1317,6 @@ void zend_ssa_remove_uses_of_var(zend_ssa *ssa, int var_num) /* {{{ */
int i, end = NUM_PHI_SOURCES(phi); int i, end = NUM_PHI_SOURCES(phi);
for (i = 0; i < end; i++) { for (i = 0; i < end; i++) {
if (phi->sources[i] == var_num) { if (phi->sources[i] == var_num) {
#if 0
phi->sources[i] = -1;
#endif
phi->use_chains[i] = NULL; phi->use_chains[i] = NULL;
} }
} }
@ -1395,9 +1394,8 @@ void zend_ssa_remove_block(zend_op_array *op_array, zend_ssa *ssa, int i) /* {{{
zend_ssa_remove_phi(ssa, phi); zend_ssa_remove_phi(ssa, phi);
} }
} else { } else {
if (phi->sources[pred_offset] >= 0) { ZEND_ASSERT(phi->sources[pred_offset] >= 0);
zend_ssa_remove_phi_source(ssa, phi, pred_offset, next_block->predecessors_count); zend_ssa_remove_phi_source(ssa, phi, pred_offset, next_block->predecessors_count);
}
} }
} }

View file

@ -240,7 +240,7 @@ static zend_always_inline zend_bool zend_ssa_is_no_val_use(const zend_op *opline
zend_ssa_phi *_phi = (phi); \ zend_ssa_phi *_phi = (phi); \
int _i, _end = NUM_PHI_SOURCES(phi); \ int _i, _end = NUM_PHI_SOURCES(phi); \
for (_i = 0; _i < _end; _i++) { \ for (_i = 0; _i < _end; _i++) { \
if (_phi->sources[_i] < 0) continue; \ ZEND_ASSERT(_phi->sources[_i] >= 0); \
source = _phi->sources[_i]; source = _phi->sources[_i];
#define FOREACH_PHI_SOURCE_END() \ #define FOREACH_PHI_SOURCE_END() \
} \ } \