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 00000000000000..93fa5c0bc29e7d --- /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 00000000000000..c8b639099fd33f --- /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 +@uninteresting1 = global i32 0, align 4 +@uninteresting2 = global i32 0, align 4 +@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 843ca46458f504..55d732cfec98b1 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 ChunksToKeep, // Delete out-of-chunk GVs and their uses std::vector ToRemove; - std::vector InstToRemove; + std::vector 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 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(V); Inst->replaceAllUsesWith(UndefValue::get(Inst->getType())); Inst->eraseFromParent(); }