From 4923b4dbaca386b532c80f0572c2d6a0547a2a3d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Mar 2023 12:55:02 +0100 Subject: [PATCH] [Local] Check for null VH in RecursivelyDeleteTriviallyDeadInstructionsPermissive() Peculiarly, the non-permissive variant handled this gracefully, but the permissive one did not. --- llvm/lib/Transforms/Utils/Local.cpp | 2 +- .../ArgumentPromotion/propagate-remove-dead-args.ll | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 31deb08..848db3f 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -555,7 +555,7 @@ bool llvm::RecursivelyDeleteTriviallyDeadInstructionsPermissive( std::function AboutToDeleteCallback) { unsigned S = 0, E = DeadInsts.size(), Alive = 0; for (; S != E; ++S) { - auto *I = dyn_cast(DeadInsts[S]); + auto *I = dyn_cast_or_null(DeadInsts[S]); if (!I || !isInstructionTriviallyDead(I)) { DeadInsts[S] = nullptr; ++Alive; diff --git a/llvm/test/Transforms/ArgumentPromotion/propagate-remove-dead-args.ll b/llvm/test/Transforms/ArgumentPromotion/propagate-remove-dead-args.ll index 4176a8a..87a1453 100644 --- a/llvm/test/Transforms/ArgumentPromotion/propagate-remove-dead-args.ll +++ b/llvm/test/Transforms/ArgumentPromotion/propagate-remove-dead-args.ll @@ -57,3 +57,20 @@ entry: ret void } +define internal ptr @callee(ptr %dead) { +; CHECK-LABEL: define internal ptr @callee() { +; CHECK-NEXT: ret ptr null +; + ret ptr null +} + +define void @caller() { +; CHECK-LABEL: define void @caller() { +; CHECK-NEXT: [[TMP1:%.*]] = call ptr @callee() +; CHECK-NEXT: [[TMP2:%.*]] = call ptr @callee() +; CHECK-NEXT: ret void +; + %ret = call ptr @callee(ptr null) + %ret2 = call ptr @callee(ptr %ret) + ret void +} -- 2.7.4