@@ -5270,6 +5270,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5270
5270
}
5271
5271
5272
5272
if (ssa_op ) {
5273
+ zend_ssa_range tmp ;
5274
+
5273
5275
/* Keep information about known types on abstract stack */
5274
5276
if (ssa_op -> result_def >= 0 ) {
5275
5277
zend_uchar type = IS_UNKNOWN ;
@@ -5323,6 +5325,15 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5323
5325
}
5324
5326
}
5325
5327
}
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
+ }
5326
5337
}
5327
5338
if (ssa_op -> op1_def >= 0 ) {
5328
5339
zend_uchar type = IS_UNKNOWN ;
@@ -5357,6 +5368,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5357
5368
ra [ssa_op -> op1_def ]-> flags & ZREG_STORE );
5358
5369
}
5359
5370
}
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
+ }
5360
5379
}
5361
5380
if (ssa_op -> op2_def >= 0 ) {
5362
5381
zend_uchar type = IS_UNKNOWN ;
@@ -5377,6 +5396,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5377
5396
ra [ssa_op -> op2_def ]-> flags & ZREG_STORE );
5378
5397
}
5379
5398
}
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
+ }
5380
5407
}
5381
5408
5382
5409
switch (opline -> opcode ) {
@@ -5412,6 +5439,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5412
5439
ra [ssa_op -> op1_def ]-> reg & ZREG_STORE );
5413
5440
}
5414
5441
}
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
+ }
5415
5450
}
5416
5451
ssa_op ++ ;
5417
5452
break ;
0 commit comments