--- /dev/null
+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)
--- /dev/null
+; 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
+}
// 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())
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();
}