Skip to content

Commit 5a8cdb2

Browse files
committed
Experiment: Estimate opcode sizes
1 parent 6f32e1c commit 5a8cdb2

File tree

14 files changed

+1880
-1276
lines changed

14 files changed

+1880
-1276
lines changed

Zend/Optimizer/block_pass.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
306306
if (src < op_array->opcodes + block->start) {
307307
break;
308308
}
309-
src->result_type = IS_UNUSED;
309+
SET_UNUSED(src->result);
310310
VAR_SOURCE(opline->op1) = NULL;
311311
MAKE_NOP(opline);
312312
++(*opt_count);
@@ -325,7 +325,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
325325
src->opcode != ZEND_FETCH_OBJ_R &&
326326
src->opcode != ZEND_NEW &&
327327
src->opcode != ZEND_FETCH_THIS) {
328-
src->result_type = IS_UNUSED;
328+
SET_UNUSED(src->result);
329329
MAKE_NOP(opline);
330330
++(*opt_count);
331331
if (src->opcode == ZEND_QM_ASSIGN) {
@@ -413,8 +413,8 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
413413
literal_dtor(&ZEND_OP1_LITERAL(opline));
414414
literal_dtor(&ZEND_OP2_LITERAL(opline));
415415
opline->opcode = ZEND_JMP;
416-
opline->op1_type = IS_UNUSED;
417-
opline->op2_type = IS_UNUSED;
416+
SET_UNUSED(opline->op1);
417+
SET_UNUSED(opline->op2);
418418
block->successors_count = 1;
419419
block->successors[0] = target;
420420
}
@@ -538,7 +538,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
538538
}
539539
}
540540
break;
541-
541+
542542
case ZEND_BOOL:
543543
case ZEND_BOOL_NOT:
544544
optimize_bool:
@@ -829,7 +829,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
829829
opline->opcode = ZEND_CAST;
830830
opline->extended_value = IS_STRING;
831831
COPY_NODE(opline->op1, opline->op2);
832-
opline->op2_type = IS_UNUSED;
832+
SET_UNUSED(opline->op2);
833833
opline->op2.var = 0;
834834
++(*opt_count);
835835
} else if (opline->op2_type == IS_CONST &&
@@ -839,7 +839,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
839839
literal_dtor(&ZEND_OP2_LITERAL(opline));
840840
opline->opcode = ZEND_CAST;
841841
opline->extended_value = IS_STRING;
842-
opline->op2_type = IS_UNUSED;
842+
SET_UNUSED(opline->op2);
843843
opline->op2.var = 0;
844844
++(*opt_count);
845845
} else if (opline->opcode == ZEND_CONCAT &&
@@ -902,6 +902,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
902902
if (zend_optimizer_eval_unary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
903903
literal_dtor(&ZEND_OP1_LITERAL(opline));
904904
opline->opcode = ZEND_QM_ASSIGN;
905+
SET_UNUSED(opline->op2);
905906
zend_optimizer_update_op1_const(op_array, opline, &result);
906907
++(*opt_count);
907908
}
@@ -916,6 +917,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
916917
if (zend_optimizer_eval_cast(&result, opline->extended_value, &ZEND_OP1_LITERAL(opline)) == SUCCESS) {
917918
literal_dtor(&ZEND_OP1_LITERAL(opline));
918919
opline->opcode = ZEND_QM_ASSIGN;
920+
SET_UNUSED(opline->op2);
919921
opline->extended_value = 0;
920922
zend_optimizer_update_op1_const(op_array, opline, &result);
921923
++(*opt_count);
@@ -1614,7 +1616,7 @@ static void zend_t_usage(zend_cfg *cfg, zend_op_array *op_array, zend_bitset use
16141616
case ZEND_DO_ICALL:
16151617
case ZEND_DO_UCALL:
16161618
case ZEND_DO_FCALL_BY_NAME:
1617-
opline->result_type = IS_UNUSED;
1619+
SET_UNUSED(opline->result);
16181620
break;
16191621
case ZEND_POST_INC:
16201622
case ZEND_POST_DEC:
@@ -1623,7 +1625,7 @@ static void zend_t_usage(zend_cfg *cfg, zend_op_array *op_array, zend_bitset use
16231625
case ZEND_POST_INC_STATIC_PROP:
16241626
case ZEND_POST_DEC_STATIC_PROP:
16251627
opline->opcode -= 2;
1626-
opline->result_type = IS_UNUSED;
1628+
SET_UNUSED(opline->result);
16271629
break;
16281630
case ZEND_QM_ASSIGN:
16291631
case ZEND_BOOL:

Zend/Optimizer/dce.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,7 @@ static bool try_remove_var_def(context *ctx, int free_var, int use_chain, zend_o
377377
case ZEND_YIELD:
378378
case ZEND_YIELD_FROM:
379379
case ZEND_ASSERT_CHECK:
380-
def_opline->result_type = IS_UNUSED;
381-
def_opline->result.var = 0;
380+
SET_UNUSED(def_opline->result);
382381
def_op->result_def = -1;
383382
var->definition = -1;
384383
return 1;

Zend/Optimizer/dfa_pass.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
801801
if (ssa->vars[ssa_op->result_def].use_chain < 0
802802
&& ssa->vars[ssa_op->result_def].phi_use_chain == NULL) {
803803
opline->opcode = ZEND_JMPZ;
804-
opline->result_type = IS_UNUSED;
804+
SET_UNUSED(opline->result);
805805
zend_ssa_remove_result_def(ssa, ssa_op);
806806
goto optimize_jmpz;
807807
} else if (opline->op1_type == IS_CONST) {
@@ -815,7 +815,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
815815
if (ssa->vars[ssa_op->result_def].use_chain < 0
816816
&& ssa->vars[ssa_op->result_def].phi_use_chain == NULL) {
817817
opline->opcode = ZEND_JMPNZ;
818-
opline->result_type = IS_UNUSED;
818+
SET_UNUSED(opline->result);
819819
zend_ssa_remove_result_def(ssa, ssa_op);
820820
goto optimize_jmpnz;
821821
} else if (opline->op1_type == IS_CONST) {
@@ -829,7 +829,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
829829
if (ssa->vars[ssa_op->result_def].use_chain < 0
830830
&& ssa->vars[ssa_op->result_def].phi_use_chain == NULL) {
831831
opline->opcode = ZEND_JMPNZ;
832-
opline->result_type = IS_UNUSED;
832+
SET_UNUSED(opline->result);
833833
zend_ssa_remove_result_def(ssa, ssa_op);
834834
goto optimize_jmpnz;
835835
} else if (opline->op1_type == IS_CONST) {
@@ -855,7 +855,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
855855
goto optimize_nop;
856856
} else {
857857
opline->opcode = ZEND_JMP;
858-
opline->result_type = IS_UNUSED;
858+
SET_UNUSED(opline->result);
859859
zend_ssa_remove_result_def(ssa, ssa_op);
860860
COPY_NODE(opline->op1, opline->op2);
861861
take_successor_0(ssa, block_num, block);
@@ -871,7 +871,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
871871
&& var->use_chain < 0 && var->phi_use_chain == NULL) {
872872
if (Z_TYPE_P(CT_CONSTANT_EX(op_array, opline->op1.constant)) == IS_NULL) {
873873
opline->opcode = ZEND_JMP;
874-
opline->result_type = IS_UNUSED;
874+
SET_UNUSED(opline->result);
875875
zend_ssa_remove_result_def(ssa, ssa_op);
876876
COPY_NODE(opline->op1, opline->op2);
877877
take_successor_0(ssa, block_num, block);
@@ -1000,8 +1000,7 @@ static bool zend_dfa_try_to_replace_result(zend_op_array *op_array, zend_ssa *ss
10001000
ssa->vars[result_var].use_chain = -1;
10011001
ssa->ops[def].result_def = -1;
10021002

1003-
op_array->opcodes[def].result_type = IS_UNUSED;
1004-
op_array->opcodes[def].result.var = 0;
1003+
SET_UNUSED(op_array->opcodes[def].result);
10051004

10061005
if (ssa->ops[use].op1_use == result_var) {
10071006
ssa->ops[use].op1_use = cv_var;
@@ -1167,8 +1166,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
11671166
opline->opcode = ZEND_QM_ASSIGN;
11681167
opline->op1_type = opline->op2_type;
11691168
opline->op1.var = opline->op2.var;
1170-
opline->op2_type = IS_UNUSED;
1171-
opline->op2.num = 0;
1169+
SET_UNUSED(opline->op2);
11721170
ssa->ops[op_1].op1_use = ssa->ops[op_1].op2_use;
11731171
ssa->ops[op_1].op1_use_chain = ssa->ops[op_1].op2_use_chain;
11741172
ssa->ops[op_1].op2_use = -1;
@@ -1216,8 +1214,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
12161214
// op_1: #v.? = ADD #?.? [double,long], 0 => #v.? = QM_ASSIGN #?.?
12171215

12181216
opline->opcode = ZEND_QM_ASSIGN;
1219-
opline->op2_type = IS_UNUSED;
1220-
opline->op2.num = 0;
1217+
SET_UNUSED(opline->op2);
12211218
}
12221219
} else if (opline->opcode == ZEND_MUL
12231220
&& (OP1_INFO() & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_LONG|MAY_BE_DOUBLE))) == 0) {
@@ -1587,8 +1584,7 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
15871584
opline->result.var = opline->op1.var;
15881585
opline->op1_type = opline->op2_type;
15891586
opline->op1.var = opline->op2.var;
1590-
opline->op2_type = IS_UNUSED;
1591-
opline->op2.var = 0;
1587+
SET_UNUSED(opline->op2);
15921588
opline->opcode = ZEND_QM_ASSIGN;
15931589
}
15941590
}

Zend/Optimizer/pass1.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
236236
opline->opcode = ZEND_DECLARE_CONST;
237237
opline->op1_type = IS_CONST;
238238
opline->op2_type = IS_CONST;
239-
opline->result_type = IS_UNUSED;
239+
SET_UNUSED(opline->result);
240240
opline->op1.constant = send1_opline->op1.constant;
241241
opline->op2.constant = send2_opline->op1.constant;
242242
opline->result.num = 0;
@@ -321,7 +321,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
321321
should_jmp = !should_jmp;
322322
}
323323
literal_dtor(&ZEND_OP1_LITERAL(opline));
324-
opline->op1_type = IS_UNUSED;
324+
SET_UNUSED(opline->op1);
325325
if (should_jmp) {
326326
opline->opcode = ZEND_JMP;
327327
COPY_NODE(opline->op1, opline->op2);

Zend/Optimizer/sccp.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,7 +2134,7 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var,
21342134
if (opline->opcode == ZEND_ASSIGN) {
21352135
/* We can't drop the ASSIGN, but we can remove the result. */
21362136
if (var->use_chain < 0 && var->phi_use_chain == NULL) {
2137-
opline->result_type = IS_UNUSED;
2137+
SET_UNUSED(opline->result);
21382138
zend_ssa_remove_result_def(ssa, ssa_op);
21392139
}
21402140
return 0;
@@ -2165,7 +2165,7 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var,
21652165
case ZEND_YIELD:
21662166
case ZEND_YIELD_FROM:
21672167
case ZEND_ASSERT_CHECK:
2168-
opline->result_type = IS_UNUSED;
2168+
SET_UNUSED(opline->result);
21692169
zend_ssa_remove_result_def(ssa, ssa_op);
21702170
break;
21712171
default:
@@ -2237,7 +2237,7 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var,
22372237
* operand, based on type inference information. Make sure the operand is
22382238
* freed and leave further cleanup to DCE. */
22392239
opline->opcode = ZEND_FREE;
2240-
opline->result_type = IS_UNUSED;
2240+
SET_UNUSED(opline->result);
22412241
removed_ops++;
22422242
} else {
22432243
return 0;
@@ -2305,7 +2305,7 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var,
23052305
if (ssa->vars[ssa_op->result_def].use_chain < 0
23062306
&& ssa->vars[ssa_op->result_def].phi_use_chain == NULL) {
23072307
zend_ssa_remove_result_def(ssa, ssa_op);
2308-
opline->result_type = IS_UNUSED;
2308+
SET_UNUSED(opline->result);
23092309
} else if (opline->opcode != ZEND_PRE_INC &&
23102310
opline->opcode != ZEND_PRE_DEC) {
23112311
/* op1_def and result_def are different */

Zend/zend_compile.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2708,7 +2708,7 @@ void zend_emit_final_return(bool return_one) /* {{{ */
27082708
}
27092709

27102710
ret = zend_emit_op(NULL, returns_reference ? ZEND_RETURN_BY_REF : ZEND_RETURN, &zn, NULL);
2711-
ret->extended_value = -1;
2711+
ret->extended_value = 0;
27122712
}
27132713
/* }}} */
27142714

@@ -3051,7 +3051,7 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t
30513051
zend_ast *dim_ast = ast->child[1];
30523052
zend_op *opline;
30533053

3054-
znode var_node, dim_node;
3054+
znode var_node, dim_node = {0};
30553055

30563056
if (is_globals_fetch(var_ast)) {
30573057
if (dim_ast == NULL) {
@@ -3121,7 +3121,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t
31213121
zend_ast *obj_ast = ast->child[0];
31223122
zend_ast *prop_ast = ast->child[1];
31233123

3124-
znode obj_node, prop_node;
3124+
znode obj_node = {0}, prop_node;
31253125
zend_op *opline;
31263126
bool nullsafe = ast->kind == ZEND_AST_NULLSAFE_PROP;
31273127

@@ -5236,7 +5236,7 @@ static void zend_compile_method_call(znode *result, zend_ast *ast, uint32_t type
52365236
zend_ast *method_ast = ast->child[1];
52375237
zend_ast *args_ast = ast->child[2];
52385238

5239-
znode obj_node, method_node;
5239+
znode obj_node = {0}, method_node;
52405240
zend_op *opline;
52415241
zend_function *fbc = NULL;
52425242
bool nullsafe = ast->kind == ZEND_AST_NULLSAFE_METHOD_CALL;
@@ -5349,6 +5349,7 @@ static void zend_compile_static_call(znode *result, zend_ast *ast, uint32_t type
53495349
if (zend_is_constructor(Z_STR_P(name))) {
53505350
zval_ptr_dtor(name);
53515351
method_node.op_type = IS_UNUSED;
5352+
method_node.u.op.num = 0;
53525353
}
53535354
}
53545355

@@ -7782,7 +7783,7 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32
77827783

77837784
CG(zend_lineno) = param_ast->lineno;
77847785

7785-
znode var_node, default_node;
7786+
znode var_node, default_node = {0};
77867787
uint8_t opcode;
77877788
zend_op *opline;
77887789
zend_arg_info *arg_info;
@@ -11221,7 +11222,7 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
1122111222
uint32_t i, j;
1122211223
uint32_t rope_init_lineno = -1;
1122311224
zend_op *opline = NULL, *init_opline;
11224-
znode elem_node, last_const_node;
11225+
znode elem_node, last_const_node = {0};
1122511226
zend_ast_list *list = zend_ast_get_list(ast);
1122611227
uint32_t reserved_op_number = -1;
1122711228

Zend/zend_compile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
#define SET_UNUSED(op) do { \
3737
op ## _type = IS_UNUSED; \
38-
op.num = (uint32_t) -1; \
38+
op.num = 0; \
3939
} while (0)
4040

4141
#define MAKE_NOP(opline) do { \

0 commit comments

Comments
 (0)