@@ -5559,29 +5559,35 @@ static int zend_jit_long_math_helper(zend_jit_ctx *jit,
5559
5559
}
5560
5560
5561
5561
if (op1_info & MAY_BE_UNDEF) {
5562
- ir_ref if_def;
5562
+ ir_ref if_def, ref, ref2 ;
5563
5563
5564
+ ref = jit_ZVAL_ADDR(jit, op1_addr);
5564
5565
if_def = jit_if_not_Z_TYPE(jit, op1_addr, IS_UNDEF);
5565
5566
ir_IF_FALSE_cold(if_def);
5566
5567
5567
5568
// zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op1.var))));
5568
5569
ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_jit_undefined_op_helper), ir_CONST_U32(opline->op1.var));
5569
5570
5570
- jit_set_Z_TYPE_INFO(jit, op1_addr, IS_NULL );
5571
+ ref2 = jit_EG(uninitialized_zval );
5571
5572
ir_MERGE_WITH_EMPTY_TRUE(if_def);
5573
+ ref = ir_PHI_2(IR_ADDR, ref2, ref);
5574
+ op1_addr = ZEND_ADDR_REF_ZVAL(ref);
5572
5575
}
5573
5576
5574
5577
if (op2_info & MAY_BE_UNDEF) {
5575
- ir_ref if_def;
5578
+ ir_ref if_def, ref, ref2 ;
5576
5579
5580
+ ref = jit_ZVAL_ADDR(jit, op2_addr);
5577
5581
if_def = jit_if_not_Z_TYPE(jit, op2_addr, IS_UNDEF);
5578
5582
ir_IF_FALSE_cold(if_def);
5579
5583
5580
5584
// zend_error(E_WARNING, "Undefined variable $%s", ZSTR_VAL(CV_DEF_OF(EX_VAR_TO_NUM(opline->op2.var))));
5581
5585
ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_jit_undefined_op_helper), ir_CONST_U32(opline->op2.var));
5582
5586
5583
- jit_set_Z_TYPE_INFO(jit, op2_addr, IS_NULL );
5587
+ ref2 = jit_EG(uninitialized_zval );
5584
5588
ir_MERGE_WITH_EMPTY_TRUE(if_def);
5589
+ ref = ir_PHI_2(IR_ADDR, ref2, ref);
5590
+ op2_addr = ZEND_ADDR_REF_ZVAL(ref);
5585
5591
}
5586
5592
5587
5593
if (Z_MODE(op1_addr) == IS_REG) {
@@ -16327,6 +16333,15 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa
16327
16333
case ZEND_MUL:
16328
16334
op1_info = OP1_INFO();
16329
16335
op2_info = OP2_INFO();
16336
+ if ((op1_info & MAY_BE_UNDEF) || (op2_info & MAY_BE_UNDEF)) {
16337
+ return 0;
16338
+ }
16339
+ if (trace && trace->op1_type != IS_UNKNOWN) {
16340
+ op1_info &= 1U << (trace->op1_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED));
16341
+ }
16342
+ if (trace && trace->op2_type != IS_UNKNOWN) {
16343
+ op2_info &= 1U << (trace->op2_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED));
16344
+ }
16330
16345
return !(op1_info & MAY_BE_UNDEF)
16331
16346
&& !(op2_info & MAY_BE_UNDEF)
16332
16347
&& (op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE))
@@ -16339,6 +16354,12 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa
16339
16354
case ZEND_MOD:
16340
16355
op1_info = OP1_INFO();
16341
16356
op2_info = OP2_INFO();
16357
+ if (trace && trace->op1_type != IS_UNKNOWN) {
16358
+ op1_info &= 1U << (trace->op1_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED));
16359
+ }
16360
+ if (trace && trace->op2_type != IS_UNKNOWN) {
16361
+ op2_info &= 1U << (trace->op2_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED));
16362
+ }
16342
16363
return (op1_info & MAY_BE_LONG)
16343
16364
&& (op2_info & MAY_BE_LONG);
16344
16365
case ZEND_PRE_INC:
@@ -16384,6 +16405,13 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa
16384
16405
&& (trace->op1_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED)) == IS_ARRAY) {
16385
16406
op1_info &= ~((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_ARRAY);
16386
16407
}
16408
+ if (trace && trace->op2_type != IS_UNKNOWN) {
16409
+ if ((trace->op2_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED)) == IS_LONG) {
16410
+ op2_info &= ~((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_LONG);
16411
+ } else if ((trace->op2_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT|IS_TRACE_PACKED)) == IS_STRING) {
16412
+ op2_info &= ~((MAY_BE_ANY|MAY_BE_UNDEF) - MAY_BE_STRING);
16413
+ }
16414
+ }
16387
16415
return ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY) &&
16388
16416
(!(opline->op1_type & (IS_TMP_VAR|IS_VAR)) || !(op1_info & MAY_BE_RC1)) &&
16389
16417
(((op2_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_LONG) ||
0 commit comments