https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97721

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Aldy Hernandez from comment #2)
> The ranger is analyzing a statement with an integer overflow, and creating a
> non-legacy range that is invalid:
> 
> (gdb) p debug(stmt)
> if (_1 != -1(OVF))
> 
> (gdb) p debug(op2_range)
> int [-1(OVF), -1(OVF)]
> 
> (gdb) p op2_range.legacy_mode_p()
> $8 = false
> 
> Legacy ranges allow TREE_OVERFLOW to creep in, as the verifier allows
> symbolics and other end points that are not comparable at compile time (cmp
> == -2 below):
> 
>     case VR_ANTI_RANGE:
>     case VR_RANGE:
>       {
>       gcc_assert (m_num_ranges == 1);
>       int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0));
>       gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
>       return;
>       }
> 
> However, we're a bit more strict in irange.  We don't allow un-comparable
> endpoints and TREE_OVERFLOW integers are such.
> 
> I'm not sure where to fix this.
> 
> Is the original statement valid gimple?  Richard has mentioned that any time
> there's a TREE_OVERFLOW in the IL, it's a sign of a bug.  If the IL is
> wrong, we should tackle the source problem.
> 
> If the IL is ocrrect, then perhaps we could drop OVF at range creation.

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.

Reply via email to