diff mbox series

[COMMITTED] tree-optimization/106510 - Do not register edges for statements not understood.

Message ID 25f51fd0-41a6-a4c8-29ac-d0d7f8918ffe@redhat.com
State New
Headers show
Series [COMMITTED] tree-optimization/106510 - Do not register edges for statements not understood. | expand

Commit Message

Andrew MacLeod Aug. 2, 2022, 11:24 p.m. UTC
When only interger ranges were supported, we knew all gimple COND 
statements were supported.  this is no longer true with float support, 
so gracefully do nothing when they are encountered.

You can choose to remove the "unsupported relational" range-ops if you 
so wish.  we shouldn't need those.,

Bootstrapped on 86_64-pc-linux-gnu with no regressions.  pushed.

Andrew
diff mbox series

Patch

commit 70daecc03235aa7187b03681cebed6e04b32678e
Author: Andrew MacLeod <amacleod@redhat.com>
Date:   Tue Aug 2 17:31:37 2022 -0400

    Do not register edges for statements not understood.
    
    Previously, all gimple_cond types were undserstoof, with float values,
    this is no longer true.  We should gracefully do nothing if the
    gcond type is not supported.
    
            PR tree-optimization/106510
            gcc/
            * gimple-range-fold.cc (fur_source::register_outgoing_edges):
              Check for unsupported statements early.
    
            gcc/testsuite
            * gcc.dg/pr106510.c: New.

diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc
index 923094abd62..689d8279627 100644
--- a/gcc/gimple-range-fold.cc
+++ b/gcc/gimple-range-fold.cc
@@ -1496,6 +1496,10 @@  fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge
   tree name;
   basic_block bb = gimple_bb (s);
 
+  range_op_handler handler (s);
+  if (!handler)
+    return;
+
   if (e0)
     {
       // If this edge is never taken, ignore it.
@@ -1524,8 +1528,6 @@  fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge
   tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (s));
   if (ssa1 && ssa2)
     {
-      range_op_handler handler (s);
-      gcc_checking_assert (handler);
       if (e0)
 	{
 	  relation_kind relation = handler.op1_op2_relation (e0_range);
diff --git a/gcc/testsuite/gcc.dg/pr106510.c b/gcc/testsuite/gcc.dg/pr106510.c
new file mode 100644
index 00000000000..24e91123f63
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr106510.c
@@ -0,0 +1,10 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void foo ();
+void ine_ok() {
+  float y, x;
+  if (x < y || x > y || y)
+    foo ();
+}
+