[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:

3dad29b677/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.
This commit is contained in:
Yingwei Zheng 2024-09-11 16:46:12 +08:00 committed by GitHub
parent 300161761d
commit b4bb2f8aef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 1 deletions

View File

@ -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;
}
//===----------------------------------------------------------------------===//

View File

@ -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"}