diff options
author | Diego Trevino Ferrer <diegof30@gmail.com> | 2019-08-14 22:22:37 +0000 |
---|---|---|
committer | Diego Trevino Ferrer <diegof30@gmail.com> | 2019-08-14 22:22:37 +0000 |
commit | 3755579f93c2b21aabcc47c23c0a5a5676a0d80e (patch) | |
tree | 7b049a8a69c1f80afd5ec33dfd20e49c490c4721 /llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp | |
parent | a8f3ae7c9cefa8296d119f92ca444087cdccf712 (diff) | |
download | bcm5719-llvm-3755579f93c2b21aabcc47c23c0a5a5676a0d80e.tar.gz bcm5719-llvm-3755579f93c2b21aabcc47c23c0a5a5676a0d80e.zip |
[Bugpoint redesign] Modified Functions pass to consider declarations
Summary: This modification was put in place so the `ReduceMetadata` pass doesn't have to consider debug functions
Reviewers: dblaikie
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D66257
llvm-svn: 368934
Diffstat (limited to 'llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp')
-rw-r--r-- | llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp b/llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp index 5eb57c0b7d4..52777bed640 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp @@ -22,7 +22,7 @@ static void extractFunctionsFromModule(const std::vector<Chunk> &ChunksToKeep, std::set<Function *> 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 @@ static void extractFunctionsFromModule(const std::vector<Chunk> &ChunksToKeep, // Delete out-of-chunk functions, and replace their calls with undef std::vector<Function *> FuncsToRemove; + std::vector<CallInst *> 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<CallInst>(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<Instruction *> InstToRemove; - for (auto &F : *Program) - for (auto &BB : F) - for (auto &I : BB) - if (auto *Call = dyn_cast<CallInst>(&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 @@ static unsigned countDefinedFunctions(Module *Program) { 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 |