Index: llvm/trunk/test/Reduce/remove-funcs.ll =================================================================== --- llvm/trunk/test/Reduce/remove-funcs.ll +++ llvm/trunk/test/Reduce/remove-funcs.ll @@ -28,7 +28,4 @@ } ; CHECK-NOT: uninteresting3() -define i32 @uninteresting3() { -entry: - ret i32 10 -} +declare void @uninteresting3() Index: llvm/trunk/tools/llvm-reduce/deltas/ReduceFunctions.cpp =================================================================== --- llvm/trunk/tools/llvm-reduce/deltas/ReduceFunctions.cpp +++ llvm/trunk/tools/llvm-reduce/deltas/ReduceFunctions.cpp @@ -22,7 +22,7 @@ std::set FuncsToKeep; unsigned I = 0, FunctionCount = 0; for (auto &F : *Program) - if (!F.isDeclaration() && I < ChunksToKeep.size()) { + if (I < ChunksToKeep.size()) { if (ChunksToKeep[I].contains(++FunctionCount)) FuncsToKeep.insert(&F); if (FunctionCount == ChunksToKeep[I].end) @@ -31,41 +31,34 @@ // Delete out-of-chunk functions, and replace their calls with undef std::vector FuncsToRemove; + std::vector CallsToRemove; for (auto &F : *Program) - if (!F.isDeclaration() && !FuncsToKeep.count(&F)) { + if (!FuncsToKeep.count(&F)) { + for (auto U : F.users()) + if (auto *Call = dyn_cast(U)) { + Call->replaceAllUsesWith(UndefValue::get(Call->getType())); + CallsToRemove.push_back(Call); + } F.replaceAllUsesWith(UndefValue::get(F.getType())); FuncsToRemove.push_back(&F); } + for (auto *C : CallsToRemove) + C->eraseFromParent(); + for (auto *F : FuncsToRemove) F->eraseFromParent(); - - // Delete instructions with undef calls - std::vector InstToRemove; - for (auto &F : *Program) - for (auto &BB : F) - for (auto &I : BB) - if (auto *Call = dyn_cast(&I)) - if (!Call->getCalledFunction()) { - // Instruction might be stored / used somewhere else - I.replaceAllUsesWith(UndefValue::get(I.getType())); - InstToRemove.push_back(&I); - } - - for (auto *I : InstToRemove) - I->eraseFromParent(); } /// Counts the amount of non-declaration functions and prints their /// respective name & index -static unsigned countDefinedFunctions(Module *Program) { +static unsigned countFunctions(Module *Program) { // TODO: Silence index with --quiet flag outs() << "----------------------------\n"; outs() << "Function Index Reference:\n"; unsigned FunctionCount = 0; for (auto &F : *Program) - if (!F.isDeclaration()) - outs() << "\t" << ++FunctionCount << ": " << F.getName() << "\n"; + outs() << "\t" << ++FunctionCount << ": " << F.getName() << "\n"; outs() << "----------------------------\n"; return FunctionCount; @@ -73,7 +66,7 @@ void llvm::reduceFunctionsDeltaPass(TestRunner &Test) { outs() << "*** Reducing Functions...\n"; - unsigned Functions = countDefinedFunctions(Test.getProgram()); + unsigned Functions = countFunctions(Test.getProgram()); runDeltaPass(Test, Functions, extractFunctionsFromModule); outs() << "----------------------------\n"; -} +} \ No newline at end of file