LowerSwitch.cpp revision bf9eaddfb0642e49bc2f3835765a9782ff48c76e
1//===- LowerSwitch.cpp - Eliminate Switch instructions --------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// The LowerSwitch transformation rewrites switch statements with a sequence of 11// branches, which allows targets to get away with not implementing the switch 12// statement until it is convenient. 13// 14//===----------------------------------------------------------------------===// 15 16#include "llvm/Transforms/Scalar.h" 17#include "llvm/Constants.h" 18#include "llvm/Function.h" 19#include "llvm/iTerminators.h" 20#include "llvm/iOperators.h" 21#include "llvm/iPHINode.h" 22#include "llvm/Pass.h" 23#include "Support/Debug.h" 24#include "Support/Statistic.h" 25using namespace llvm; 26 27namespace { 28 Statistic<> NumLowered("lowerswitch", "Number of SwitchInst's replaced"); 29 30 /// LowerSwitch Pass - Replace all SwitchInst instructions with chained branch 31 /// instructions. Note that this cannot be a BasicBlock pass because it 32 /// modifies the CFG! 33 class LowerSwitch : public FunctionPass { 34 public: 35 bool runOnFunction(Function &F); 36 typedef std::pair<Constant*, BasicBlock*> Case; 37 typedef std::vector<Case>::iterator CaseItr; 38 private: 39 void processSwitchInst(SwitchInst *SI); 40 41 BasicBlock* switchConvert(CaseItr Begin, CaseItr End, Value* Val, 42 BasicBlock* OrigBlock, BasicBlock* Default); 43 BasicBlock* newLeafBlock(Case& Leaf, Value* Val, 44 BasicBlock* OrigBlock, BasicBlock* Default); 45 }; 46 47 /// The comparison function for sorting the switch case values in the vector. 48 struct CaseCmp { 49 bool operator () (const LowerSwitch::Case& C1, 50 const LowerSwitch::Case& C2) { 51 if (const ConstantUInt* U1 = dyn_cast<const ConstantUInt>(C1.first)) 52 return U1->getValue() < cast<const ConstantUInt>(C2.first)->getValue(); 53 54 const ConstantSInt* S1 = dyn_cast<const ConstantSInt>(C1.first); 55 return S1->getValue() < cast<const ConstantSInt>(C2.first)->getValue(); 56 } 57 }; 58 59 RegisterOpt<LowerSwitch> 60 X("lowerswitch", "Lower SwitchInst's to branches"); 61} 62 63// createLowerSwitchPass - Interface to this file... 64FunctionPass *llvm::createLowerSwitchPass() { 65 return new LowerSwitch(); 66} 67 68bool LowerSwitch::runOnFunction(Function &F) { 69 bool Changed = false; 70 71 for (Function::iterator I = F.begin(), E = F.end(); I != E; ) { 72 BasicBlock *Cur = I++; // Advance over block so we don't traverse new blocks 73 74 if (SwitchInst *SI = dyn_cast<SwitchInst>(Cur->getTerminator())) { 75 Changed = true; 76 processSwitchInst(SI); 77 } 78 } 79 80 return Changed; 81} 82 83// operator<< - Used for debugging purposes. 84// 85std::ostream& operator<<(std::ostream &O, 86 const std::vector<LowerSwitch::Case> &C) { 87 O << "["; 88 89 for (std::vector<LowerSwitch::Case>::const_iterator B = C.begin(), 90 E = C.end(); B != E; ) { 91 O << *B->first; 92 if (++B != E) O << ", "; 93 } 94 95 return O << "]"; 96} 97 98// switchConvert - Convert the switch statement into a binary lookup of 99// the case values. The function recursively builds this tree. 100// 101BasicBlock* LowerSwitch::switchConvert(CaseItr Begin, CaseItr End, 102 Value* Val, BasicBlock* OrigBlock, 103 BasicBlock* Default) 104{ 105 unsigned Size = End - Begin; 106 107 if (Size == 1) 108 return newLeafBlock(*Begin, Val, OrigBlock, Default); 109 110 unsigned Mid = Size / 2; 111 std::vector<Case> LHS(Begin, Begin + Mid); 112 DEBUG(std::cerr << "LHS: " << LHS << "\n"); 113 std::vector<Case> RHS(Begin + Mid, End); 114 DEBUG(std::cerr << "RHS: " << RHS << "\n"); 115 116 Case& Pivot = *(Begin + Mid); 117 DEBUG(std::cerr << "Pivot ==> " 118 << (int64_t)cast<ConstantInt>(Pivot.first)->getRawValue() 119 << "\n"); 120 121 BasicBlock* LBranch = switchConvert(LHS.begin(), LHS.end(), Val, 122 OrigBlock, Default); 123 BasicBlock* RBranch = switchConvert(RHS.begin(), RHS.end(), Val, 124 OrigBlock, Default); 125 126 // Create a new node that checks if the value is < pivot. Go to the 127 // left branch if it is and right branch if not. 128 Function* F = OrigBlock->getParent(); 129 BasicBlock* NewNode = new BasicBlock("NodeBlock"); 130 F->getBasicBlockList().insert(OrigBlock->getNext(), NewNode); 131 132 SetCondInst* Comp = new SetCondInst(Instruction::SetLT, Val, Pivot.first, 133 "Pivot"); 134 NewNode->getInstList().push_back(Comp); 135 new BranchInst(LBranch, RBranch, Comp, NewNode); 136 return NewNode; 137} 138 139// newLeafBlock - Create a new leaf block for the binary lookup tree. It 140// checks if the switch's value == the case's value. If not, then it 141// jumps to the default branch. At this point in the tree, the value 142// can't be another valid case value, so the jump to the "default" branch 143// is warranted. 144// 145BasicBlock* LowerSwitch::newLeafBlock(Case& Leaf, Value* Val, 146 BasicBlock* OrigBlock, 147 BasicBlock* Default) 148{ 149 Function* F = OrigBlock->getParent(); 150 BasicBlock* NewLeaf = new BasicBlock("LeafBlock"); 151 F->getBasicBlockList().insert(OrigBlock->getNext(), NewLeaf); 152 153 // Make the seteq instruction... 154 SetCondInst* Comp = new SetCondInst(Instruction::SetEQ, Val, 155 Leaf.first, "SwitchLeaf"); 156 NewLeaf->getInstList().push_back(Comp); 157 158 // Make the conditional branch... 159 BasicBlock* Succ = Leaf.second; 160 new BranchInst(Succ, Default, Comp, NewLeaf); 161 162 // If there were any PHI nodes in this successor, rewrite one entry 163 // from OrigBlock to come from NewLeaf. 164 for (BasicBlock::iterator I = Succ->begin(); 165 PHINode* PN = dyn_cast<PHINode>(I); ++I) { 166 int BlockIdx = PN->getBasicBlockIndex(OrigBlock); 167 assert(BlockIdx != -1 && "Switch didn't go to this successor??"); 168 PN->setIncomingBlock((unsigned)BlockIdx, NewLeaf); 169 } 170 171 return NewLeaf; 172} 173 174// processSwitchInst - Replace the specified switch instruction with a sequence 175// of chained if-then insts in a balanced binary search. 176// 177void LowerSwitch::processSwitchInst(SwitchInst *SI) { 178 BasicBlock *CurBlock = SI->getParent(); 179 BasicBlock *OrigBlock = CurBlock; 180 Function *F = CurBlock->getParent(); 181 Value *Val = SI->getOperand(0); // The value we are switching on... 182 BasicBlock* Default = SI->getDefaultDest(); 183 184 // If there is only the default destination, don't bother with the code below. 185 if (SI->getNumOperands() == 2) { 186 new BranchInst(SI->getDefaultDest(), CurBlock); 187 CurBlock->getInstList().erase(SI); 188 return; 189 } 190 191 // Create a new, empty default block so that the new hierarchy of 192 // if-then statements go to this and the PHI nodes are happy. 193 BasicBlock* NewDefault = new BasicBlock("NewDefault"); 194 F->getBasicBlockList().insert(Default, NewDefault); 195 196 new BranchInst(Default, NewDefault); 197 198 // If there is an entry in any PHI nodes for the default edge, make sure 199 // to update them as well. 200 for (BasicBlock::iterator I = Default->begin(); 201 PHINode *PN = dyn_cast<PHINode>(I); ++I) { 202 int BlockIdx = PN->getBasicBlockIndex(OrigBlock); 203 assert(BlockIdx != -1 && "Switch didn't go to this successor??"); 204 PN->setIncomingBlock((unsigned)BlockIdx, NewDefault); 205 } 206 207 std::vector<Case> Cases; 208 209 // Expand comparisons for all of the non-default cases... 210 for (unsigned i = 1; i < SI->getNumSuccessors(); ++i) 211 Cases.push_back(Case(SI->getSuccessorValue(i), SI->getSuccessor(i))); 212 213 std::sort(Cases.begin(), Cases.end(), CaseCmp()); 214 DEBUG(std::cerr << "Cases: " << Cases << "\n"); 215 BasicBlock* SwitchBlock = switchConvert(Cases.begin(), Cases.end(), Val, 216 OrigBlock, NewDefault); 217 218 // Branch to our shiny new if-then stuff... 219 new BranchInst(SwitchBlock, OrigBlock); 220 221 // We are now done with the switch instruction, delete it. 222 CurBlock->getInstList().erase(SI); 223} 224