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