Skip to content

Commit 87ea3c1

Browse files
committed
Voidify zend_ssa_unlink_use_chain()
It always returned 1 or threw an assertion failure Also drop else branch by moving it to the main scope
1 parent 35dfdd9 commit 87ea3c1

File tree

3 files changed

+113
-116
lines changed

3 files changed

+113
-116
lines changed

Zend/Optimizer/dfa_pass.c

Lines changed: 84 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1273,24 +1273,23 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
12731273
// op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP
12741274

12751275
int orig_var = ssa->ops[op_1].op1_use;
1276-
if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
1276+
zend_ssa_unlink_use_chain(ssa, op_1, orig_var);
12771277

1278-
int ret = ssa->vars[v].use_chain;
1279-
if (ret >= 0) {
1280-
ssa->ops[ret].op1_use = orig_var;
1281-
ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
1282-
ssa->vars[orig_var].use_chain = ret;
1283-
}
1278+
int ret = ssa->vars[v].use_chain;
1279+
if (ret >= 0) {
1280+
ssa->ops[ret].op1_use = orig_var;
1281+
ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
1282+
ssa->vars[orig_var].use_chain = ret;
1283+
}
12841284

1285-
ssa->vars[v].definition = -1;
1286-
ssa->vars[v].use_chain = -1;
1285+
ssa->vars[v].definition = -1;
1286+
ssa->vars[v].use_chain = -1;
12871287

1288-
ssa->ops[op_1].op1_def = -1;
1289-
ssa->ops[op_1].op1_use = -1;
1288+
ssa->ops[op_1].op1_def = -1;
1289+
ssa->ops[op_1].op1_use = -1;
12901290

1291-
MAKE_NOP(opline);
1292-
remove_nops = 1;
1293-
}
1291+
MAKE_NOP(opline);
1292+
remove_nops = 1;
12941293
}
12951294
}
12961295

@@ -1322,7 +1321,8 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
13221321
// op_2: #src_var.T = OP ... => #v.CV = OP ...
13231322
// op_1: QM_ASSIGN #src_var.T #orig_var.CV [undef,scalar] -> #v.CV, NOP
13241323

1325-
if (orig_var < 0 || zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
1324+
if (orig_var < 0) {
1325+
zend_ssa_unlink_use_chain(ssa, op_1, orig_var);
13261326
/* Reconstruct SSA */
13271327
ssa->vars[v].definition = op_2;
13281328
ssa->ops[op_2].result_def = v;
@@ -1476,80 +1476,79 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
14761476
// op_2: #src_var.T = OP ... => #v.CV = OP ...
14771477
// op_1: ASSIGN #orig_var.CV [undef,scalar] -> #v.CV, #src_var.T NOP
14781478

1479-
if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
1480-
/* Reconstruct SSA */
1481-
ssa->vars[v].definition = op_2;
1482-
ssa->ops[op_2].result_def = v;
1479+
zend_ssa_unlink_use_chain(ssa, op_1, orig_var);
1480+
/* Reconstruct SSA */
1481+
ssa->vars[v].definition = op_2;
1482+
ssa->ops[op_2].result_def = v;
14831483

1484-
ssa->vars[src_var].definition = -1;
1485-
ssa->vars[src_var].use_chain = -1;
1484+
ssa->vars[src_var].definition = -1;
1485+
ssa->vars[src_var].use_chain = -1;
14861486

1487-
ssa->ops[op_1].op1_use = -1;
1488-
ssa->ops[op_1].op2_use = -1;
1489-
ssa->ops[op_1].op1_def = -1;
1490-
ssa->ops[op_1].op1_use_chain = -1;
1487+
ssa->ops[op_1].op1_use = -1;
1488+
ssa->ops[op_1].op2_use = -1;
1489+
ssa->ops[op_1].op1_def = -1;
1490+
ssa->ops[op_1].op1_use_chain = -1;
14911491

1492-
/* Update opcodes */
1493-
op_array->opcodes[op_2].result_type = opline->op1_type;
1494-
op_array->opcodes[op_2].result.var = opline->op1.var;
1492+
/* Update opcodes */
1493+
op_array->opcodes[op_2].result_type = opline->op1_type;
1494+
op_array->opcodes[op_2].result.var = opline->op1.var;
14951495

1496-
MAKE_NOP(opline);
1497-
remove_nops = 1;
1498-
1499-
if (op_array->opcodes[op_2].opcode == ZEND_SUB
1500-
&& op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type
1501-
&& op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var
1502-
&& op_array->opcodes[op_2].op2_type == IS_CONST
1503-
&& Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG
1504-
&& Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1
1505-
&& ssa->ops[op_2].op1_use >= 0
1506-
&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
1507-
1508-
op_array->opcodes[op_2].opcode = ZEND_PRE_DEC;
1509-
SET_UNUSED(op_array->opcodes[op_2].op2);
1510-
SET_UNUSED(op_array->opcodes[op_2].result);
1511-
1512-
ssa->ops[op_2].result_def = -1;
1513-
ssa->ops[op_2].op1_def = v;
1514-
1515-
} else if (op_array->opcodes[op_2].opcode == ZEND_ADD
1516-
&& op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type
1517-
&& op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var
1518-
&& op_array->opcodes[op_2].op2_type == IS_CONST
1519-
&& Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG
1520-
&& Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1
1521-
&& ssa->ops[op_2].op1_use >= 0
1522-
&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
1523-
1524-
op_array->opcodes[op_2].opcode = ZEND_PRE_INC;
1525-
SET_UNUSED(op_array->opcodes[op_2].op2);
1526-
SET_UNUSED(op_array->opcodes[op_2].result);
1527-
1528-
ssa->ops[op_2].result_def = -1;
1529-
ssa->ops[op_2].op1_def = v;
1530-
1531-
} else if (op_array->opcodes[op_2].opcode == ZEND_ADD
1532-
&& op_array->opcodes[op_2].op2_type == op_array->opcodes[op_2].result_type
1533-
&& op_array->opcodes[op_2].op2.var == op_array->opcodes[op_2].result.var
1534-
&& op_array->opcodes[op_2].op1_type == IS_CONST
1535-
&& Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == IS_LONG
1536-
&& Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == 1
1537-
&& ssa->ops[op_2].op2_use >= 0
1538-
&& !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
1539-
1540-
op_array->opcodes[op_2].opcode = ZEND_PRE_INC;
1541-
op_array->opcodes[op_2].op1_type = op_array->opcodes[op_2].op2_type;
1542-
op_array->opcodes[op_2].op1.var = op_array->opcodes[op_2].op2.var;
1543-
SET_UNUSED(op_array->opcodes[op_2].op2);
1544-
SET_UNUSED(op_array->opcodes[op_2].result);
1545-
1546-
ssa->ops[op_2].result_def = -1;
1547-
ssa->ops[op_2].op1_def = v;
1548-
ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use;
1549-
ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain;
1550-
ssa->ops[op_2].op2_use = -1;
1551-
ssa->ops[op_2].op2_use_chain = -1;
1552-
}
1496+
MAKE_NOP(opline);
1497+
remove_nops = 1;
1498+
1499+
if (op_array->opcodes[op_2].opcode == ZEND_SUB
1500+
&& op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type
1501+
&& op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var
1502+
&& op_array->opcodes[op_2].op2_type == IS_CONST
1503+
&& Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG
1504+
&& Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1
1505+
&& ssa->ops[op_2].op1_use >= 0
1506+
&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
1507+
1508+
op_array->opcodes[op_2].opcode = ZEND_PRE_DEC;
1509+
SET_UNUSED(op_array->opcodes[op_2].op2);
1510+
SET_UNUSED(op_array->opcodes[op_2].result);
1511+
1512+
ssa->ops[op_2].result_def = -1;
1513+
ssa->ops[op_2].op1_def = v;
1514+
1515+
} else if (op_array->opcodes[op_2].opcode == ZEND_ADD
1516+
&& op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type
1517+
&& op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var
1518+
&& op_array->opcodes[op_2].op2_type == IS_CONST
1519+
&& Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG
1520+
&& Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1
1521+
&& ssa->ops[op_2].op1_use >= 0
1522+
&& !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
1523+
1524+
op_array->opcodes[op_2].opcode = ZEND_PRE_INC;
1525+
SET_UNUSED(op_array->opcodes[op_2].op2);
1526+
SET_UNUSED(op_array->opcodes[op_2].result);
1527+
1528+
ssa->ops[op_2].result_def = -1;
1529+
ssa->ops[op_2].op1_def = v;
1530+
1531+
} else if (op_array->opcodes[op_2].opcode == ZEND_ADD
1532+
&& op_array->opcodes[op_2].op2_type == op_array->opcodes[op_2].result_type
1533+
&& op_array->opcodes[op_2].op2.var == op_array->opcodes[op_2].result.var
1534+
&& op_array->opcodes[op_2].op1_type == IS_CONST
1535+
&& Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == IS_LONG
1536+
&& Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == 1
1537+
&& ssa->ops[op_2].op2_use >= 0
1538+
&& !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
1539+
1540+
op_array->opcodes[op_2].opcode = ZEND_PRE_INC;
1541+
op_array->opcodes[op_2].op1_type = op_array->opcodes[op_2].op2_type;
1542+
op_array->opcodes[op_2].op1.var = op_array->opcodes[op_2].op2.var;
1543+
SET_UNUSED(op_array->opcodes[op_2].op2);
1544+
SET_UNUSED(op_array->opcodes[op_2].result);
1545+
1546+
ssa->ops[op_2].result_def = -1;
1547+
ssa->ops[op_2].op1_def = v;
1548+
ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use;
1549+
ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain;
1550+
ssa->ops[op_2].op2_use = -1;
1551+
ssa->ops[op_2].op2_use_chain = -1;
15531552
}
15541553
} else if (opline->op2_type == IS_CONST
15551554
|| ((opline->op2_type & (IS_TMP_VAR|IS_VAR|IS_CV))

Zend/Optimizer/zend_ssa.c

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,44 +1161,42 @@ ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_
11611161
}
11621162
/* }}} */
11631163

1164-
int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var) /* {{{ */
1164+
void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var) /* {{{ */
11651165
{
11661166
if (ssa->vars[var].use_chain == op) {
11671167
ssa->vars[var].use_chain = zend_ssa_next_use(ssa->ops, var, op);
1168-
return 1;
1169-
} else {
1170-
int use = ssa->vars[var].use_chain;
1168+
return;
1169+
}
1170+
int use = ssa->vars[var].use_chain;
11711171

1172-
while (use >= 0) {
1173-
if (ssa->ops[use].result_use == var) {
1174-
if (ssa->ops[use].res_use_chain == op) {
1175-
ssa->ops[use].res_use_chain = zend_ssa_next_use(ssa->ops, var, op);
1176-
return 1;
1177-
} else {
1178-
use = ssa->ops[use].res_use_chain;
1179-
}
1180-
} else if (ssa->ops[use].op1_use == var) {
1181-
if (ssa->ops[use].op1_use_chain == op) {
1182-
ssa->ops[use].op1_use_chain = zend_ssa_next_use(ssa->ops, var, op);
1183-
return 1;
1184-
} else {
1185-
use = ssa->ops[use].op1_use_chain;
1186-
}
1187-
} else if (ssa->ops[use].op2_use == var) {
1188-
if (ssa->ops[use].op2_use_chain == op) {
1189-
ssa->ops[use].op2_use_chain = zend_ssa_next_use(ssa->ops, var, op);
1190-
return 1;
1191-
} else {
1192-
use = ssa->ops[use].op2_use_chain;
1193-
}
1172+
while (use >= 0) {
1173+
if (ssa->ops[use].result_use == var) {
1174+
if (ssa->ops[use].res_use_chain == op) {
1175+
ssa->ops[use].res_use_chain = zend_ssa_next_use(ssa->ops, var, op);
1176+
return;
11941177
} else {
1195-
break;
1178+
use = ssa->ops[use].res_use_chain;
1179+
}
1180+
} else if (ssa->ops[use].op1_use == var) {
1181+
if (ssa->ops[use].op1_use_chain == op) {
1182+
ssa->ops[use].op1_use_chain = zend_ssa_next_use(ssa->ops, var, op);
1183+
return;
1184+
} else {
1185+
use = ssa->ops[use].op1_use_chain;
1186+
}
1187+
} else if (ssa->ops[use].op2_use == var) {
1188+
if (ssa->ops[use].op2_use_chain == op) {
1189+
ssa->ops[use].op2_use_chain = zend_ssa_next_use(ssa->ops, var, op);
1190+
return;
1191+
} else {
1192+
use = ssa->ops[use].op2_use_chain;
11961193
}
1194+
} else {
1195+
break;
11971196
}
1198-
/* something wrong */
1199-
ZEND_UNREACHABLE();
1200-
return 0;
12011197
}
1198+
/* something wrong */
1199+
ZEND_UNREACHABLE();
12021200
}
12031201
/* }}} */
12041202

Zend/Optimizer/zend_ssa.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ BEGIN_EXTERN_C()
148148
ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa);
149149
ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa);
150150
ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var);
151-
int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var);
151+
void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var);
152152

153153
void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to);
154154
void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op);

0 commit comments

Comments
 (0)