https://gcc.gnu.org/g:a6cfde60d8c744b31b147022e797bbcc371ae092

commit r16-306-ga6cfde60d8c744b31b147022e797bbcc371ae092
Author: Richard Biener <rguent...@suse.de>
Date:   Tue Apr 29 14:52:27 2025 +0200

    tree-optimization/119960 - fix and guard get_later_stmt
    
    The following makes get_later_stmt handle stmts from different
    basic-blocks in the case they are orderd and otherwise asserts.
    
            * tree-vectorizer.h (get_later_stmt): Robustify against
            stmts in different BBs, assert when they are unordered.

Diff:
---
 gcc/tree-vectorizer.h | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 01d19c776561..94cbfde6c9a7 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -1870,11 +1870,25 @@ vect_orig_stmt (stmt_vec_info stmt_info)
 inline stmt_vec_info
 get_later_stmt (stmt_vec_info stmt1_info, stmt_vec_info stmt2_info)
 {
-  if (gimple_uid (vect_orig_stmt (stmt1_info)->stmt)
-      > gimple_uid (vect_orig_stmt (stmt2_info)->stmt))
+  gimple *stmt1 = vect_orig_stmt (stmt1_info)->stmt;
+  gimple *stmt2 = vect_orig_stmt (stmt2_info)->stmt;
+  if (gimple_bb (stmt1) == gimple_bb (stmt2))
+    {
+      if (gimple_uid (stmt1) > gimple_uid (stmt2))
+       return stmt1_info;
+      else
+       return stmt2_info;
+    }
+  /* ???  We should be really calling this function only with stmts
+     in the same BB but we can recover if there's a domination
+     relationship between them.  */
+  else if (dominated_by_p (CDI_DOMINATORS,
+                          gimple_bb (stmt1), gimple_bb (stmt2)))
     return stmt1_info;
-  else
+  else if (dominated_by_p (CDI_DOMINATORS,
+                          gimple_bb (stmt2), gimple_bb (stmt1)))
     return stmt2_info;
+  gcc_unreachable ();
 }
 
 /* If STMT_INFO has been replaced by a pattern statement, return the

Reply via email to