SCCP.cpp revision 36143fc4440ac1fc2a0fc95a4999bcadc3ec207d
1//===- SCCP.cpp - Sparse Conditional Constant Propagation -----------------===// 2// 3// This file implements sparse conditional constant propagation and merging: 4// 5// Specifically, this: 6// * Assumes values are constant unless proven otherwise 7// * Assumes BasicBlocks are dead unless proven otherwise 8// * Proves values to be constant, and replaces them with constants 9// * Proves conditional branches to be unconditional 10// 11// Notice that: 12// * This pass has a habit of making definitions be dead. It is a good idea 13// to to run a DCE pass sometime after running this pass. 14// 15//===----------------------------------------------------------------------===// 16 17#include "llvm/Transforms/Scalar.h" 18#include "llvm/ConstantHandling.h" 19#include "llvm/Function.h" 20#include "llvm/Instructions.h" 21#include "llvm/Pass.h" 22#include "llvm/Support/InstVisitor.h" 23#include "Support/Debug.h" 24#include "Support/Statistic.h" 25#include "Support/STLExtras.h" 26#include <algorithm> 27#include <set> 28 29// InstVal class - This class represents the different lattice values that an 30// instruction may occupy. It is a simple class with value semantics. 31// 32namespace { 33 Statistic<> NumInstRemoved("sccp", "Number of instructions removed"); 34 35class InstVal { 36 enum { 37 undefined, // This instruction has no known value 38 constant, // This instruction has a constant value 39 overdefined // This instruction has an unknown value 40 } LatticeValue; // The current lattice position 41 Constant *ConstantVal; // If Constant value, the current value 42public: 43 inline InstVal() : LatticeValue(undefined), ConstantVal(0) {} 44 45 // markOverdefined - Return true if this is a new status to be in... 46 inline bool markOverdefined() { 47 if (LatticeValue != overdefined) { 48 LatticeValue = overdefined; 49 return true; 50 } 51 return false; 52 } 53 54 // markConstant - Return true if this is a new status for us... 55 inline bool markConstant(Constant *V) { 56 if (LatticeValue != constant) { 57 LatticeValue = constant; 58 ConstantVal = V; 59 return true; 60 } else { 61 assert(ConstantVal == V && "Marking constant with different value"); 62 } 63 return false; 64 } 65 66 inline bool isUndefined() const { return LatticeValue == undefined; } 67 inline bool isConstant() const { return LatticeValue == constant; } 68 inline bool isOverdefined() const { return LatticeValue == overdefined; } 69 70 inline Constant *getConstant() const { return ConstantVal; } 71}; 72 73} // end anonymous namespace 74 75 76//===----------------------------------------------------------------------===// 77// SCCP Class 78// 79// This class does all of the work of Sparse Conditional Constant Propagation. 80// 81namespace { 82class SCCP : public FunctionPass, public InstVisitor<SCCP> { 83 std::set<BasicBlock*> BBExecutable;// The basic blocks that are executable 84 std::map<Value*, InstVal> ValueState; // The state each value is in... 85 86 std::vector<Instruction*> InstWorkList;// The instruction work list 87 std::vector<BasicBlock*> BBWorkList; // The BasicBlock work list 88public: 89 90 // runOnFunction - Run the Sparse Conditional Constant Propagation algorithm, 91 // and return true if the function was modified. 92 // 93 bool runOnFunction(Function &F); 94 95 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 96 AU.setPreservesCFG(); 97 } 98 99 100 //===--------------------------------------------------------------------===// 101 // The implementation of this class 102 // 103private: 104 friend class InstVisitor<SCCP>; // Allow callbacks from visitor 105 106 // markValueOverdefined - Make a value be marked as "constant". If the value 107 // is not already a constant, add it to the instruction work list so that 108 // the users of the instruction are updated later. 109 // 110 inline bool markConstant(Instruction *I, Constant *V) { 111 if (ValueState[I].markConstant(V)) { 112 DEBUG(std::cerr << "markConstant: " << V << " = " << I); 113 InstWorkList.push_back(I); 114 return true; 115 } 116 return false; 117 } 118 119 // markValueOverdefined - Make a value be marked as "overdefined". If the 120 // value is not already overdefined, add it to the instruction work list so 121 // that the users of the instruction are updated later. 122 // 123 inline bool markOverdefined(Value *V) { 124 if (ValueState[V].markOverdefined()) { 125 if (Instruction *I = dyn_cast<Instruction>(V)) { 126 DEBUG(std::cerr << "markOverdefined: " << V); 127 InstWorkList.push_back(I); // Only instructions go on the work list 128 } 129 return true; 130 } 131 return false; 132 } 133 134 // getValueState - Return the InstVal object that corresponds to the value. 135 // This function is necessary because not all values should start out in the 136 // underdefined state... Argument's should be overdefined, and 137 // constants should be marked as constants. If a value is not known to be an 138 // Instruction object, then use this accessor to get its value from the map. 139 // 140 inline InstVal &getValueState(Value *V) { 141 std::map<Value*, InstVal>::iterator I = ValueState.find(V); 142 if (I != ValueState.end()) return I->second; // Common case, in the map 143 144 if (Constant *CPV = dyn_cast<Constant>(V)) { // Constants are constant 145 ValueState[CPV].markConstant(CPV); 146 } else if (isa<Argument>(V)) { // Arguments are overdefined 147 ValueState[V].markOverdefined(); 148 } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) { 149 // The address of a global is a constant... 150 ValueState[V].markConstant(ConstantPointerRef::get(GV)); 151 } 152 // All others are underdefined by default... 153 return ValueState[V]; 154 } 155 156 // markExecutable - Mark a basic block as executable, adding it to the BB 157 // work list if it is not already executable... 158 // 159 void markExecutable(BasicBlock *BB) { 160 if (BBExecutable.count(BB)) { 161 // BB is already executable, but we may have just made an edge feasible 162 // that wasn't before. Add the PHI nodes to the work list so that they 163 // can be rechecked. 164 for (BasicBlock::iterator I = BB->begin(); 165 PHINode *PN = dyn_cast<PHINode>(I); ++I) 166 visitPHINode(*PN); 167 168 } else { 169 DEBUG(std::cerr << "Marking BB Executable: " << *BB); 170 BBExecutable.insert(BB); // Basic block is executable! 171 BBWorkList.push_back(BB); // Add the block to the work list! 172 } 173 } 174 175 176 // visit implementations - Something changed in this instruction... Either an 177 // operand made a transition, or the instruction is newly executable. Change 178 // the value type of I to reflect these changes if appropriate. 179 // 180 void visitPHINode(PHINode &I); 181 182 // Terminators 183 void visitReturnInst(ReturnInst &I) { /*does not have an effect*/ } 184 void visitTerminatorInst(TerminatorInst &TI); 185 186 void visitCastInst(CastInst &I); 187 void visitBinaryOperator(Instruction &I); 188 void visitShiftInst(ShiftInst &I) { visitBinaryOperator(I); } 189 190 // Instructions that cannot be folded away... 191 void visitStoreInst (Instruction &I) { /*returns void*/ } 192 void visitLoadInst (Instruction &I) { markOverdefined(&I); } 193 void visitGetElementPtrInst(GetElementPtrInst &I); 194 void visitCallInst (Instruction &I) { markOverdefined(&I); } 195 void visitInvokeInst (TerminatorInst &I) { 196 markOverdefined(&I); 197 visitTerminatorInst(I); 198 } 199 void visitUnwindInst (TerminatorInst &I) { /*returns void*/ } 200 void visitAllocationInst(Instruction &I) { markOverdefined(&I); } 201 void visitVarArgInst (Instruction &I) { markOverdefined(&I); } 202 void visitFreeInst (Instruction &I) { /*returns void*/ } 203 204 void visitInstruction(Instruction &I) { 205 // If a new instruction is added to LLVM that we don't handle... 206 std::cerr << "SCCP: Don't know how to handle: " << I; 207 markOverdefined(&I); // Just in case 208 } 209 210 // getFeasibleSuccessors - Return a vector of booleans to indicate which 211 // successors are reachable from a given terminator instruction. 212 // 213 void getFeasibleSuccessors(TerminatorInst &TI, std::vector<bool> &Succs); 214 215 // isEdgeFeasible - Return true if the control flow edge from the 'From' basic 216 // block to the 'To' basic block is currently feasible... 217 // 218 bool isEdgeFeasible(BasicBlock *From, BasicBlock *To); 219 220 // OperandChangedState - This method is invoked on all of the users of an 221 // instruction that was just changed state somehow.... Based on this 222 // information, we need to update the specified user of this instruction. 223 // 224 void OperandChangedState(User *U) { 225 // Only instructions use other variable values! 226 Instruction &I = cast<Instruction>(*U); 227 if (BBExecutable.count(I.getParent())) // Inst is executable? 228 visit(I); 229 } 230}; 231 232 RegisterOpt<SCCP> X("sccp", "Sparse Conditional Constant Propagation"); 233} // end anonymous namespace 234 235 236// createSCCPPass - This is the public interface to this file... 237// 238Pass *createSCCPPass() { 239 return new SCCP(); 240} 241 242 243//===----------------------------------------------------------------------===// 244// SCCP Class Implementation 245 246 247// runOnFunction() - Run the Sparse Conditional Constant Propagation algorithm, 248// and return true if the function was modified. 249// 250bool SCCP::runOnFunction(Function &F) { 251 // Mark the first block of the function as being executable... 252 markExecutable(&F.front()); 253 254 // Process the work lists until their are empty! 255 while (!BBWorkList.empty() || !InstWorkList.empty()) { 256 // Process the instruction work list... 257 while (!InstWorkList.empty()) { 258 Instruction *I = InstWorkList.back(); 259 InstWorkList.pop_back(); 260 261 DEBUG(std::cerr << "\nPopped off I-WL: " << I); 262 263 // "I" got into the work list because it either made the transition from 264 // bottom to constant, or to Overdefined. 265 // 266 // Update all of the users of this instruction's value... 267 // 268 for_each(I->use_begin(), I->use_end(), 269 bind_obj(this, &SCCP::OperandChangedState)); 270 } 271 272 // Process the basic block work list... 273 while (!BBWorkList.empty()) { 274 BasicBlock *BB = BBWorkList.back(); 275 BBWorkList.pop_back(); 276 277 DEBUG(std::cerr << "\nPopped off BBWL: " << BB); 278 279 // Notify all instructions in this basic block that they are newly 280 // executable. 281 visit(BB); 282 } 283 } 284 285 if (DebugFlag) { 286 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 287 if (!BBExecutable.count(I)) 288 std::cerr << "BasicBlock Dead:" << *I; 289 } 290 291 // Iterate over all of the instructions in a function, replacing them with 292 // constants if we have found them to be of constant values. 293 // 294 bool MadeChanges = false; 295 for (Function::iterator BB = F.begin(), BBE = F.end(); BB != BBE; ++BB) 296 for (BasicBlock::iterator BI = BB->begin(); BI != BB->end();) { 297 Instruction &Inst = *BI; 298 InstVal &IV = ValueState[&Inst]; 299 if (IV.isConstant()) { 300 Constant *Const = IV.getConstant(); 301 DEBUG(std::cerr << "Constant: " << Const << " = " << Inst); 302 303 // Replaces all of the uses of a variable with uses of the constant. 304 Inst.replaceAllUsesWith(Const); 305 306 // Remove the operator from the list of definitions... and delete it. 307 BI = BB->getInstList().erase(BI); 308 309 // Hey, we just changed something! 310 MadeChanges = true; 311 ++NumInstRemoved; 312 } else { 313 ++BI; 314 } 315 } 316 317 // Reset state so that the next invocation will have empty data structures 318 BBExecutable.clear(); 319 ValueState.clear(); 320 std::vector<Instruction*>().swap(InstWorkList); 321 std::vector<BasicBlock*>().swap(BBWorkList); 322 323 return MadeChanges; 324} 325 326 327// getFeasibleSuccessors - Return a vector of booleans to indicate which 328// successors are reachable from a given terminator instruction. 329// 330void SCCP::getFeasibleSuccessors(TerminatorInst &TI, std::vector<bool> &Succs) { 331 Succs.resize(TI.getNumSuccessors()); 332 if (BranchInst *BI = dyn_cast<BranchInst>(&TI)) { 333 if (BI->isUnconditional()) { 334 Succs[0] = true; 335 } else { 336 InstVal &BCValue = getValueState(BI->getCondition()); 337 if (BCValue.isOverdefined()) { 338 // Overdefined condition variables mean the branch could go either way. 339 Succs[0] = Succs[1] = true; 340 } else if (BCValue.isConstant()) { 341 // Constant condition variables mean the branch can only go a single way 342 Succs[BCValue.getConstant() == ConstantBool::False] = true; 343 } 344 } 345 } else if (InvokeInst *II = dyn_cast<InvokeInst>(&TI)) { 346 // Invoke instructions successors are always executable. 347 Succs[0] = Succs[1] = true; 348 } else if (SwitchInst *SI = dyn_cast<SwitchInst>(&TI)) { 349 InstVal &SCValue = getValueState(SI->getCondition()); 350 if (SCValue.isOverdefined()) { // Overdefined condition? 351 // All destinations are executable! 352 Succs.assign(TI.getNumSuccessors(), true); 353 } else if (SCValue.isConstant()) { 354 Constant *CPV = SCValue.getConstant(); 355 // Make sure to skip the "default value" which isn't a value 356 for (unsigned i = 1, E = SI->getNumSuccessors(); i != E; ++i) { 357 if (SI->getSuccessorValue(i) == CPV) {// Found the right branch... 358 Succs[i] = true; 359 return; 360 } 361 } 362 363 // Constant value not equal to any of the branches... must execute 364 // default branch then... 365 Succs[0] = true; 366 } 367 } else { 368 std::cerr << "SCCP: Don't know how to handle: " << TI; 369 Succs.assign(TI.getNumSuccessors(), true); 370 } 371} 372 373 374// isEdgeFeasible - Return true if the control flow edge from the 'From' basic 375// block to the 'To' basic block is currently feasible... 376// 377bool SCCP::isEdgeFeasible(BasicBlock *From, BasicBlock *To) { 378 assert(BBExecutable.count(To) && "Dest should always be alive!"); 379 380 // Make sure the source basic block is executable!! 381 if (!BBExecutable.count(From)) return false; 382 383 // Check to make sure this edge itself is actually feasible now... 384 TerminatorInst *FT = From->getTerminator(); 385 std::vector<bool> SuccFeasible; 386 getFeasibleSuccessors(*FT, SuccFeasible); 387 388 // Check all edges from From to To. If any are feasible, return true. 389 for (unsigned i = 0, e = SuccFeasible.size(); i != e; ++i) 390 if (FT->getSuccessor(i) == To && SuccFeasible[i]) 391 return true; 392 393 // Otherwise, none of the edges are actually feasible at this time... 394 return false; 395} 396 397// visit Implementations - Something changed in this instruction... Either an 398// operand made a transition, or the instruction is newly executable. Change 399// the value type of I to reflect these changes if appropriate. This method 400// makes sure to do the following actions: 401// 402// 1. If a phi node merges two constants in, and has conflicting value coming 403// from different branches, or if the PHI node merges in an overdefined 404// value, then the PHI node becomes overdefined. 405// 2. If a phi node merges only constants in, and they all agree on value, the 406// PHI node becomes a constant value equal to that. 407// 3. If V <- x (op) y && isConstant(x) && isConstant(y) V = Constant 408// 4. If V <- x (op) y && (isOverdefined(x) || isOverdefined(y)) V = Overdefined 409// 5. If V <- MEM or V <- CALL or V <- (unknown) then V = Overdefined 410// 6. If a conditional branch has a value that is constant, make the selected 411// destination executable 412// 7. If a conditional branch has a value that is overdefined, make all 413// successors executable. 414// 415void SCCP::visitPHINode(PHINode &PN) { 416 if (getValueState(&PN).isOverdefined()) return; // Quick exit 417 418 // Look at all of the executable operands of the PHI node. If any of them 419 // are overdefined, the PHI becomes overdefined as well. If they are all 420 // constant, and they agree with each other, the PHI becomes the identical 421 // constant. If they are constant and don't agree, the PHI is overdefined. 422 // If there are no executable operands, the PHI remains undefined. 423 // 424 Constant *OperandVal = 0; 425 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) { 426 InstVal &IV = getValueState(PN.getIncomingValue(i)); 427 if (IV.isUndefined()) continue; // Doesn't influence PHI node. 428 429 if (isEdgeFeasible(PN.getIncomingBlock(i), PN.getParent())) { 430 if (IV.isOverdefined()) { // PHI node becomes overdefined! 431 markOverdefined(&PN); 432 return; 433 } 434 435 if (OperandVal == 0) { // Grab the first value... 436 OperandVal = IV.getConstant(); 437 } else { // Another value is being merged in! 438 // There is already a reachable operand. If we conflict with it, 439 // then the PHI node becomes overdefined. If we agree with it, we 440 // can continue on. 441 442 // Check to see if there are two different constants merging... 443 if (IV.getConstant() != OperandVal) { 444 // Yes there is. This means the PHI node is not constant. 445 // You must be overdefined poor PHI. 446 // 447 markOverdefined(&PN); // The PHI node now becomes overdefined 448 return; // I'm done analyzing you 449 } 450 } 451 } 452 } 453 454 // If we exited the loop, this means that the PHI node only has constant 455 // arguments that agree with each other(and OperandVal is the constant) or 456 // OperandVal is null because there are no defined incoming arguments. If 457 // this is the case, the PHI remains undefined. 458 // 459 if (OperandVal) 460 markConstant(&PN, OperandVal); // Aquire operand value 461} 462 463void SCCP::visitTerminatorInst(TerminatorInst &TI) { 464 std::vector<bool> SuccFeasible; 465 getFeasibleSuccessors(TI, SuccFeasible); 466 467 // Mark all feasible successors executable... 468 for (unsigned i = 0, e = SuccFeasible.size(); i != e; ++i) 469 if (SuccFeasible[i]) { 470 BasicBlock *Succ = TI.getSuccessor(i); 471 markExecutable(Succ); 472 } 473} 474 475void SCCP::visitCastInst(CastInst &I) { 476 Value *V = I.getOperand(0); 477 InstVal &VState = getValueState(V); 478 if (VState.isOverdefined()) { // Inherit overdefinedness of operand 479 markOverdefined(&I); 480 } else if (VState.isConstant()) { // Propagate constant value 481 Constant *Result = 482 ConstantFoldCastInstruction(VState.getConstant(), I.getType()); 483 484 if (Result) { 485 // This instruction constant folds! 486 markConstant(&I, Result); 487 } else { 488 markOverdefined(&I); // Don't know how to fold this instruction. :( 489 } 490 } 491} 492 493// Handle BinaryOperators and Shift Instructions... 494void SCCP::visitBinaryOperator(Instruction &I) { 495 InstVal &V1State = getValueState(I.getOperand(0)); 496 InstVal &V2State = getValueState(I.getOperand(1)); 497 if (V1State.isOverdefined() || V2State.isOverdefined()) { 498 markOverdefined(&I); 499 } else if (V1State.isConstant() && V2State.isConstant()) { 500 Constant *Result = 0; 501 if (isa<BinaryOperator>(I)) 502 Result = ConstantFoldBinaryInstruction(I.getOpcode(), 503 V1State.getConstant(), 504 V2State.getConstant()); 505 else if (isa<ShiftInst>(I)) 506 Result = ConstantFoldShiftInstruction(I.getOpcode(), 507 V1State.getConstant(), 508 V2State.getConstant()); 509 if (Result) 510 markConstant(&I, Result); // This instruction constant folds! 511 else 512 markOverdefined(&I); // Don't know how to fold this instruction. :( 513 } 514} 515 516// Handle getelementptr instructions... if all operands are constants then we 517// can turn this into a getelementptr ConstantExpr. 518// 519void SCCP::visitGetElementPtrInst(GetElementPtrInst &I) { 520 std::vector<Constant*> Operands; 521 Operands.reserve(I.getNumOperands()); 522 523 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) { 524 InstVal &State = getValueState(I.getOperand(i)); 525 if (State.isUndefined()) 526 return; // Operands are not resolved yet... 527 else if (State.isOverdefined()) { 528 markOverdefined(&I); 529 return; 530 } 531 assert(State.isConstant() && "Unknown state!"); 532 Operands.push_back(State.getConstant()); 533 } 534 535 Constant *Ptr = Operands[0]; 536 Operands.erase(Operands.begin()); // Erase the pointer from idx list... 537 538 markConstant(&I, ConstantExpr::getGetElementPtr(Ptr, Operands)); 539} 540