Index: llvm/test/tools/llvm-reduce/remove-bbs-sequence.ll =================================================================== --- llvm/test/tools/llvm-reduce/remove-bbs-sequence.ll +++ llvm/test/tools/llvm-reduce/remove-bbs-sequence.ll @@ -1,4 +1,4 @@ -; RUN: llvm-reduce -abort-on-invalid-reduction --delta-passes=basic-blocks --test %python --test-arg %p/remove-bbs-sequence.py %s -o %t +; RUN: llvm-reduce -abort-on-invalid-reduction --delta-passes=basic-blocks,simplify-cfg --test %python --test-arg %p/remove-bbs-sequence.py %s -o %t ; RUN: FileCheck %s < %t ; The interestingness test is that the CFG contains a loop. Verify that the @@ -20,11 +20,9 @@ ; CHECK:define void @main() { ; CHECK-NEXT: bb0: -; CHECK-NEXT: br label %bb1 -; CHECK-EMPTY: -; CHECK-NEXT: bb1: ; CHECK-NEXT: br label %bb4 ; CHECK-EMPTY: ; CHECK-NEXT: bb4: -; CHECK-NEXT: br label %bb1 +; CHECK-NEXT: %phi = phi i32 [ undef, %bb0 ], [ undef, %bb4 ] +; CHECK-NEXT: br label %bb4 ; CHECK-NEXT:} Index: llvm/test/tools/llvm-reduce/remove-bbs-unwinded-to.ll =================================================================== --- llvm/test/tools/llvm-reduce/remove-bbs-unwinded-to.ll +++ llvm/test/tools/llvm-reduce/remove-bbs-unwinded-to.ll @@ -1,5 +1,8 @@ -; RUN: llvm-reduce --delta-passes=basic-blocks --test FileCheck --test-arg --check-prefixes=CHECK-ALL,CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t -; RUN: cat %t | FileCheck --check-prefixes=CHECK-ALL,CHECK-FINAL %s +; RUN: llvm-reduce -abort-on-invalid-reduction --delta-passes=basic-blocks --test FileCheck --test-arg --check-prefixes=CHECK-ALL,CHECK-INTERESTINGNESS0 --test-arg %s --test-arg --input-file %s -o %t.0 +; RUN: FileCheck --check-prefixes=CHECK-ALL,CHECK-FINAL0 %s < %t.0 + +; RUN: llvm-reduce -abort-on-invalid-reduction --delta-passes=basic-blocks --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS1 --test-arg %s --test-arg --input-file %s -o %t.1 +; RUN: FileCheck --check-prefixes=CHECK-ALL,CHECK-FINAL1 %s < %t.1 declare i32 @maybe_throwing_callee() @@ -11,29 +14,43 @@ ; CHECK-ALL: define void @caller() define void @caller() personality ptr @__gxx_personality_v0 { ; CHECK-ALL: bb: +; CHECK-FINAL1-NEXT: br label %bb1 bb: -; CHECK-INTERESTINGNESS: label %bb3 -; CHECK-FINAL: br label %bb3 +; CHECK-INTERESTINGNESS0: label %bb3 +; CHECK-FINAL0: br label %bb3 %i0 = invoke i32 @maybe_throwing_callee() to label %bb3 unwind label %bb1 bb1: landingpad { ptr, i32 } catch ptr null +; CHECK-INTERESTINGNESS1: call void @thrown() + +; CHECK-FINAL1: bb1: +; CHECK-FINAL1-NEXT: call void @thrown() +; CHECK-FINAL1-NEXT: ret void call void @thrown() br label %bb4 -; CHECK-ALL: bb3: +; CHECK-INTERESTINGNESS0: bb3: +; CHECK-FINAL0: bb3: bb3: -; CHECK-INTERESTINGNESS: call void @did_not_throw(i32 -; CHECK-FINAL: call void @did_not_throw(i32 0) -; CHECK-ALL: br label %bb4 +; CHECK-INTERESTINGNESS0: call void @did_not_throw(i32 +; CHECK-INTERESTINGNESS0: br label %bb4 + +; CHECK-FINAL0: call void @did_not_throw(i32 0) +; CHECK-FINAL0: br label %bb4 + call void @did_not_throw(i32 %i0) br label %bb4 -; CHECK-ALL: bb4: -; CHECK-ALL: ret void +; RESULT0: bb4: +; RESULT0-NEXT: ret void + +; CHECK-INTERESTINGNESS0: bb4: +; CHECK-INTERESTINGNESS0-NEXT: ret void bb4: ret void } + declare i32 @__gxx_personality_v0(...) Index: llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp =================================================================== --- llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp +++ llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp @@ -39,7 +39,14 @@ if (ChunkSuccessors.size() == Term->getNumSuccessors()) return; - bool IsBranch = isa(Term) || isa(Term); + bool IsBranch = isa(Term); + if (InvokeInst *Invoke = dyn_cast(Term)) { + LandingPadInst *LP = Invoke->getLandingPadInst(); + LP->replaceAllUsesWith(getDefaultValue(LP->getType())); + LP->eraseFromParent(); + IsBranch = true; + } + Value *Address = nullptr; if (auto *IndBI = dyn_cast(Term)) Address = IndBI->getAddress(); @@ -48,18 +55,6 @@ Term->eraseFromParent(); if (ChunkSuccessors.empty()) { - // Scan forward in BB list to try find a block that is kept. - Function &F = *BB.getParent(); - Function::iterator FI = BB.getIterator(); - FI++; - while (FI != F.end()) { - auto &FIB = *FI; - if (BBsToKeep.count(&FIB) && !isa(FIB.begin())) { - BranchInst::Create(&FIB, &BB); - return; - } - FI++; - } // If that fails then resort to replacing with a ret. auto *FnRetTy = BB.getParent()->getReturnType(); ReturnInst::Create(BB.getContext(),