-
Notifications
You must be signed in to change notification settings - Fork 12.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[IRCE] Skip icmp ptr in InductiveRangeCheck::parseRangeCheckICmp
#89967
Conversation
@llvm/pr-subscribers-llvm-transforms Author: Yingwei Zheng (dtcxzyw) ChangesFixes #89959. Full diff: https://github.com/llvm/llvm-project/pull/89967.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
index 9df28747570c4d..661d42b87cda94 100644
--- a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -279,6 +279,10 @@ bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
Value *LHS = ICI->getOperand(0);
Value *RHS = ICI->getOperand(1);
+ // ICmp with pointers are unsupported.
+ if (LHS->getType()->isPtrOrPtrVectorTy())
+ return false;
+
// Canonicalize to the `Index Pred Invariant` comparison
if (IsLoopInvariant(LHS)) {
std::swap(LHS, RHS);
diff --git a/llvm/test/Transforms/IRCE/pr89959.ll b/llvm/test/Transforms/IRCE/pr89959.ll
new file mode 100644
index 00000000000000..dc7c0dfbc57a97
--- /dev/null
+++ b/llvm/test/Transforms/IRCE/pr89959.ll
@@ -0,0 +1,33 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
+; RUN: opt -passes=irce -S < %s 2>&1 | FileCheck %s
+
+; Make sure we don't crash.
+define void @pr89959() {
+; CHECK-LABEL: define void @pr89959() {
+; CHECK-NEXT: top:
+; CHECK-NEXT: br label [[L3:%.*]]
+; CHECK: L3:
+; CHECK-NEXT: [[VALUE_PHI:%.*]] = phi ptr [ null, [[TOP:%.*]] ], [ [[TMP0:%.*]], [[L13:%.*]] ]
+; CHECK-NEXT: [[TMP0]] = getelementptr i8, ptr [[VALUE_PHI]], i64 8
+; CHECK-NEXT: [[DOTNOT:%.*]] = icmp ule ptr [[VALUE_PHI]], null
+; CHECK-NEXT: br i1 [[DOTNOT]], label [[L13]], label [[L15:%.*]]
+; CHECK: L13:
+; CHECK-NEXT: br label [[L3]]
+; CHECK: L15:
+; CHECK-NEXT: ret void
+;
+top:
+ br label %L3
+
+L3:
+ %value_phi = phi ptr [ null, %top ], [ %0, %L13 ]
+ %0 = getelementptr i8, ptr %value_phi, i64 8
+ %.not = icmp ule ptr %value_phi, null
+ br i1 %.not, label %L13, label %L15
+
+L13:
+ br label %L3
+
+L15:
+ ret void
+}
|
@@ -279,6 +279,9 @@ bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI, | |||
Value *LHS = ICI->getOperand(0); | |||
Value *RHS = ICI->getOperand(1); | |||
|
|||
if (!LHS->getType()->isIntegerTy()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better to use SE->isSCEVable(LHS->getType())
as it makes the intention more explicit?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pointer type is SCEVable, but willNotOverflow
only supports binops with integers.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah my bad, thanks for clarifying
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
…lvm#89967) Fixes llvm#89959. (cherry picked from commit 22da5a6)
…lvm#89967) Fixes llvm#89959. (cherry picked from commit 22da5a6)
Fixes #89959.