[llvm] IRCE: Fix '"Instruction does not dominate all uses!" after IRCE pass #63984' (PR #136505)

via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 20 12:52:30 PDT 2025


https://github.com/Zentrik created https://github.com/llvm/llvm-project/pull/136505

upstream/main

>From 785d00ee5771cf842643f80f262b32f160b24aed Mon Sep 17 00:00:00 2001
From: Zentrik <llvm.zentrik at gmail.com>
Date: Sun, 20 Apr 2025 20:50:02 +0100
Subject: [PATCH] IRCE: Fix '"Instruction does not dominate all uses!" after
 IRCE pass #63984'

---
 .../Scalar/InductiveRangeCheckElimination.cpp       | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
index e706a6f83b1e7..4da816bea5870 100644
--- a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -265,8 +265,13 @@ bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
                                               ScalarEvolution &SE,
                                               const SCEVAddRecExpr *&Index,
                                               const SCEV *&End) {
-  auto IsLoopInvariant = [&SE, L](Value *V) {
-    return SE.isLoopInvariant(SE.getSCEV(V), L);
+  auto IsLoopInvariantAndNotUndef = [&SE, L](Value *V) {
+    const SCEV *S = SE.getSCEV(V);
+
+    if (isa<SCEVCouldNotCompute>(S))
+      return false;
+
+    return SE.isLoopInvariant(SE.getSCEV(V), L) && !SE.containsUndefs(S);
   };
 
   ICmpInst::Predicate Pred = ICI->getPredicate();
@@ -277,10 +282,10 @@ bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
     return false;
 
   // Canonicalize to the `Index Pred Invariant` comparison
-  if (IsLoopInvariant(LHS)) {
+  if (IsLoopInvariantAndNotUndef(LHS)) {
     std::swap(LHS, RHS);
     Pred = CmpInst::getSwappedPredicate(Pred);
-  } else if (!IsLoopInvariant(RHS))
+  } else if (!IsLoopInvariantAndNotUndef(RHS))
     // Both LHS and RHS are loop variant
     return false;
 



More information about the llvm-commits mailing list