Skip to content

Commit 87beb22

Browse files
committed
Perform trace range propagation
1 parent 8d4774a commit 87beb22

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

ext/opcache/Optimizer/zend_inference.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,6 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int
843843
uint32_t line;
844844
zend_op *opline;
845845
zend_ssa_op *ssa_op;
846-
zend_long op1_min, op2_min, op1_max, op2_max;
847846

848847
if (ssa->vars[var].definition_phi) {
849848
zend_ssa_phi *p = ssa->vars[var].definition_phi;
@@ -984,6 +983,13 @@ int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int
984983
opline = op_array->opcodes + line;
985984
ssa_op = &ssa->ops[line];
986985

986+
return zend_inference_propagate_range(op_array, ssa, opline, ssa_op, var, tmp);
987+
}
988+
989+
int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp)
990+
{
991+
zend_long op1_min, op2_min, op1_max, op2_max;
992+
987993
tmp->underflow = 0;
988994
tmp->overflow = 0;
989995
switch (opline->opcode) {

ext/opcache/Optimizer/zend_inference.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ int zend_ssa_inference(zend_arena **raena, const zend_op_array *op_array, const
257257
uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert);
258258

259259
int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int var, int widening, int narrowing, zend_ssa_range *tmp);
260+
int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp);
260261
void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *ssa, int var, zend_bool underflow, zend_long min, zend_long max, zend_bool overflow);
261262
int zend_inference_narrowing_meet(zend_ssa_var_info *var_info, zend_ssa_range *r);
262263
int zend_inference_widening_meet(zend_ssa_var_info *var_info, zend_ssa_range *r);

ext/opcache/jit/zend_jit_trace.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5270,6 +5270,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
52705270
}
52715271

52725272
if (ssa_op) {
5273+
zend_ssa_range tmp;
5274+
52735275
/* Keep information about known types on abstract stack */
52745276
if (ssa_op->result_def >= 0) {
52755277
zend_uchar type = IS_UNKNOWN;
@@ -5323,6 +5325,15 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53235325
}
53245326
}
53255327
}
5328+
5329+
if (type == IS_LONG
5330+
&& zend_inference_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->result_def, &tmp)) {
5331+
ssa->var_info[ssa_op->result_def].range.min = tmp.min;
5332+
ssa->var_info[ssa_op->result_def].range.max = tmp.max;
5333+
ssa->var_info[ssa_op->result_def].range.underflow = 0;
5334+
ssa->var_info[ssa_op->result_def].range.overflow = 0;
5335+
ssa->var_info[ssa_op->result_def].has_range = 1;
5336+
}
53265337
}
53275338
if (ssa_op->op1_def >= 0) {
53285339
zend_uchar type = IS_UNKNOWN;
@@ -5357,6 +5368,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53575368
ra[ssa_op->op1_def]->flags & ZREG_STORE);
53585369
}
53595370
}
5371+
if (type == IS_LONG
5372+
&& zend_inference_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->op1_def, &tmp)) {
5373+
ssa->var_info[ssa_op->op1_def].range.min = tmp.min;
5374+
ssa->var_info[ssa_op->op1_def].range.max = tmp.max;
5375+
ssa->var_info[ssa_op->op1_def].range.underflow = 0;
5376+
ssa->var_info[ssa_op->op1_def].range.overflow = 0;
5377+
ssa->var_info[ssa_op->op1_def].has_range = 1;
5378+
}
53605379
}
53615380
if (ssa_op->op2_def >= 0) {
53625381
zend_uchar type = IS_UNKNOWN;
@@ -5377,6 +5396,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
53775396
ra[ssa_op->op2_def]->flags & ZREG_STORE);
53785397
}
53795398
}
5399+
if (type == IS_LONG
5400+
&& zend_inference_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->op2_def, &tmp)) {
5401+
ssa->var_info[ssa_op->op2_def].range.min = tmp.min;
5402+
ssa->var_info[ssa_op->op2_def].range.max = tmp.max;
5403+
ssa->var_info[ssa_op->op2_def].range.underflow = 0;
5404+
ssa->var_info[ssa_op->op2_def].range.overflow = 0;
5405+
ssa->var_info[ssa_op->op2_def].has_range = 1;
5406+
}
53805407
}
53815408

53825409
switch (opline->opcode) {
@@ -5412,6 +5439,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
54125439
ra[ssa_op->op1_def]->reg & ZREG_STORE);
54135440
}
54145441
}
5442+
if (type == IS_LONG
5443+
&& zend_inference_propagate_range(op_array, ssa, (zend_op*)opline, (zend_ssa_op*)ssa_op, ssa_op->op1_def, &tmp)) {
5444+
ssa->var_info[ssa_op->op1_def].range.min = tmp.min;
5445+
ssa->var_info[ssa_op->op1_def].range.max = tmp.max;
5446+
ssa->var_info[ssa_op->op1_def].range.underflow = 0;
5447+
ssa->var_info[ssa_op->op1_def].range.overflow = 0;
5448+
ssa->var_info[ssa_op->op1_def].has_range = 1;
5449+
}
54155450
}
54165451
ssa_op++;
54175452
break;

0 commit comments

Comments
 (0)