[llvm] [LoopDeletion] Unblock loop deletion with `llvm.experimental.noalias.scope.decl` (PR #108144)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 10 21:30:31 PDT 2024


https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/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.


>From 5b11fe74f857a9d9a8cf4fe9c17ec1dee364fe56 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 11 Sep 2024 12:10:23 +0800
Subject: [PATCH 1/2] [LoopDeletion] Add pre-commit tests. NFC.

---
 llvm/test/Transforms/LoopDeletion/noalias.ll | 39 ++++++++++++++++++++
 1 file changed, 39 insertions(+)
 create mode 100644 llvm/test/Transforms/LoopDeletion/noalias.ll

diff --git a/llvm/test/Transforms/LoopDeletion/noalias.ll b/llvm/test/Transforms/LoopDeletion/noalias.ll
new file mode 100644
index 00000000000000..2551de7ad89eda
--- /dev/null
+++ b/llvm/test/Transforms/LoopDeletion/noalias.ll
@@ -0,0 +1,39 @@
+; 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_BODY:.*]]
+; CHECK:       [[FOR_EXIT:.*]]:
+; CHECK-NEXT:    ret void
+; CHECK:       [[FOR_BODY]]:
+; CHECK-NEXT:    [[INDVAR:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
+; CHECK-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])
+; CHECK-NEXT:    [[INC]] = add nuw i64 [[INDVAR]], 1
+; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], [[N]]
+; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_EXIT]], label %[[FOR_BODY]]
+;
+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"}
+;.
+; CHECK: [[META0]] = !{[[META1:![0-9]+]]}
+; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]], !"x: %a"}
+; CHECK: [[META2]] = distinct !{[[META2]], !"x"}
+;.

>From 4b32a7992f0dd50d2b10a48f84ab89fff5557db3 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 11 Sep 2024 12:19:49 +0800
Subject: [PATCH 2/2] [LoopDeletion] Unblock loop deletion with
 llvm.noalias.scope.decl

---
 llvm/lib/IR/User.cpp                         | 12 +++++++++++-
 llvm/test/Transforms/LoopDeletion/noalias.ll | 17 +++--------------
 2 files changed, 14 insertions(+), 15 deletions(-)

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
index 2551de7ad89eda..0f3b71df942708 100644
--- a/llvm/test/Transforms/LoopDeletion/noalias.ll
+++ b/llvm/test/Transforms/LoopDeletion/noalias.ll
@@ -4,16 +4,10 @@
 define void @pr108052(i64 %n) {
 ; CHECK-LABEL: define void @pr108052(
 ; CHECK-SAME: i64 [[N:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*]]:
-; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
-; CHECK:       [[FOR_EXIT:.*]]:
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br label %[[FOR_EXIT:.*]]
+; CHECK:       [[FOR_EXIT]]:
 ; CHECK-NEXT:    ret void
-; CHECK:       [[FOR_BODY]]:
-; CHECK-NEXT:    [[INDVAR:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
-; CHECK-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])
-; CHECK-NEXT:    [[INC]] = add nuw i64 [[INDVAR]], 1
-; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INC]], [[N]]
-; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[FOR_EXIT]], label %[[FOR_BODY]]
 ;
 entry:
   br label %for.body
@@ -32,8 +26,3 @@ for.body:
 !0 = !{!1}
 !1 = distinct !{!1, !2, !"x: %a"}
 !2 = distinct !{!2, !"x"}
-;.
-; CHECK: [[META0]] = !{[[META1:![0-9]+]]}
-; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]], !"x: %a"}
-; CHECK: [[META2]] = distinct !{[[META2]], !"x"}
-;.



More information about the llvm-commits mailing list