[llvm] af1dd0b - [Reduce] Basic block reduction: do properly handle invoke insts (PR46818)

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 25 15:32:22 PDT 2020


Author: Roman Lebedev
Date: 2020-07-26T01:28:59+03:00
New Revision: af1dd0b1adc40e62bd922673af3741ad66989eee

URL: https://github.com/llvm/llvm-project/commit/af1dd0b1adc40e62bd922673af3741ad66989eee
DIFF: https://github.com/llvm/llvm-project/commit/af1dd0b1adc40e62bd922673af3741ad66989eee.diff

LOG: [Reduce] Basic block reduction: do properly handle invoke insts (PR46818)

Terminator may have returned value, so we need to replace uses,
and in general handle invoke as a branch inst.

I'm not sure this is the best handling, but IMO poorly reduced
input is much better than crashing reduction tool.
A (previously-crashing!) test added.

Fixes https://bugs.llvm.org/show_bug.cgi?id=46818

Added: 
    llvm/test/Reduce/remove-bbs-unwinded-to.ll

Modified: 
    llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/Reduce/remove-bbs-unwinded-to.ll b/llvm/test/Reduce/remove-bbs-unwinded-to.ll
new file mode 100644
index 000000000000..375678ec99c9
--- /dev/null
+++ b/llvm/test/Reduce/remove-bbs-unwinded-to.ll
@@ -0,0 +1,39 @@
+; RUN: llvm-reduce --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
+
+declare i32 @maybe_throwing_callee()
+
+; CHECK-ALL: declare void @did_not_throw(i32)
+declare void @did_not_throw(i32)
+
+declare void @thrown()
+
+; CHECK-ALL: define void @caller()
+define void @caller() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+; CHECK-ALL: bb:
+bb:
+; CHECK-INTERESTINGNESS: label %bb3
+; CHECK-FINAL: br label %bb3
+  %i0 = invoke i32 @maybe_throwing_callee()
+          to label %bb3 unwind label %bb1
+
+bb1:
+  landingpad { i8*, i32 } catch i8* null
+  call void @thrown()
+  br label %bb4
+
+; CHECK-ALL: bb3:
+bb3:
+; CHECK-INTERESTINGNESS: call void @did_not_throw(i32
+; CHECK-FINAL: call void @did_not_throw(i32 undef)
+; CHECK-ALL: br label %bb4
+  call void @did_not_throw(i32 %i0)
+  br label %bb4
+
+; CHECK-ALL: bb4:
+; CHECK-ALL: ret void
+bb4:
+  ret void
+}
+
+declare i32 @__gxx_personality_v0(...)

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp
index 002d81a67487..9dee738d4906 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp
@@ -36,11 +36,12 @@ static void replaceBranchTerminator(BasicBlock &BB,
   if (ChunkSucessors.size() == Term->getNumSuccessors())
     return;
 
-  bool IsBranch = isa<BranchInst>(Term);
+  bool IsBranch = isa<BranchInst>(Term) || isa<InvokeInst>(Term);
   Value *Address = nullptr;
   if (auto IndBI = dyn_cast<IndirectBrInst>(Term))
     Address = IndBI->getAddress();
 
+  Term->replaceAllUsesWith(UndefValue::get(Term->getType()));
   Term->eraseFromParent();
 
   if (ChunkSucessors.empty()) {


        


More information about the llvm-commits mailing list