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