[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