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

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

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
  

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 ();
+}
+