From b4bb2f8aef01aeab8bf4fd164ed14a2c083d2858 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Wed, 11 Sep 2024 16:46:12 +0800 Subject: [PATCH] [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. --- llvm/lib/IR/User.cpp | 12 ++++++++- llvm/test/Transforms/LoopDeletion/noalias.ll | 28 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Transforms/LoopDeletion/noalias.ll diff --git a/llvm/lib/IR/User.cpp b/llvm/lib/IR/User.cpp index 637af7aaa245..00dd9c72c469 100644 --- a/llvm/lib/IR/User.cpp +++ b/llvm/lib/IR/User.cpp @@ -113,7 +113,17 @@ MutableArrayRef User::getDescriptor() { } bool User::isDroppable() const { - return isa(this) || isa(this); + if (auto *II = dyn_cast(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 000000000000..0f3b71df9427 --- /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"}