Local.cpp revision 18961504fc2b299578dba817900a0696cf3ccc4d
1//===-- Local.cpp - Functions to perform local transformations ------------===// 2// 3// This family of functions perform various local transformations to the 4// program. 5// 6//===----------------------------------------------------------------------===// 7 8#include "llvm/Transforms/Utils/Local.h" 9#include "llvm/iTerminators.h" 10#include "llvm/ConstantHandling.h" 11 12//===----------------------------------------------------------------------===// 13// Local constant propogation... 14// 15 16// ConstantFoldInstruction - If an instruction references constants, try to fold 17// them together... 18// 19bool doConstantPropogation(BasicBlock::iterator &II) { 20 if (Constant *C = ConstantFoldInstruction(II)) { 21 // Replaces all of the uses of a variable with uses of the constant. 22 II->replaceAllUsesWith(C); 23 24 // Remove the instruction from the basic block... 25 II = II->getParent()->getInstList().erase(II); 26 return true; 27 } 28 29 return false; 30} 31 32// ConstantFoldTerminator - If a terminator instruction is predicated on a 33// constant value, convert it into an unconditional branch to the constant 34// destination. 35// 36bool ConstantFoldTerminator(BasicBlock *BB) { 37 TerminatorInst *T = BB->getTerminator(); 38 39 // Branch - See if we are conditional jumping on constant 40 if (BranchInst *BI = dyn_cast<BranchInst>(T)) { 41 if (BI->isUnconditional()) return false; // Can't optimize uncond branch 42 BasicBlock *Dest1 = cast<BasicBlock>(BI->getOperand(0)); 43 BasicBlock *Dest2 = cast<BasicBlock>(BI->getOperand(1)); 44 45 if (ConstantBool *Cond = dyn_cast<ConstantBool>(BI->getCondition())) { 46 // Are we branching on constant? 47 // YES. Change to unconditional branch... 48 BasicBlock *Destination = Cond->getValue() ? Dest1 : Dest2; 49 BasicBlock *OldDest = Cond->getValue() ? Dest2 : Dest1; 50 51 //cerr << "Function: " << T->getParent()->getParent() 52 // << "\nRemoving branch from " << T->getParent() 53 // << "\n\nTo: " << OldDest << endl; 54 55 // Let the basic block know that we are letting go of it. Based on this, 56 // it will adjust it's PHI nodes. 57 assert(BI->getParent() && "Terminator not inserted in block!"); 58 OldDest->removePredecessor(BI->getParent()); 59 60 // Set the unconditional destination, and change the insn to be an 61 // unconditional branch. 62 BI->setUnconditionalDest(Destination); 63 return true; 64 } 65#if 0 66 // FIXME: TODO: This doesn't work if the destination has PHI nodes with 67 // different incoming values on each branch! 68 // 69 else if (Dest2 == Dest1) { // Conditional branch to same location? 70 // This branch matches something like this: 71 // br bool %cond, label %Dest, label %Dest 72 // and changes it into: br label %Dest 73 74 // Let the basic block know that we are letting go of one copy of it. 75 assert(BI->getParent() && "Terminator not inserted in block!"); 76 Dest1->removePredecessor(BI->getParent()); 77 78 // Change a conditional branch to unconditional. 79 BI->setUnconditionalDest(Dest1); 80 return true; 81 } 82#endif 83 } 84 return false; 85} 86 87 88 89//===----------------------------------------------------------------------===// 90// Local dead code elimination... 91// 92 93bool isInstructionTriviallyDead(Instruction *I) { 94 return I->use_empty() && !I->hasSideEffects() && !isa<TerminatorInst>(I); 95} 96 97// dceInstruction - Inspect the instruction at *BBI and figure out if it's 98// [trivially] dead. If so, remove the instruction and update the iterator 99// to point to the instruction that immediately succeeded the original 100// instruction. 101// 102bool dceInstruction(BasicBlock::iterator &BBI) { 103 // Look for un"used" definitions... 104 if (isInstructionTriviallyDead(BBI)) { 105 BBI = BBI->getParent()->getInstList().erase(BBI); // Bye bye 106 return true; 107 } 108 return false; 109} 110