[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