extern void link_error (); void foo (int a) { if (a < 0) { int y; a = -a; y = a / 7; if (y > 1 << 30) link_error (); } }
int main() { return 0; } Before the VRP overflow handling changes we have after the first VRP pass: Value ranges after VRP: a_1(D): VARYING a_2: [1, +INF] EQUIVALENCES: { } (0 elements) y_3: [0, 306783378] EQUIVALENCES: { } (0 elements) a_4: [-INF, -1] EQUIVALENCES: { a_1(D) } (1 elements) Substituing values and folding statements Folding predicate y_3 > 1073741824 to 0 Folded statement: if (y_3 > 1073741824) goto <L1>; else goto <L2>; into: if (0) goto <L1>; else goto <L2>; void foo(int) (a) { int y; <bb 2>: if (a_1(D) < 0) goto <L0>; else goto <L2>; <L0>:; a_2 = -a_1(D); y_3 = a_2 / 7; <L2>:; return; } while now we get Value ranges after VRP: a_1(D): VARYING a_2: [1, +INF(OVF)] EQUIVALENCES: { } (0 elements) y_3: [0, +INF(OVF)] EQUIVALENCES: { } (0 elements) a_4: [-INF, -1] EQUIVALENCES: { a_1(D) } (1 elements) Substituing values and folding statements foo (a) { int y; <bb 2>: if (a_1(D) < 0) goto <L0>; else goto <L2>; <L0>:; a_2 = -a_1(D); y_3 = a_2 / 7; if (y_3 > 1073741824) goto <L1>; else goto <L2>; <L1>:; link_error (); <L2>:; return; } without -Wstrict-overflow=N warning about the issues with signed negation and the [1, +INF(OVF)] derived range. Note that the testcase is simple enough that expansion optimizes the comparison, so it will not fail to link. -- Summary: [4.3 Regression] VRP no longer derives range for division after negation Product: gcc Version: 4.3.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rguenth at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31130