Do not ignore failures from gimple_range_calc_op2.
authorAndrew MacLeod <amacleod@redhat.com>
Mon, 12 Oct 2020 17:00:12 +0000 (13:00 -0400)
committerAldy Hernandez <aldyh@redhat.com>
Mon, 12 Oct 2020 18:05:56 +0000 (14:05 -0400)
We were ignoring the return value if op2 returned false and getting garbage ranges propagated.

gcc/ChangeLog:

PR tree-optimization/97381
* gimple-range-gori.cc (gori_compute::compute_operand2_range): If a range cannot be
calculated through operand 2, return false.

gcc/testsuite/ChangeLog:

* gcc.dg/pr97381.c: New test.

gcc/gimple-range-gori.cc
gcc/testsuite/gcc.dg/pr97381.c [new file with mode: 0644]

index 986427669a701b0fabbb08275ef5cf56d12f8017..c4bfc658319f102fa3ab555ed21cd9ddf293a68e 100644 (file)
@@ -920,8 +920,9 @@ gori_compute::compute_operand2_range (irange &r, gimple *stmt,
   expr_range_in_bb (op2_range, op2, gimple_bb (stmt));
 
   // Intersect with range for op2 based on lhs and op1.
-  if (gimple_range_calc_op2 (r, stmt, lhs, op1_range))
-    op2_range.intersect (r);
+  if (!gimple_range_calc_op2 (r, stmt, lhs, op1_range))
+    return false;
+  op2_range.intersect (r);
 
   gimple *src_stmt = SSA_NAME_DEF_STMT (op2);
   // If def stmt is outside of this BB, then name must be an import.
diff --git a/gcc/testsuite/gcc.dg/pr97381.c b/gcc/testsuite/gcc.dg/pr97381.c
new file mode 100644 (file)
index 0000000..947692c
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int a;
+void b() {
+  char c = 27;
+  for (; c <= 85; c += 1) {
+    a /= 148372120 * c;
+    if (a)
+      for (;;)
+        ;
+  }
+}