Consider int foo (int a, int b) { if (a == b) if (a == b) return 123;
return 0; } With -fno-tree-dominator-opts -fdump-tree-vrp-details, VRP does not fold the second "if" statement. Here is what I get from VRP. Value ranges after VRP: D.1234_1: VARYING a_2: VARYING b_3: VARYING <retval>_4: VARYING D.1234_5: [0, 0] D.1234_6: [123, 123] a_7: [b_3, b_3] a_8: ~[b_3, b_3] foo (a, b) { int D.1234; <bb 0>: if (a_2 == b_3) goto <L0>; else goto <L5>; <L0>:; a_7 = b_3; if (a_7 == b_3) goto <L1>; else goto <L2>; <L1>:; D.1234_6 = 123; goto <bb 5> (<L4>); <L5>:; a_8 = a_2; <L2>:; D.1234_5 = 0; # D.1234_1 = PHI <D.1234_6(2), D.1234_5(4)>; <L4>:; return D.1234_1; } Note that we have b_3: VARYING a_7: [b_3, b_3] so we have enough information to fold the second "if" statement despite the fact that b_3 is VARYING. -- Summary: VRP does not fold "if (a == b)" in a certain situation Product: gcc Version: unknown Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P2 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: kazu at cs dot umass dot edu CC: dnovillo at redhat dot com,gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21367