@@ -795,7 +795,22 @@ static int zend_jit_trace_copy_ssa_var_info(const zend_op_array *op_array, const
795
795
return 0 ;
796
796
}
797
797
798
- static int zend_jit_trace_copy_ssa_var_range (const zend_op_array * op_array , const zend_ssa * ssa , const zend_op * * tssa_opcodes , zend_ssa * tssa , int ssa_var )
798
+ static void zend_jit_trace_propagate_range (const zend_op_array * op_array , const zend_op * * tssa_opcodes , zend_ssa * tssa , int ssa_var )
799
+ {
800
+ zend_ssa_range tmp ;
801
+ int def = tssa -> vars [ssa_var ].definition ;
802
+
803
+ if (tssa -> vars [ssa_var ].alias == NO_ALIAS
804
+ && zend_inference_propagate_range (op_array , tssa , (zend_op * )tssa_opcodes [def ], (zend_ssa_op * )& tssa -> ops [def ], ssa_var , & tmp )) {
805
+ tssa -> var_info [ssa_var ].range .min = tmp .min ;
806
+ tssa -> var_info [ssa_var ].range .max = tmp .max ;
807
+ tssa -> var_info [ssa_var ].range .underflow = tmp .underflow ;
808
+ tssa -> var_info [ssa_var ].range .overflow = tmp .overflow ;
809
+ tssa -> var_info [ssa_var ].has_range = 1 ;
810
+ }
811
+ }
812
+
813
+ static void zend_jit_trace_copy_ssa_var_range (const zend_op_array * op_array , const zend_ssa * ssa , const zend_op * * tssa_opcodes , zend_ssa * tssa , int ssa_var )
799
814
{
800
815
int def ;
801
816
zend_ssa_op * op ;
@@ -821,12 +836,16 @@ static int zend_jit_trace_copy_ssa_var_range(const zend_op_array *op_array, cons
821
836
info = ssa -> var_info + op -> result_def ;
822
837
} else {
823
838
assert (0 );
824
- return 0 ;
839
+ return ;
825
840
}
826
841
827
842
tssa -> vars [ssa_var ].no_val = no_val ;
828
843
tssa -> vars [ssa_var ].alias = alias ;
829
844
845
+ if (!(info -> type & MAY_BE_REF )) {
846
+ zend_jit_trace_propagate_range (op_array , tssa_opcodes , tssa , ssa_var );
847
+ }
848
+
830
849
if (info -> has_range ) {
831
850
if (tssa -> var_info [ssa_var ].has_range ) {
832
851
tssa -> var_info [ssa_var ].range .min = MAX (tssa -> var_info [ssa_var ].range .min , info -> range .min );
@@ -838,9 +857,7 @@ static int zend_jit_trace_copy_ssa_var_range(const zend_op_array *op_array, cons
838
857
tssa -> var_info [ssa_var ].range = info -> range ;
839
858
}
840
859
}
841
- return 1 ;
842
860
}
843
- return 0 ;
844
861
}
845
862
846
863
static int zend_jit_trace_restrict_ssa_var_info (const zend_op_array * op_array , const zend_ssa * ssa , const zend_op * * tssa_opcodes , zend_ssa * tssa , int ssa_var )
@@ -1507,7 +1524,6 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1507
1524
// zend_class_entry *op1_ce = NULL;
1508
1525
zend_class_entry * op2_ce = NULL ;
1509
1526
1510
- // TODO: range inference ???
1511
1527
opline = p -> opline ;
1512
1528
1513
1529
op1_type = orig_op1_type = p -> op1_type ;
@@ -1925,22 +1941,40 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1925
1941
} else {
1926
1942
if (ssa_ops [idx ].op1_def >= 0 ) {
1927
1943
ssa_vars [ssa_ops [idx ].op1_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM (opline -> op1 .var ));
1944
+ if (ssa_ops [idx ].op1_use < 0 || !(ssa_var_info [ssa_ops [idx ].op1_use ].type & MAY_BE_REF )) {
1945
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx ].op1_def );
1946
+ }
1928
1947
}
1929
1948
if (ssa_ops [idx ].op2_def >= 0 ) {
1930
1949
ssa_vars [ssa_ops [idx ].op2_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM (opline -> op2 .var ));
1950
+ if (ssa_ops [idx ].op2_use < 0 || !(ssa_var_info [ssa_ops [idx ].op2_use ].type & MAY_BE_REF )) {
1951
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx ].op2_def );
1952
+ }
1931
1953
}
1932
1954
if (ssa_ops [idx ].result_def >= 0 ) {
1933
1955
ssa_vars [ssa_ops [idx ].result_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM (opline -> result .var ));
1956
+ if (ssa_ops [idx ].result_use < 0 || !(ssa_var_info [ssa_ops [idx ].result_use ].type & MAY_BE_REF )) {
1957
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx ].result_def );
1958
+ }
1934
1959
}
1935
1960
if (len == 2 && (opline + 1 )-> opcode == ZEND_OP_DATA ) {
1936
1961
if (ssa_ops [idx + 1 ].op1_def >= 0 ) {
1937
1962
ssa_vars [ssa_ops [idx + 1 ].op1_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM ((opline + 1 )-> op1 .var ));
1963
+ if (ssa_ops [idx + 1 ].op1_use < 0 || !(ssa_var_info [ssa_ops [idx + 1 ].op1_use ].type & MAY_BE_REF )) {
1964
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx + 1 ].op1_def );
1965
+ }
1938
1966
}
1939
1967
if (ssa_ops [idx + 1 ].op2_def >= 0 ) {
1940
1968
ssa_vars [ssa_ops [idx + 1 ].op2_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM ((opline + 1 )-> op2 .var ));
1969
+ if (ssa_ops [idx + 1 ].op2_use < 0 || !(ssa_var_info [ssa_ops [idx + 1 ].op2_use ].type & MAY_BE_REF )) {
1970
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx + 1 ].op2_def );
1971
+ }
1941
1972
}
1942
1973
if (ssa_ops [idx + 1 ].result_def >= 0 ) {
1943
1974
ssa_vars [ssa_ops [idx + 1 ].result_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM ((opline + 1 )-> result .var ));
1975
+ if (ssa_ops [idx + 1 ].result_use < 0 || !(ssa_var_info [ssa_ops [idx + 1 ].result_use ].type & MAY_BE_REF )) {
1976
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx + 1 ].result_def );
1977
+ }
1944
1978
}
1945
1979
}
1946
1980
}
@@ -2004,12 +2038,21 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
2004
2038
} else {
2005
2039
if (ssa_ops [idx ].op1_def >= 0 ) {
2006
2040
ssa_vars [ssa_ops [idx ].op1_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM (opline -> op1 .var ));
2041
+ if (ssa_ops [idx ].op1_use < 0 || !(ssa_var_info [ssa_ops [idx ].op1_use ].type & MAY_BE_REF )) {
2042
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx ].op1_def );
2043
+ }
2007
2044
}
2008
2045
if (ssa_ops [idx ].op2_def >= 0 ) {
2009
2046
ssa_vars [ssa_ops [idx ].op2_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM (opline -> op2 .var ));
2047
+ if (ssa_ops [idx ].op2_use < 0 || !(ssa_var_info [ssa_ops [idx ].op2_use ].type & MAY_BE_REF )) {
2048
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx ].op2_def );
2049
+ }
2010
2050
}
2011
2051
if (ssa_ops [idx ].result_def >= 0 ) {
2012
2052
ssa_vars [ssa_ops [idx ].result_def ].alias = zend_jit_var_may_alias (op_array , ssa , EX_VAR_TO_NUM (opline -> result .var ));
2053
+ if (ssa_ops [idx ].result_use < 0 || !(ssa_var_info [ssa_ops [idx ].result_use ].type & MAY_BE_REF )) {
2054
+ zend_jit_trace_propagate_range (op_array , ssa_opcodes , tssa , ssa_ops [idx ].result_def );
2055
+ }
2013
2056
}
2014
2057
}
2015
2058
if (opline -> opcode == ZEND_RECV_INIT
0 commit comments