Home | History | Annotate | Download | only in Scalar
      1 //===-- Sink.cpp - Code Sinking -------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This pass moves instructions into successor blocks, when possible, so that
     11 // they aren't executed on paths where their results aren't needed.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #define DEBUG_TYPE "sink"
     16 #include "llvm/Transforms/Scalar.h"
     17 #include "llvm/IntrinsicInst.h"
     18 #include "llvm/Analysis/Dominators.h"
     19 #include "llvm/Analysis/LoopInfo.h"
     20 #include "llvm/Analysis/AliasAnalysis.h"
     21 #include "llvm/Assembly/Writer.h"
     22 #include "llvm/ADT/Statistic.h"
     23 #include "llvm/Support/CFG.h"
     24 #include "llvm/Support/Debug.h"
     25 #include "llvm/Support/raw_ostream.h"
     26 using namespace llvm;
     27 
     28 STATISTIC(NumSunk, "Number of instructions sunk");
     29 
     30 namespace {
     31   class Sinking : public FunctionPass {
     32     DominatorTree *DT;
     33     LoopInfo *LI;
     34     AliasAnalysis *AA;
     35 
     36   public:
     37     static char ID; // Pass identification
     38     Sinking() : FunctionPass(ID) {
     39       initializeSinkingPass(*PassRegistry::getPassRegistry());
     40     }
     41 
     42     virtual bool runOnFunction(Function &F);
     43 
     44     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
     45       AU.setPreservesCFG();
     46       FunctionPass::getAnalysisUsage(AU);
     47       AU.addRequired<AliasAnalysis>();
     48       AU.addRequired<DominatorTree>();
     49       AU.addRequired<LoopInfo>();
     50       AU.addPreserved<DominatorTree>();
     51       AU.addPreserved<LoopInfo>();
     52     }
     53   private:
     54     bool ProcessBlock(BasicBlock &BB);
     55     bool SinkInstruction(Instruction *I, SmallPtrSet<Instruction *, 8> &Stores);
     56     bool AllUsesDominatedByBlock(Instruction *Inst, BasicBlock *BB) const;
     57   };
     58 } // end anonymous namespace
     59 
     60 char Sinking::ID = 0;
     61 INITIALIZE_PASS_BEGIN(Sinking, "sink", "Code sinking", false, false)
     62 INITIALIZE_PASS_DEPENDENCY(LoopInfo)
     63 INITIALIZE_PASS_DEPENDENCY(DominatorTree)
     64 INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
     65 INITIALIZE_PASS_END(Sinking, "sink", "Code sinking", false, false)
     66 
     67 FunctionPass *llvm::createSinkingPass() { return new Sinking(); }
     68 
     69 /// AllUsesDominatedByBlock - Return true if all uses of the specified value
     70 /// occur in blocks dominated by the specified block.
     71 bool Sinking::AllUsesDominatedByBlock(Instruction *Inst,
     72                                       BasicBlock *BB) const {
     73   // Ignoring debug uses is necessary so debug info doesn't affect the code.
     74   // This may leave a referencing dbg_value in the original block, before
     75   // the definition of the vreg.  Dwarf generator handles this although the
     76   // user might not get the right info at runtime.
     77   for (Value::use_iterator I = Inst->use_begin(),
     78        E = Inst->use_end(); I != E; ++I) {
     79     // Determine the block of the use.
     80     Instruction *UseInst = cast<Instruction>(*I);
     81     BasicBlock *UseBlock = UseInst->getParent();
     82     if (PHINode *PN = dyn_cast<PHINode>(UseInst)) {
     83       // PHI nodes use the operand in the predecessor block, not the block with
     84       // the PHI.
     85       unsigned Num = PHINode::getIncomingValueNumForOperand(I.getOperandNo());
     86       UseBlock = PN->getIncomingBlock(Num);
     87     }
     88     // Check that it dominates.
     89     if (!DT->dominates(BB, UseBlock))
     90       return false;
     91   }
     92   return true;
     93 }
     94 
     95 bool Sinking::runOnFunction(Function &F) {
     96   DT = &getAnalysis<DominatorTree>();
     97   LI = &getAnalysis<LoopInfo>();
     98   AA = &getAnalysis<AliasAnalysis>();
     99 
    100   bool EverMadeChange = false;
    101 
    102   while (1) {
    103     bool MadeChange = false;
    104 
    105     // Process all basic blocks.
    106     for (Function::iterator I = F.begin(), E = F.end();
    107          I != E; ++I)
    108       MadeChange |= ProcessBlock(*I);
    109 
    110     // If this iteration over the code changed anything, keep iterating.
    111     if (!MadeChange) break;
    112     EverMadeChange = true;
    113   }
    114   return EverMadeChange;
    115 }
    116 
    117 bool Sinking::ProcessBlock(BasicBlock &BB) {
    118   // Can't sink anything out of a block that has less than two successors.
    119   if (BB.getTerminator()->getNumSuccessors() <= 1 || BB.empty()) return false;
    120 
    121   // Don't bother sinking code out of unreachable blocks. In addition to being
    122   // unprofitable, it can also lead to infinite looping, because in an unreachable
    123   // loop there may be nowhere to stop.
    124   if (!DT->isReachableFromEntry(&BB)) return false;
    125 
    126   bool MadeChange = false;
    127 
    128   // Walk the basic block bottom-up.  Remember if we saw a store.
    129   BasicBlock::iterator I = BB.end();
    130   --I;
    131   bool ProcessedBegin = false;
    132   SmallPtrSet<Instruction *, 8> Stores;
    133   do {
    134     Instruction *Inst = I;  // The instruction to sink.
    135 
    136     // Predecrement I (if it's not begin) so that it isn't invalidated by
    137     // sinking.
    138     ProcessedBegin = I == BB.begin();
    139     if (!ProcessedBegin)
    140       --I;
    141 
    142     if (isa<DbgInfoIntrinsic>(Inst))
    143       continue;
    144 
    145     if (SinkInstruction(Inst, Stores))
    146       ++NumSunk, MadeChange = true;
    147 
    148     // If we just processed the first instruction in the block, we're done.
    149   } while (!ProcessedBegin);
    150 
    151   return MadeChange;
    152 }
    153 
    154 static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA,
    155                          SmallPtrSet<Instruction *, 8> &Stores) {
    156 
    157   if (Inst->mayWriteToMemory()) {
    158     Stores.insert(Inst);
    159     return false;
    160   }
    161 
    162   if (LoadInst *L = dyn_cast<LoadInst>(Inst)) {
    163     AliasAnalysis::Location Loc = AA->getLocation(L);
    164     for (SmallPtrSet<Instruction *, 8>::iterator I = Stores.begin(),
    165          E = Stores.end(); I != E; ++I)
    166       if (AA->getModRefInfo(*I, Loc) & AliasAnalysis::Mod)
    167         return false;
    168   }
    169 
    170   if (isa<TerminatorInst>(Inst) || isa<PHINode>(Inst))
    171     return false;
    172 
    173   return true;
    174 }
    175 
    176 /// SinkInstruction - Determine whether it is safe to sink the specified machine
    177 /// instruction out of its current block into a successor.
    178 bool Sinking::SinkInstruction(Instruction *Inst,
    179                               SmallPtrSet<Instruction *, 8> &Stores) {
    180   // Check if it's safe to move the instruction.
    181   if (!isSafeToMove(Inst, AA, Stores))
    182     return false;
    183 
    184   // FIXME: This should include support for sinking instructions within the
    185   // block they are currently in to shorten the live ranges.  We often get
    186   // instructions sunk into the top of a large block, but it would be better to
    187   // also sink them down before their first use in the block.  This xform has to
    188   // be careful not to *increase* register pressure though, e.g. sinking
    189   // "x = y + z" down if it kills y and z would increase the live ranges of y
    190   // and z and only shrink the live range of x.
    191 
    192   // Loop over all the operands of the specified instruction.  If there is
    193   // anything we can't handle, bail out.
    194   BasicBlock *ParentBlock = Inst->getParent();
    195 
    196   // SuccToSinkTo - This is the successor to sink this instruction to, once we
    197   // decide.
    198   BasicBlock *SuccToSinkTo = 0;
    199 
    200   // FIXME: This picks a successor to sink into based on having one
    201   // successor that dominates all the uses.  However, there are cases where
    202   // sinking can happen but where the sink point isn't a successor.  For
    203   // example:
    204   //   x = computation
    205   //   if () {} else {}
    206   //   use x
    207   // the instruction could be sunk over the whole diamond for the
    208   // if/then/else (or loop, etc), allowing it to be sunk into other blocks
    209   // after that.
    210 
    211   // Instructions can only be sunk if all their uses are in blocks
    212   // dominated by one of the successors.
    213   // Look at all the successors and decide which one
    214   // we should sink to.
    215   for (succ_iterator SI = succ_begin(ParentBlock),
    216        E = succ_end(ParentBlock); SI != E; ++SI) {
    217     if (AllUsesDominatedByBlock(Inst, *SI)) {
    218       SuccToSinkTo = *SI;
    219       break;
    220     }
    221   }
    222 
    223   // If we couldn't find a block to sink to, ignore this instruction.
    224   if (SuccToSinkTo == 0)
    225     return false;
    226 
    227   // It is not possible to sink an instruction into its own block.  This can
    228   // happen with loops.
    229   if (Inst->getParent() == SuccToSinkTo)
    230     return false;
    231 
    232   DEBUG(dbgs() << "Sink instr " << *Inst);
    233   DEBUG(dbgs() << "to block ";
    234         WriteAsOperand(dbgs(), SuccToSinkTo, false));
    235 
    236   // If the block has multiple predecessors, this would introduce computation on
    237   // a path that it doesn't already exist.  We could split the critical edge,
    238   // but for now we just punt.
    239   // FIXME: Split critical edges if not backedges.
    240   if (SuccToSinkTo->getUniquePredecessor() != ParentBlock) {
    241     // We cannot sink a load across a critical edge - there may be stores in
    242     // other code paths.
    243     if (!Inst->isSafeToSpeculativelyExecute()) {
    244       DEBUG(dbgs() << " *** PUNTING: Wont sink load along critical edge.\n");
    245       return false;
    246     }
    247 
    248     // We don't want to sink across a critical edge if we don't dominate the
    249     // successor. We could be introducing calculations to new code paths.
    250     if (!DT->dominates(ParentBlock, SuccToSinkTo)) {
    251       DEBUG(dbgs() << " *** PUNTING: Critical edge found\n");
    252       return false;
    253     }
    254 
    255     // Don't sink instructions into a loop.
    256     if (LI->isLoopHeader(SuccToSinkTo)) {
    257       DEBUG(dbgs() << " *** PUNTING: Loop header found\n");
    258       return false;
    259     }
    260 
    261     // Otherwise we are OK with sinking along a critical edge.
    262     DEBUG(dbgs() << "Sinking along critical edge.\n");
    263   }
    264 
    265   // Determine where to insert into.  Skip phi nodes.
    266   BasicBlock::iterator InsertPos = SuccToSinkTo->begin();
    267   while (InsertPos != SuccToSinkTo->end() && isa<PHINode>(InsertPos))
    268     ++InsertPos;
    269 
    270   // Move the instruction.
    271   Inst->moveBefore(InsertPos);
    272   return true;
    273 }
    274