diff --git a/llvm/test/tools/llvm-reduce/invoke-with-missing-landingpad.ll b/llvm/test/tools/llvm-reduce/invoke-with-missing-landingpad.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/invoke-with-missing-landingpad.ll @@ -0,0 +1,37 @@ +; RUN: llvm-reduce --delta-passes=basic-blocks --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -abort-on-invalid-reduction -o %t +; RUN: FileCheck <%t %s + +; CHECK-INTERESTINGNESS: call void @foo() + +; CHECK: define void @test() personality ptr null { +; CHECK-NEXT: entry: +; CHECK-NEXT: br label %cont +; CHECK-EMPTY: +; CHECK-NEXT: cont: +; CHECK-NEXT: br label %exit +; CHECK-EMPTY: +; CHECK-NEXT: exit: +; CHECK-NEXT: call void @foo() +; CHECK-NEXT: ret void +; CHECK-NEXT: } + +define void @test() personality ptr null { +entry: + invoke void @foo() + to label %cont unwind label %lpad + +cont: + invoke void @foo() + to label %exit unwind label %lpad + +lpad: + %0 = landingpad { ptr, i32 } + cleanup + ret void + +exit: + call void @foo() + ret void +} + +declare void @foo() diff --git a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp --- a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp @@ -48,8 +48,20 @@ bool IsBranch = isa(Term); if (InvokeInst *Invoke = dyn_cast(Term)) { LandingPadInst *LP = Invoke->getLandingPadInst(); - LP->replaceAllUsesWith(getDefaultValue(LP->getType())); - LP->eraseFromParent(); + // Remove landingpad instruction if the containing block isn't used by other + // invokes. + if (none_of(LP->getParent()->users(), [Invoke](User *U) { + return U != Invoke && isa(U); + })) { + LP->replaceAllUsesWith(getDefaultValue(LP->getType())); + LP->eraseFromParent(); + } else if (!ChunkSuccessors.empty() && + ChunkSuccessors[0] == LP->getParent()) { + // If the selected successor is the landing pad, clear the chunk + // successors to avoid creating a regular branch to the landing pad which + // would result in invalid IR. + ChunkSuccessors.clear(); + } IsBranch = true; }