[llvm] fbbb688 - [llvm-reduce] extractArgumentsFromModule(): don't crash when deleting instr twice

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 4 14:53:02 PDT 2020


Author: Roman Lebedev
Date: 2020-07-05T00:52:42+03:00
New Revision: fbbb6884e108419692a88e28eeeaa92cfbc08122

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

LOG: [llvm-reduce] extractArgumentsFromModule(): 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 arguments 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-args-in-same-instruction.py
    llvm/test/Reduce/remove-multiple-use-of-args-in-same-instruction.ll

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

Removed: 
    


################################################################################
diff  --git a/llvm/test/Reduce/Inputs/remove-multiple-use-of-args-in-same-instruction.py b/llvm/test/Reduce/Inputs/remove-multiple-use-of-args-in-same-instruction.py
new file mode 100644
index 000000000000..93fa5c0bc29e
--- /dev/null
+++ b/llvm/test/Reduce/Inputs/remove-multiple-use-of-args-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-args-in-same-instruction.ll b/llvm/test/Reduce/remove-multiple-use-of-args-in-same-instruction.ll
new file mode 100644
index 000000000000..4d280bcf2f31
--- /dev/null
+++ b/llvm/test/Reduce/remove-multiple-use-of-args-in-same-instruction.ll
@@ -0,0 +1,17 @@
+; 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-args-in-same-instruction.py %s -o %t
+; RUN: cat %t | FileCheck -implicit-check-not=uninteresting %s
+
+declare void @use(i32, i32, i32)
+
+; CHECK-LABEL: @interesting(i32 %uninteresting1, i32 %uninteresting2, i32 %uninteresting3
+define void @interesting(i32 %uninteresting1, i32 %uninteresting2, i32 %uninteresting3) {
+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/ReduceArguments.cpp b/llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp
index d5f60aad36bc..b7d92049a67a 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp
@@ -60,7 +60,7 @@ static void extractArgumentsFromModule(std::vector<Chunk> ChunksToKeep,
 
   for (auto *F : Funcs) {
     ValueToValueMapTy VMap;
-    std::vector<Instruction *> InstToDelete;
+    std::vector<WeakVH> InstToDelete;
     for (auto &A : F->args())
       if (!ArgsToKeep.count(&A)) {
         // By adding undesired arguments to the VMap, CloneFunction will remove
@@ -70,8 +70,11 @@ static void extractArgumentsFromModule(std::vector<Chunk> ChunksToKeep,
           if (auto *I = dyn_cast<Instruction>(*&U))
             InstToDelete.push_back(I);
       }
-    // Delete any instruction that uses the argument
-    for (auto *I : InstToDelete) {
+    // Delete any (unique) instruction that uses the argument
+    for (Value *V : InstToDelete) {
+      if (!V)
+        continue;
+      auto *I = cast<Instruction>(V);
       I->replaceAllUsesWith(UndefValue::get(I->getType()));
       I->eraseFromParent();
     }


        


More information about the llvm-commits mailing list