------- Comment #24 from rguenth at gcc dot gnu dot org 2007-04-21 18:38 ------- Actually the handle_ptr_arith change made a difference as we (luckily?) for D.2147_17 = D.2144_14 + D.2146_16
D.2144_14 = a_11->begin; D.2145_15 = i_1 * 4; D.2146_16 = (const int *) D.2145_15; D.2147_17 = D.2144_14 + D.2146_16; add a constraint for offset zero (that's pure luck) for D.2144_14. So, the difference in constraints good vs. bad is @@ -26,10 +26,10 @@ D.2144_14 = *a_11 D.2146_16 = &ANYTHING D.2147_17 = D.2144_14 +D.2147_17 = D.2146_16 ESCAPED_VARS = D.2092_25 Collapsing static cycles and doing variable substitution: -Collapsing D.2147_17 into D.2144_14 Collapsing this_7 into D.2140_6 Collapsing NONLOCAL.8 into ESCAPED_VARS @@ -54,7 +54,7 @@ a_11 = { D.2142 } D.2144_14 = { D.2141 D.2141.32 } D.2146_16 = { ANYTHING } -D.2147_17 = { D.2141 D.2141.32 } +D.2147_17 = { ANYTHING D.2141 D.2141.32 } D.2092_25 = { } main: Total number of aliased vops: 3 Unrelated to this the following resolves possible problems in handle_ptr_arith: Index: tree-ssa-structalias.c =================================================================== --- tree-ssa-structalias.c (revision 124018) +++ tree-ssa-structalias.c (working copy) @@ -3287,7 +3287,7 @@ handle_ptr_arith (VEC (ce_s, heap) *lhsc unsigned int i = 0; unsigned int j = 0; VEC (ce_s, heap) *temp = NULL; - unsigned int rhsoffset = 0; + unsigned HOST_WIDE_INT rhsoffset = 0; if (TREE_CODE (expr) != PLUS_EXPR && TREE_CODE (expr) != MINUS_EXPR) @@ -3298,8 +3298,10 @@ handle_ptr_arith (VEC (ce_s, heap) *lhsc get_constraint_for (op0, &temp); if (POINTER_TYPE_P (TREE_TYPE (op0)) - && TREE_CODE (op1) == INTEGER_CST - && TREE_CODE (expr) == PLUS_EXPR) + && host_integerp (op1, 0) + && TREE_CODE (expr) == PLUS_EXPR + /* Make sure the pointer offset is positive. */ + && tree_int_cst_msb (op1) == 0) { rhsoffset = TREE_INT_CST_LOW (op1) * BITS_PER_UNIT; } though that last multiplication may still overflow. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30567