The root cause of PR111355 and PR111482 is missing to check if vr0
is undefined_p before call vr0.lower_bound.
In the pattern "(X + C) / N",
(if (INTEGRAL_TYPE_P (type)
&& get_range_query (cfun)->range_of_expr (vr0, @0))
(if (...)
(plus (op @0 @2) { wide_int_to_tree (type, plus_op1 (c)); })
(if (TYPE_UNSIGNED (type) && c.sign_mask () < 0 ...
&& wi::geu_p (vr0.lower_bound (), -c))
In "(if (...)", there is code to prevent vr0's undefined_p,
But in the "else" part, vr0's undefined_p is not checked before
"wi::geu_p (vr0.lower_bound (), -c)".
PR tree-optimization/111355
gcc/ChangeLog:
* match.pd ((X + C) / N): Update pattern.
gcc/testsuite/ChangeLog:
* gcc.dg/pr111355.c: New test.
|| (vr0.nonnegative_p () && vr3.nonnegative_p ())
|| (vr0.nonpositive_p () && vr3.nonpositive_p ())))
(plus (op @0 @2) { wide_int_to_tree (type, plus_op1 (c)); })
- (if (TYPE_UNSIGNED (type) && c.sign_mask () < 0
+ (if (!vr0.undefined_p () && TYPE_UNSIGNED (type) && c.sign_mask () < 0
&& exact_mod (-c)
/* unsigned "X-(-C)" doesn't underflow. */
&& wi::geu_p (vr0.lower_bound (), -c))
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -Wno-div-by-zero" } */
+
+/* Make sure no ICE. */
+int main() {
+ unsigned b;
+ return b ? 1 << --b / 0 : 0;
+}