58
58
#define LOG_NEG_RANGE (...)
59
59
#endif
60
60
61
+ /* Pop elements in unspecified order from worklist until it is empty */
62
+ #define WHILE_WORKLIST (worklist , len , i ) do { \
63
+ zend_bool _done = 0; \
64
+ while (!_done) { \
65
+ _done = 1; \
66
+ ZEND_BITSET_FOREACH(worklist, len, i) { \
67
+ zend_bitset_excl(worklist, i); \
68
+ _done = 0;
69
+
70
+ #define WHILE_WORKLIST_END () \
71
+ } ZEND_BITSET_FOREACH_END(); \
72
+ } \
73
+ } while (0)
74
+
61
75
#define CHECK_SCC_VAR (var2 ) \
62
76
do { \
63
77
if (!ssa->vars[var2].no_val) { \
@@ -269,8 +283,7 @@ int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ss
269
283
}
270
284
}
271
285
272
- while ((i = zend_bitset_first (worklist , zend_bitset_len (ssa_vars_count ))) >= 0 ) {
273
- zend_bitset_excl (worklist , i );
286
+ WHILE_WORKLIST (worklist , zend_bitset_len (ssa_vars_count ), i ) {
274
287
if (ssa_vars [i ].definition_phi ) {
275
288
/* mark all possible sources as used */
276
289
p = ssa_vars [i ].definition_phi ;
@@ -288,7 +301,7 @@ int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ss
288
301
}
289
302
}
290
303
}
291
- }
304
+ } WHILE_WORKLIST_END ();
292
305
293
306
free_alloca (worklist , use_heap );
294
307
@@ -1567,8 +1580,7 @@ static void zend_infer_ranges_warmup(const zend_op_array *op_array, zend_ssa *ss
1567
1580
1568
1581
memset (visited , 0 , sizeof (zend_ulong ) * worklist_len );
1569
1582
1570
- while ((j = zend_bitset_first (worklist , worklist_len )) >= 0 ) {
1571
- zend_bitset_excl (worklist , j );
1583
+ WHILE_WORKLIST (worklist , worklist_len , j ) {
1572
1584
if (zend_inference_calc_range (op_array , ssa , j , 0 , 0 , & tmp )) {
1573
1585
#ifdef NEG_RANGE
1574
1586
if (!has_inner_cycles &&
@@ -1623,7 +1635,7 @@ static void zend_infer_ranges_warmup(const zend_op_array *op_array, zend_ssa *ss
1623
1635
FOR_EACH_VAR_USAGE (j , ADD_SCC_VAR_1 );
1624
1636
}
1625
1637
}
1626
- }
1638
+ } WHILE_WORKLIST_END ();
1627
1639
}
1628
1640
free_alloca (worklist , use_heap );
1629
1641
}
@@ -1686,12 +1698,11 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{
1686
1698
#endif
1687
1699
1688
1700
/* widening */
1689
- while ((j = zend_bitset_first (worklist , worklist_len )) >= 0 ) {
1690
- zend_bitset_excl (worklist , j );
1701
+ WHILE_WORKLIST (worklist , worklist_len , j ) {
1691
1702
if (zend_ssa_range_widening (op_array , ssa , j , scc )) {
1692
1703
FOR_EACH_VAR_USAGE (j , ADD_SCC_VAR );
1693
1704
}
1694
- }
1705
+ } WHILE_WORKLIST_END ();
1695
1706
1696
1707
/* Add all SCC entry variables into worklist for narrowing */
1697
1708
for (j = scc_var [scc ]; j >= 0 ; j = next_scc_var [j ]) {
@@ -1702,8 +1713,7 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{
1702
1713
}
1703
1714
1704
1715
/* narrowing */
1705
- while ((j = zend_bitset_first (worklist , worklist_len )) >= 0 ) {
1706
- zend_bitset_excl (worklist , j );
1716
+ WHILE_WORKLIST (worklist , worklist_len , j ) {
1707
1717
if (zend_ssa_range_narrowing (op_array , ssa , j , scc )) {
1708
1718
FOR_EACH_VAR_USAGE (j , ADD_SCC_VAR );
1709
1719
#ifdef SYM_RANGE
@@ -1715,7 +1725,7 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{
1715
1725
}
1716
1726
#endif
1717
1727
}
1718
- }
1728
+ } WHILE_WORKLIST_END ();
1719
1729
}
1720
1730
}
1721
1731
@@ -3264,8 +3274,7 @@ int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script
3264
3274
int i , j ;
3265
3275
uint32_t tmp ;
3266
3276
3267
- while ((j = zend_bitset_first (worklist , zend_bitset_len (ssa_vars_count ))) >= 0 ) {
3268
- zend_bitset_excl (worklist , j );
3277
+ WHILE_WORKLIST (worklist , zend_bitset_len (ssa_vars_count ), j ) {
3269
3278
if (ssa_vars [j ].definition_phi ) {
3270
3279
zend_ssa_phi * p = ssa_vars [j ].definition_phi ;
3271
3280
if (p -> pi >= 0 ) {
@@ -3322,7 +3331,7 @@ int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script
3322
3331
i = ssa_vars [j ].definition ;
3323
3332
zend_update_type_info (op_array , ssa , script , worklist , i );
3324
3333
}
3325
- }
3334
+ } WHILE_WORKLIST_END ();
3326
3335
return SUCCESS ;
3327
3336
}
3328
3337
@@ -3894,13 +3903,12 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array)
3894
3903
}
3895
3904
call_info = call_info -> next_callee ;
3896
3905
}
3897
- while ((i = zend_bitset_first (worklist , worklist_len )) >= 0 ) {
3898
- zend_bitset_excl (worklist , i );
3906
+ WHILE_WORKLIST (worklist , worklist_len , i ) {
3899
3907
if (!info -> ssa .var_info [i ].recursive ) {
3900
3908
info -> ssa .var_info [i ].recursive = 1 ;
3901
3909
add_usages (op_array , & info -> ssa , worklist , i );
3902
3910
}
3903
- }
3911
+ } WHILE_WORKLIST_END ();
3904
3912
free_alloca (worklist , use_heap );
3905
3913
}
3906
3914
0 commit comments