
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.
29 lines
763 B
LLVM
29 lines
763 B
LLVM
; 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"}
|