[llvm] [IRCE] Fix '"Instruction does not dominate all uses!" after IRCE pass #63984' (PR #136505)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 21 02:02:56 PDT 2025
https://github.com/Zentrik updated https://github.com/llvm/llvm-project/pull/136505
>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 1/3] 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;
>From b167a5ac25373b9232c0544df3247d23b34b2384 Mon Sep 17 00:00:00 2001
From: Zentrik <llvm.zentrik at gmail.com>
Date: Mon, 21 Apr 2025 09:47:03 +0100
Subject: [PATCH 2/3] Add test following
`llvm-project/llvm/test/Transforms/IRCE/pr89959.ll`
---
llvm/test/Transforms/IRCE/undef.ll | 58 ++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
create mode 100644 llvm/test/Transforms/IRCE/undef.ll
diff --git a/llvm/test/Transforms/IRCE/undef.ll b/llvm/test/Transforms/IRCE/undef.ll
new file mode 100644
index 0000000000000..22d6c32a02347
--- /dev/null
+++ b/llvm/test/Transforms/IRCE/undef.ll
@@ -0,0 +1,58 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes=irce -S < %s 2>&1 | FileCheck %s
+
+; Make sure we don't crash.
+define swiftcc void @wombat() {
+; CHECK-LABEL: define swiftcc void @wombat() {
+; CHECK-NEXT: [[BB:.*]]:
+; CHECK-NEXT: br label %[[BB1:.*]]
+; CHECK: [[BB1]]:
+; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ [[ADD:%.*]], %[[BB7:.*]] ], [ 1, %[[BB]] ]
+; CHECK-NEXT: [[ICMP:%.*]] = icmp ult i64 [[PHI]], undef
+; CHECK-NEXT: br i1 [[ICMP]], label %[[BB3:.*]], label %[[BB2:.*]]
+; CHECK: [[BB2]]:
+; CHECK-NEXT: unreachable
+; CHECK: [[BB3]]:
+; CHECK-NEXT: [[CALL5:%.*]] = call token (...) @llvm.gc_preserve_begin(ptr null)
+; CHECK-NEXT: br i1 true, label %[[BB7]], label %[[BB6:.*]]
+; CHECK: [[BB6]]:
+; CHECK-NEXT: call void @llvm.gc_preserve_end(token [[CALL5]])
+; CHECK-NEXT: unreachable
+; CHECK: [[BB7]]:
+; CHECK-NEXT: [[ICMP8:%.*]] = icmp eq i64 [[PHI]], 1
+; CHECK-NEXT: [[ADD]] = add i64 [[PHI]], 1
+; CHECK-NEXT: br i1 [[ICMP8]], label %[[BB9:.*]], label %[[BB1]]
+; CHECK: [[BB9]]:
+; CHECK-NEXT: unreachable
+;
+bb:
+ br label %bb1
+
+bb1: ; preds = %bb7, %bb
+ %phi = phi i64 [ %add, %bb7 ], [ 1, %bb ]
+ %icmp = icmp ult i64 %phi, undef
+ br i1 %icmp, label %bb3, label %bb2
+
+bb2: ; preds = %bb1
+ unreachable
+
+bb3: ; preds = %bb1
+ %call5 = call token (...) @llvm.gc_preserve_begin(ptr null)
+ br i1 false, label %bb6, label %bb7
+
+bb6: ; preds = %bb3
+ call void @llvm.gc_preserve_end(token %call5)
+ unreachable
+
+bb7: ; preds = %bb3
+ %icmp8 = icmp eq i64 %phi, 1
+ %add = add i64 %phi, 1
+ br i1 %icmp8, label %bb9, label %bb1
+
+bb9: ; preds = %bb7
+ unreachable
+}
+
+declare token @llvm.gc_preserve_begin(...)
+
+declare void @llvm.gc_preserve_end(token)
>From 4609f3782f705ee319286fa523fe252ae310dff3 Mon Sep 17 00:00:00 2001
From: Zentrik <llvm.zentrik at gmail.com>
Date: Mon, 21 Apr 2025 10:01:30 +0100
Subject: [PATCH 3/3] Simplify code
---
.../Transforms/Scalar/InductiveRangeCheckElimination.cpp | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
index 4da816bea5870..4d0e5a61db9a4 100644
--- a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -267,11 +267,7 @@ bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
const SCEV *&End) {
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);
+ return SE.isLoopInvariant(S, L) && !SE.containsUndefs(S);
};
ICmpInst::Predicate Pred = ICI->getPredicate();
More information about the llvm-commits
mailing list