[Bug tree-optimization/60001] VRP fails to fold identical unsigned comparisons

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Jan 31 10:37:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60001

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2014-01-31
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
  <bb 4>:
  p_10 = ASSERT_EXPR <p_1(D), p_1(D) < q_2(D)>;
  q_11 = ASSERT_EXPR <q_2(D), q_2(D) > p_10>;
  if (p_10 >= q_11)
    goto <bb 5>;
  else
    goto <bb 6>;

Visiting statement:
p_10 = ASSERT_EXPR <p_1(D), p_1(D) < q_2(D)>;

Intersecting
  [0, q_2(D) + 4294967295]  EQUIVALENCES: { p_1(D) } (1 elements)
and
  VARYING
to
  [0, q_2(D) + 4294967295]  EQUIVALENCES: { p_1(D) } (1 elements)
Found new range for p_10: [0, q_2(D) + 4294967295]

Visiting statement:
q_11 = ASSERT_EXPR <q_2(D), q_2(D) > p_10>;

Intersecting
  [p_10 + 1, +INF]  EQUIVALENCES: { q_2(D) } (1 elements)
and
  VARYING
to
  [p_10 + 1, +INF]  EQUIVALENCES: { q_2(D) } (1 elements)
Found new range for q_11: [p_10 + 1, +INF]

Visiting conditional with predicate: if (p_10 >= q_11)

With known ranges
        p_10: [0, q_2(D) + 4294967295]  EQUIVALENCES: { p_1(D) } (1 elements)  
q_11: [p_10 + 1, +INF]  EQUIVALENCES: { q_2(D) } (1 elements)

Predicate evaluates to: DON'T KNOW

Why we don't fold this we should
see that p_10 >= q_11 is equivalent to p_10 >= [p_10 + 1, +INF]

Ah.  It doesn't even ask that.  I can make it ask [p_10 + 1, +INF] <= p_10.

Then it says that p_10 and +INF are un-ordered (it doesn't see that p_10
cannot be +INF because then [p_10 + 1, +INF] wouldn't be a valid range).

Similar it says that p_10 + 1 and p_10 are un-ordered because if p_10 is
+INF then p_10 + 1 will wrap.

So compare_range_with_value needs to be more sophisticated for these cases
(involving symbolic ranges).



More information about the Gcc-bugs mailing list