summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/ConstantProp.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-05-07 18:10:55 +0000
committerChris Lattner <sabre@nondot.org>2002-05-07 18:10:55 +0000
commit560da70f8c9ebc0bef1b633ca93f1b176a6f41a2 (patch)
treecbc49f8767292bbee38e8f0795aebe16d70e2af7 /llvm/lib/Transforms/Scalar/ConstantProp.cpp
parent6a515851555bb7328209a21abf0f7ad2b3841aea (diff)
downloadbcm5719-llvm-560da70f8c9ebc0bef1b633ca93f1b176a6f41a2.tar.gz
bcm5719-llvm-560da70f8c9ebc0bef1b633ca93f1b176a6f41a2.zip
Factor code out to the TransformUtils library
llvm-svn: 2516
Diffstat (limited to 'llvm/lib/Transforms/Scalar/ConstantProp.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/ConstantProp.cpp82
1 files changed, 2 insertions, 80 deletions
diff --git a/llvm/lib/Transforms/Scalar/ConstantProp.cpp b/llvm/lib/Transforms/Scalar/ConstantProp.cpp
index b43f23745aa..7085ef98006 100644
--- a/llvm/lib/Transforms/Scalar/ConstantProp.cpp
+++ b/llvm/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"; }
OpenPOWER on IntegriCloud