https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97721
--- Comment #6 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- (In reply to Richard Biener from comment #5) > (In reply to Aldy Hernandez from comment #2) > Yes, the IL is "correct", just inefficent and possibly confusing to passes. > > The OVF flag on INTEGER_CST have _no_ semantic meaning in the IL so making > them "invalid" in ranger doesn't make sense. The ranger treating them invalid was a precaution since the conversion to trees brought the use of compare_values_warnv(), which claims overflowed values cannot be compared. But if in fact they can be compared, then perhaps compare_values_warnv is wrong in claiming the opposite: /* We cannot say anything more for non-constants. */ if (!cst1 || !cst2) return -2; if (!POINTER_TYPE_P (TREE_TYPE (val1))) { /* We cannot compare overflowed values. */ if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2)) return -2; What do you think? It would seem to me that removing this restriction would work, especially since tree_int_cst_compare, which this function uses, just degrades to wide ints, which don't care about TREE_OVERFLOW. [untested] diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index e00c034fee3..8702ad1ae8d 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -609,10 +609,6 @@ compare_values_warnv (tree val1, tree val2, bool *strict_overflow_p) if (!POINTER_TYPE_P (TREE_TYPE (val1))) { - /* We cannot compare overflowed values. */ - if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2)) - return -2; - if (TREE_CODE (val1) == INTEGER_CST && TREE_CODE (val2) == INTEGER_CST) return tree_int_cst_compare (val1, val2); @@ -635,13 +631,7 @@ compare_values_warnv (tree val1, tree val2, bool *strict_overflow_p) else { if (TREE_CODE (val1) == INTEGER_CST && TREE_CODE (val2) == INTEGER_CST) - { - /* We cannot compare overflowed values. */ - if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2)) - return -2; - - return tree_int_cst_compare (val1, val2); - } + return tree_int_cst_compare (val1, val2); /* First see if VAL1 and VAL2 are not the same. */ if (operand_equal_p (val1, val2, 0))