diff options
author | Chris Lattner <sabre@nondot.org> | 2002-05-07 18:10:55 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-05-07 18:10:55 +0000 |
commit | 2ed01d8f0bdb8aa73d893a8beb23b1838422fa32 (patch) | |
tree | a11d54930ee46d3f90dbf1b12d15a653514d2801 /lib/Transforms/Scalar/ConstantProp.cpp | |
parent | 5a4337a8fc13e7a63cef19b5292dfe1a8a45505a (diff) |
Factor code out to the TransformUtils library
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2516 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/ConstantProp.cpp')
-rw-r--r-- | lib/Transforms/Scalar/ConstantProp.cpp | 82 |
1 files changed, 2 insertions, 80 deletions
diff --git a/lib/Transforms/Scalar/ConstantProp.cpp b/lib/Transforms/Scalar/ConstantProp.cpp index b43f23745a..7085ef9800 100644 --- a/lib/Transforms/Scalar/ConstantProp.cpp +++ b/lib/Transforms/Scalar/ConstantProp.cpp @@ -12,91 +12,13 @@ //===----------------------------------------------------------------------===// #include "llvm/Transforms/Scalar/ConstantProp.h" +#include "llvm/Transforms/Utils/Local.h" #include "llvm/ConstantHandling.h" -#include "llvm/Function.h" -#include "llvm/BasicBlock.h" -#include "llvm/iTerminators.h" +#include "llvm/Instruction.h" #include "llvm/Pass.h" #include "llvm/Support/InstIterator.h" #include <set> -// FIXME: ConstantFoldInstruction & ConstantFoldTerminator should be moved out -// to the Transformations library. - -// ConstantFoldInstruction - If an instruction references constants, try to fold -// them together... -// -bool doConstantPropogation(BasicBlock *BB, BasicBlock::iterator &II) { - Instruction *Inst = *II; - if (Constant *C = ConstantFoldInstruction(Inst)) { - // Replaces all of the uses of a variable with uses of the constant. - Inst->replaceAllUsesWith(C); - - // Remove the instruction from the basic block... - delete BB->getInstList().remove(II); - return true; - } - - return false; -} - -// ConstantFoldTerminator - If a terminator instruction is predicated on a -// constant value, convert it into an unconditional branch to the constant -// destination. -// -bool ConstantFoldTerminator(BasicBlock *BB, BasicBlock::iterator &II, - TerminatorInst *T) { - // Branch - See if we are conditional jumping on constant - if (BranchInst *BI = dyn_cast<BranchInst>(T)) { - if (BI->isUnconditional()) return false; // Can't optimize uncond branch - BasicBlock *Dest1 = cast<BasicBlock>(BI->getOperand(0)); - BasicBlock *Dest2 = cast<BasicBlock>(BI->getOperand(1)); - - if (ConstantBool *Cond = dyn_cast<ConstantBool>(BI->getCondition())) { - // Are we branching on constant? - // YES. Change to unconditional branch... - BasicBlock *Destination = Cond->getValue() ? Dest1 : Dest2; - BasicBlock *OldDest = Cond->getValue() ? Dest2 : Dest1; - - //cerr << "Function: " << T->getParent()->getParent() - // << "\nRemoving branch from " << T->getParent() - // << "\n\nTo: " << OldDest << endl; - - // Let the basic block know that we are letting go of it. Based on this, - // it will adjust it's PHI nodes. - assert(BI->getParent() && "Terminator not inserted in block!"); - OldDest->removePredecessor(BI->getParent()); - - // Set the unconditional destination, and change the insn to be an - // unconditional branch. - BI->setUnconditionalDest(Destination); - II = BB->end()-1; // Update instruction iterator! - return true; - } -#if 0 - // FIXME: TODO: This doesn't work if the destination has PHI nodes with - // different incoming values on each branch! - // - else if (Dest2 == Dest1) { // Conditional branch to same location? - // This branch matches something like this: - // br bool %cond, label %Dest, label %Dest - // and changes it into: br label %Dest - - // Let the basic block know that we are letting go of one copy of it. - assert(BI->getParent() && "Terminator not inserted in block!"); - Dest1->removePredecessor(BI->getParent()); - - // Change a conditional branch to unconditional. - BI->setUnconditionalDest(Dest1); - return true; - } -#endif - } - return false; -} - - - namespace { struct ConstantPropogation : public FunctionPass { const char *getPassName() const { return "Simple Constant Propogation"; } |