diff options
author | Chris Lattner <sabre@nondot.org> | 2003-01-23 02:48:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-01-23 02:48:33 +0000 |
commit | 6520785dcd22012535934098942d57c07c7631c2 (patch) | |
tree | 9779528e1f51c9a49cdff12110c7440af45947b6 /tools/bugpoint/ExtractFunction.cpp | |
parent | e5fa63a578187ba91bf2b93ad5a58baa3d3307b2 (diff) | |
download | llvm-6520785dcd22012535934098942d57c07c7631c2.tar.gz llvm-6520785dcd22012535934098942d57c07c7631c2.tar.bz2 llvm-6520785dcd22012535934098942d57c07c7631c2.tar.xz |
Make bugpoint *much* more powerful, giving it the capability to delete instructions
out of a large function to reduce it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5408 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/bugpoint/ExtractFunction.cpp')
-rw-r--r-- | tools/bugpoint/ExtractFunction.cpp | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/tools/bugpoint/ExtractFunction.cpp b/tools/bugpoint/ExtractFunction.cpp index 76b2258f8a..9b5440c0d4 100644 --- a/tools/bugpoint/ExtractFunction.cpp +++ b/tools/bugpoint/ExtractFunction.cpp @@ -9,7 +9,10 @@ #include "llvm/Module.h" #include "llvm/PassManager.h" #include "llvm/Transforms/IPO.h" +#include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/Cloning.h" +#include "llvm/Type.h" +#include "llvm/Constant.h" /// extractFunctionFromModule - This method is used to extract the specified /// (non-external) function from the current program, slim down the module, and @@ -19,16 +22,62 @@ Module *BugDriver::extractFunctionFromModule(Function *F) const { Module *Result = CloneModule(Program); // Translate from the old module to the new copied module... - F = Result->getFunction(F->getName(), F->getFunctionType()); + Module::iterator RFI = Result->begin(); // Get iterator to corresponding fn + std::advance(RFI, std::distance(Program->begin(), Module::iterator(F))); // In addition to just parsing the input from GCC, we also want to spiff it up // a little bit. Do this now. // PassManager Passes; - Passes.add(createFunctionExtractionPass(F)); // Extract the function + Passes.add(createFunctionExtractionPass(RFI)); // Extract the function Passes.add(createGlobalDCEPass()); // Delete unreachable globals Passes.add(createFunctionResolvingPass()); // Delete prototypes Passes.add(createDeadTypeEliminationPass()); // Remove dead types... Passes.run(*Result); return Result; } + + +/// deleteInstructionFromProgram - This method clones the current Program and +/// deletes the specified instruction from the cloned module. It then runs a +/// series of cleanup passes (ADCE and SimplifyCFG) to eliminate any code which +/// depends on the value. The modified module is then returned. +/// +Module *BugDriver::deleteInstructionFromProgram(Instruction *I, + unsigned Simplification) const { + Module *Result = CloneModule(Program); + + BasicBlock *PBB = I->getParent(); + Function *PF = PBB->getParent(); + + Module::iterator RFI = Result->begin(); // Get iterator to corresponding fn + std::advance(RFI, std::distance(Program->begin(), Module::iterator(PF))); + + Function::iterator RBI = RFI->begin(); // Get iterator to corresponding BB + std::advance(RBI, std::distance(PF->begin(), Function::iterator(PBB))); + + BasicBlock::iterator RI = RBI->begin(); // Get iterator to corresponding inst + std::advance(RI, std::distance(PBB->begin(), BasicBlock::iterator(I))); + I = RI; // Got the corresponding instruction! + + // If this instruction produces a value, replace any users with null values + if (I->getType() != Type::VoidTy) + I->replaceAllUsesWith(Constant::getNullValue(I->getType())); + + // Remove the instruction from the program. + I->getParent()->getInstList().erase(I); + + // In addition to just parsing the input from GCC, we also want to spiff it up + // a little bit. Do this now. + // + PassManager Passes; + if (Simplification > 2) + Passes.add(createAggressiveDCEPass()); // Remove dead code... + //Passes.add(createInstructionCombiningPass()); + if (Simplification > 1) + Passes.add(createDeadCodeEliminationPass()); + if (Simplification) + Passes.add(createCFGSimplificationPass()); // Delete dead control flow + Passes.run(*Result); + return Result; +} |