Since i've updated the crx-port from snapshot 4_1_20050508 to 4_1_20050625 i get wrong code for the example below. (compiled with -O2)
If i turn off value range propagation (-fno-tree-vrp) the generated code is correct. /***************** Tree dump before vrp ******************/ main () { struct cls arr[64]; struct cls * ptr; int i; int D.1170; long int D.1169; short int D.1168; int D.1167; char D.1166; int i.0; <bb 0>: goto <bb 2> (<L1>); <L0>:; i_11 = i_1; D.1166_12 = (char) i_1; arr[i_1].c = D.1166_12; i_14 = i_1; D.1167_15 = i_1 * i_1; arr[i_1].l = D.1167_15; i_17 = i_1; D.1168_18 = (short int) i_1; arr[i_1].s = D.1168_18; i_20 = i_1 + 1; # i_1 = PHI <0(0), i_20(1)>; <L1>:; if (i_1 <= 63) goto <L0>; else goto <L2>; <L2>:; D.1169_7 = arr[7].l; if (D.1169_7 != 49) goto <L3>; else goto <L5>; <L3>:; # D.1170_3 = PHI <1(4), 0(3)>; <L5>:; return D.1170_3; } /***************** Tree dump after vrp *******************/ Value ranges after VRP: i_1: VARYING arr_2: VARYING D.1170_3: VARYING D.1169_7: VARYING <retval>_8: VARYING i_9: [0, 63] EQUIVALENCES: { i_1 } (1 elements) i_11: [0, 63] EQUIVALENCES: { i_1 i_9 } (2 elements) D.1166_12: [0, 63] EQUIVALENCES: { } (0 elements) i_14: [0, 63] EQUIVALENCES: { i_1 i_9 } (2 elements) D.1167_15: [0, 0] EQUIVALENCES: { } (0 elements) ??? Why is that ??? i_17: [0, 63] EQUIVALENCES: { i_1 i_9 } (2 elements) D.1168_18: [0, 63] EQUIVALENCES: { } (0 elements) i_20: [1, 64] EQUIVALENCES: { } (0 elements) main () { struct cls arr[64]; struct cls * ptr; int i; int D.1170; long int D.1169; short int D.1168; int D.1167; char D.1166; int i.0; <bb 0>: goto <bb 2> (<L1>); <L0>:; i_11 = i_1; D.1166_12 = (char) i_1; arr[i_1].c = D.1166_12; i_14 = i_1; D.1167_15 = i_1 * i_1; arr[i_1].l = 0; ??? Why is that ??? i_17 = i_1; D.1168_18 = (short int) i_1; arr[i_1].s = D.1168_18; i_20 = i_1 + 1; # i_1 = PHI <0(0), i_20(1)>; <L1>:; if (i_1 <= 63) goto <L0>; else goto <L2>; <L2>:; D.1169_7 = arr[7].l; if (D.1169_7 != 49) goto <L3>; else goto <L5>; <L3>:; # D.1170_3 = PHI <1(4), 0(3)>; <L5>:; return D.1170_3; } /********************** testfile.c ***********************/ typedef struct { char c; long l; short s; } cls; int main() { int i; cls * ptr, arr[64]; for (i = 0; i < 64; i++) { arr[i].c = i; arr[i].l = i * i; arr[i].s = i; } ptr = arr + 7; if (ptr->l != 49) { return 1; } return 0; } -- Summary: [4.1 Regression] value range propagation error Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: critical Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: paul dot woegerer at nsc dot com CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: crx-unknown-elf http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22230