[llvm] f804bd5 - [llvm-reduce] extractGVsFromModule(): don't crash when deleting instr twice
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 4 15:02:26 PDT 2020
Author: Roman Lebedev
Date: 2020-07-05T01:01:46+03:00
New Revision: f804bd586ee58199db4cfb2da8e9ef067425900b
URL: https://github.com/llvm/llvm-project/commit/f804bd586ee58199db4cfb2da8e9ef067425900b
DIFF: https://github.com/llvm/llvm-project/commit/f804bd586ee58199db4cfb2da8e9ef067425900b.diff
LOG: [llvm-reduce] extractGVsFromModule(): don't crash when deleting instr twice
As it can be seen in newly-added (previously-crashing) test-case,
there can be a situation where multiple GV's are used in instr,
and we would schedule the same instruction to be deleted several times,
crashing when trying to delete it the second time.
We could either store WeakVH (done here), or use something set-like.
I think using WeakVH is prevalent in these cases elsewhere.
Added:
llvm/test/Reduce/Inputs/remove-multiple-use-of-global-vars-in-same-instruction.py
llvm/test/Reduce/remove-multiple-use-of-global-vars-in-same-instruction.ll
Modified:
llvm/tools/llvm-reduce/deltas/ReduceGlobalVars.cpp
Removed:
################################################################################
diff --git a/llvm/test/Reduce/Inputs/remove-multiple-use-of-global-vars-in-same-instruction.py b/llvm/test/Reduce/Inputs/remove-multiple-use-of-global-vars-in-same-instruction.py
new file mode 100644
index 000000000000..93fa5c0bc29e
--- /dev/null
+++ b/llvm/test/Reduce/Inputs/remove-multiple-use-of-global-vars-in-same-instruction.py
@@ -0,0 +1,13 @@
+import sys
+
+FunctionCallPresent = False
+
+input = open(sys.argv[1], "r")
+for line in input:
+ if "call void @use" in line:
+ FunctionCallPresent = True
+
+if FunctionCallPresent:
+ sys.exit(0) # Interesting!
+
+sys.exit(1)
diff --git a/llvm/test/Reduce/remove-multiple-use-of-global-vars-in-same-instruction.ll b/llvm/test/Reduce/remove-multiple-use-of-global-vars-in-same-instruction.ll
new file mode 100644
index 000000000000..c8b639099fd3
--- /dev/null
+++ b/llvm/test/Reduce/remove-multiple-use-of-global-vars-in-same-instruction.ll
@@ -0,0 +1,24 @@
+; Test that llvm-reduce can remove uninteresting function arguments from function definitions as well as their calls.
+;
+; RUN: rm -rf %t
+; RUN: llvm-reduce --test %python --test-arg %p/Inputs/remove-multiple-use-of-global-vars-in-same-instruction.py %s -o %t
+; RUN: cat %t | FileCheck -implicit-check-not=uninteresting %s
+
+; CHECK: @uninteresting1 = global
+; CHECK: @uninteresting2 = global
+; CHECK: @uninteresting3 = global
+ at uninteresting1 = global i32 0, align 4
+ at uninteresting2 = global i32 0, align 4
+ at uninteresting3 = global i32 0, align 4
+
+declare void @use(i32*, i32*, i32*)
+
+; CHECK-LABEL: @interesting()
+define void @interesting() {
+entry:
+ ; CHECK: call void @use(i32* @uninteresting1, i32* @uninteresting2, i32* @uninteresting3)
+ call void @use(i32* @uninteresting1, i32* @uninteresting2, i32* @uninteresting3)
+ call void @use(i32* @uninteresting1, i32* @uninteresting2, i32* @uninteresting3)
+ call void @use(i32* @uninteresting1, i32* @uninteresting2, i32* @uninteresting3)
+ ret void
+}
diff --git a/llvm/tools/llvm-reduce/deltas/ReduceGlobalVars.cpp b/llvm/tools/llvm-reduce/deltas/ReduceGlobalVars.cpp
index 843ca46458f5..55d732cfec98 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceGlobalVars.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceGlobalVars.cpp
@@ -33,7 +33,7 @@ static void extractGVsFromModule(std::vector<Chunk> ChunksToKeep,
// Delete out-of-chunk GVs and their uses
std::vector<GlobalVariable *> ToRemove;
- std::vector<Instruction *> InstToRemove;
+ std::vector<WeakVH> InstToRemove;
for (auto &GV : Program->globals())
if (GV.hasInitializer() && !GVsToKeep.count(&GV)) {
for (auto U : GV.users())
@@ -44,8 +44,11 @@ static void extractGVsFromModule(std::vector<Chunk> ChunksToKeep,
ToRemove.push_back(&GV);
}
- // Delete Instruction uses of unwanted GVs
- for (auto *Inst : InstToRemove) {
+ // Delete (unique) Instruction uses of unwanted GVs
+ for (Value *V : InstToRemove) {
+ if (!V)
+ continue;
+ auto *Inst = cast<Instruction>(V);
Inst->replaceAllUsesWith(UndefValue::get(Inst->getType()));
Inst->eraseFromParent();
}
More information about the llvm-commits
mailing list