[llvm] b4bb2f8 - [LoopDeletion] Unblock loop deletion with `llvm.experimental.noalias.scope.decl` (#108144)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 11 01:46:15 PDT 2024
Author: Yingwei Zheng
Date: 2024-09-11T16:46:12+08:00
New Revision: b4bb2f8aef01aeab8bf4fd164ed14a2c083d2858
URL: https://github.com/llvm/llvm-project/commit/b4bb2f8aef01aeab8bf4fd164ed14a2c083d2858
DIFF: https://github.com/llvm/llvm-project/commit/b4bb2f8aef01aeab8bf4fd164ed14a2c083d2858.diff
LOG: [LoopDeletion] Unblock loop deletion with `llvm.experimental.noalias.scope.decl` (#108144)
Since `llvm.experimental.noalias.scope.decl` is marked as
`memory(inaccessiblemem: readwrite)`, we cannot treat this annotation
intrinsic as having no side effects. It will block loop deletion when
this intrinsic exists inside a dead loop:
https://github.com/llvm/llvm-project/blob/3dad29b677e427bf69c035605a16efd065576829/llvm/lib/Transforms/Scalar/LoopDeletion.cpp#L103-L110
This patch marks `llvm.experimental.noalias.scope.decl` as droppable to
address the issue.
Fixes https://github.com/llvm/llvm-project/issues/108052.
Added:
llvm/test/Transforms/LoopDeletion/noalias.ll
Modified:
llvm/lib/IR/User.cpp
Removed:
################################################################################
diff --git a/llvm/lib/IR/User.cpp b/llvm/lib/IR/User.cpp
index 637af7aaa24530..00dd9c72c469cb 100644
--- a/llvm/lib/IR/User.cpp
+++ b/llvm/lib/IR/User.cpp
@@ -113,7 +113,17 @@ MutableArrayRef<uint8_t> User::getDescriptor() {
}
bool User::isDroppable() const {
- return isa<AssumeInst>(this) || isa<PseudoProbeInst>(this);
+ if (auto *II = dyn_cast<IntrinsicInst>(this)) {
+ switch (II->getIntrinsicID()) {
+ default:
+ return false;
+ case Intrinsic::assume:
+ case Intrinsic::pseudoprobe:
+ case Intrinsic::experimental_noalias_scope_decl:
+ return true;
+ }
+ }
+ return false;
}
//===----------------------------------------------------------------------===//
diff --git a/llvm/test/Transforms/LoopDeletion/noalias.ll b/llvm/test/Transforms/LoopDeletion/noalias.ll
new file mode 100644
index 00000000000000..0f3b71df942708
--- /dev/null
+++ b/llvm/test/Transforms/LoopDeletion/noalias.ll
@@ -0,0 +1,28 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=loop-deletion -S | FileCheck %s
+
+define void @pr108052(i64 %n) {
+; CHECK-LABEL: define void @pr108052(
+; CHECK-SAME: i64 [[N:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: br label %[[FOR_EXIT:.*]]
+; CHECK: [[FOR_EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %for.body
+
+for.exit:
+ ret void
+
+for.body:
+ %indvar = phi i64 [ 0, %entry ], [ %inc, %for.body ]
+ call void @llvm.experimental.noalias.scope.decl(metadata !0)
+ %inc = add nuw i64 %indvar, 1
+ %exitcond.not = icmp eq i64 %inc, %n
+ br i1 %exitcond.not, label %for.exit, label %for.body
+}
+
+!0 = !{!1}
+!1 = distinct !{!1, !2, !"x: %a"}
+!2 = distinct !{!2, !"x"}
More information about the llvm-commits
mailing list