[Local] Check for null VH in RecursivelyDeleteTriviallyDeadInstructionsPermissive()
authorNikita Popov <npopov@redhat.com>
Fri, 24 Mar 2023 11:55:02 +0000 (12:55 +0100)
committerNikita Popov <npopov@redhat.com>
Fri, 24 Mar 2023 11:56:06 +0000 (12:56 +0100)
Peculiarly, the non-permissive variant handled this gracefully,
but the permissive one did not.

llvm/lib/Transforms/Utils/Local.cpp
llvm/test/Transforms/ArgumentPromotion/propagate-remove-dead-args.ll

index 31deb08..848db3f 100644 (file)
@@ -555,7 +555,7 @@ bool llvm::RecursivelyDeleteTriviallyDeadInstructionsPermissive(
     std::function<void(Value *)> AboutToDeleteCallback) {
   unsigned S = 0, E = DeadInsts.size(), Alive = 0;
   for (; S != E; ++S) {
-    auto *I = dyn_cast<Instruction>(DeadInsts[S]);
+    auto *I = dyn_cast_or_null<Instruction>(DeadInsts[S]);
     if (!I || !isInstructionTriviallyDead(I)) {
       DeadInsts[S] = nullptr;
       ++Alive;
index 4176a8a..87a1453 100644 (file)
@@ -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
+}