now that loads are in their own table, we can implement
[oota-llvm.git] / lib / Transforms / Scalar / EarlyCSE.cpp
1 //===- EarlyCSE.cpp - Simple and fast CSE pass ----------------------------===//
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 performs a simple dominator tree walk that eliminates trivially
11 // redundant instructions.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #define DEBUG_TYPE "early-cse"
16 #include "llvm/Transforms/Scalar.h"
17 #include "llvm/Instructions.h"
18 #include "llvm/Pass.h"
19 #include "llvm/Analysis/Dominators.h"
20 #include "llvm/Analysis/InstructionSimplify.h"
21 #include "llvm/Target/TargetData.h"
22 #include "llvm/Transforms/Utils/Local.h"
23 #include "llvm/Support/Debug.h"
24 #include "llvm/Support/RecyclingAllocator.h"
25 #include "llvm/ADT/ScopedHashTable.h"
26 #include "llvm/ADT/Statistic.h"
27 using namespace llvm;
28
29 STATISTIC(NumSimplify, "Number of instructions simplified or DCE'd");
30 STATISTIC(NumCSE,      "Number of instructions CSE'd");
31 STATISTIC(NumCSELoad,  "Number of load instructions CSE'd");
32 STATISTIC(NumCSECall,  "Number of call instructions CSE'd");
33
34 static unsigned getHash(const void *V) {
35   return DenseMapInfo<const void*>::getHashValue(V);
36 }
37
38 //===----------------------------------------------------------------------===//
39 // SimpleValue 
40 //===----------------------------------------------------------------------===//
41
42 namespace {
43   /// SimpleValue - Instances of this struct represent available values in the
44   /// scoped hash table.
45   struct SimpleValue {
46     Instruction *Inst;
47     
48     SimpleValue(Instruction *I) : Inst(I) {
49       assert((isSentinel() || canHandle(I)) && "Inst can't be handled!");
50     }
51     
52     bool isSentinel() const {
53       return Inst == DenseMapInfo<Instruction*>::getEmptyKey() ||
54              Inst == DenseMapInfo<Instruction*>::getTombstoneKey();
55     }
56     
57     static bool canHandle(Instruction *Inst) {
58       return isa<CastInst>(Inst) || isa<BinaryOperator>(Inst) ||
59              isa<GetElementPtrInst>(Inst) || isa<CmpInst>(Inst) ||
60              isa<SelectInst>(Inst) || isa<ExtractElementInst>(Inst) ||
61              isa<InsertElementInst>(Inst) || isa<ShuffleVectorInst>(Inst) ||
62              isa<ExtractValueInst>(Inst) || isa<InsertValueInst>(Inst);
63     }
64   };
65 }
66
67 namespace llvm {
68 // SimpleValue is POD.
69 template<> struct isPodLike<SimpleValue> {
70   static const bool value = true;
71 };
72
73 template<> struct DenseMapInfo<SimpleValue> {
74   static inline SimpleValue getEmptyKey() {
75     return DenseMapInfo<Instruction*>::getEmptyKey();
76   }
77   static inline SimpleValue getTombstoneKey() {
78     return DenseMapInfo<Instruction*>::getTombstoneKey();
79   }
80   static unsigned getHashValue(SimpleValue Val);
81   static bool isEqual(SimpleValue LHS, SimpleValue RHS);
82 };
83 }
84
85 unsigned DenseMapInfo<SimpleValue>::getHashValue(SimpleValue Val) {
86   Instruction *Inst = Val.Inst;
87   
88   // Hash in all of the operands as pointers.
89   unsigned Res = 0;
90   for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
91     Res ^= getHash(Inst->getOperand(i)) << i;
92
93   if (CastInst *CI = dyn_cast<CastInst>(Inst))
94     Res ^= getHash(CI->getType());
95   else if (CmpInst *CI = dyn_cast<CmpInst>(Inst))
96     Res ^= CI->getPredicate();
97   else if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(Inst)) {
98     for (ExtractValueInst::idx_iterator I = EVI->idx_begin(),
99          E = EVI->idx_end(); I != E; ++I)
100       Res ^= *I;
101   } else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(Inst)) {
102     for (InsertValueInst::idx_iterator I = IVI->idx_begin(),
103          E = IVI->idx_end(); I != E; ++I)
104       Res ^= *I;
105   } else {
106     // nothing extra to hash in.
107     assert((isa<BinaryOperator>(Inst) || isa<GetElementPtrInst>(Inst) ||
108             isa<SelectInst>(Inst) || isa<ExtractElementInst>(Inst) ||
109             isa<InsertElementInst>(Inst) || isa<ShuffleVectorInst>(Inst)) &&
110            "Invalid/unknown instruction");
111   }
112
113   // Mix in the opcode.
114   return (Res << 1) ^ Inst->getOpcode();
115 }
116
117 bool DenseMapInfo<SimpleValue>::isEqual(SimpleValue LHS, SimpleValue RHS) {
118   Instruction *LHSI = LHS.Inst, *RHSI = RHS.Inst;
119
120   if (LHS.isSentinel() || RHS.isSentinel())
121     return LHSI == RHSI;
122   
123   if (LHSI->getOpcode() != RHSI->getOpcode()) return false;
124   return LHSI->isIdenticalTo(RHSI);
125 }
126
127 //===----------------------------------------------------------------------===//
128 // CallValue 
129 //===----------------------------------------------------------------------===//
130
131 namespace {
132   /// CallValue - Instances of this struct represent available call values in
133   /// the scoped hash table.
134   struct CallValue {
135     Instruction *Inst;
136     
137     CallValue(Instruction *I) : Inst(I) {
138       assert((isSentinel() || canHandle(I)) && "Inst can't be handled!");
139     }
140     
141     bool isSentinel() const {
142       return Inst == DenseMapInfo<Instruction*>::getEmptyKey() ||
143              Inst == DenseMapInfo<Instruction*>::getTombstoneKey();
144     }
145     
146     static bool canHandle(Instruction *Inst) {
147       if (CallInst *CI = dyn_cast<CallInst>(Inst))
148         return CI->onlyReadsMemory();
149       return false;
150     }
151   };
152 }
153
154 namespace llvm {
155   // CallValue is POD.
156   template<> struct isPodLike<CallValue> {
157     static const bool value = true;
158   };
159   
160   template<> struct DenseMapInfo<CallValue> {
161     static inline CallValue getEmptyKey() {
162       return DenseMapInfo<Instruction*>::getEmptyKey();
163     }
164     static inline CallValue getTombstoneKey() {
165       return DenseMapInfo<Instruction*>::getTombstoneKey();
166     }
167     static unsigned getHashValue(CallValue Val);
168     static bool isEqual(CallValue LHS, CallValue RHS);
169   };
170 }
171 unsigned DenseMapInfo<CallValue>::getHashValue(CallValue Val) {
172   Instruction *Inst = Val.Inst;
173   // Hash in all of the operands as pointers.
174   unsigned Res = 0;
175   for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
176     Res ^= getHash(Inst->getOperand(i)) << i;
177   // Mix in the opcode.
178   return (Res << 1) ^ Inst->getOpcode();
179 }
180
181 bool DenseMapInfo<CallValue>::isEqual(CallValue LHS, CallValue RHS) {
182   Instruction *LHSI = LHS.Inst, *RHSI = RHS.Inst;
183   if (LHS.isSentinel() || RHS.isSentinel())
184     return LHSI == RHSI;
185   return LHSI->isIdenticalTo(RHSI);
186 }
187
188
189 //===----------------------------------------------------------------------===//
190 // EarlyCSE pass. 
191 //===----------------------------------------------------------------------===//
192
193 namespace {
194   
195 /// EarlyCSE - This pass does a simple depth-first walk over the dominator
196 /// tree, eliminating trivially redundant instructions and using instsimplify
197 /// to canonicalize things as it goes.  It is intended to be fast and catch
198 /// obvious cases so that instcombine and other passes are more effective.  It
199 /// is expected that a later pass of GVN will catch the interesting/hard
200 /// cases.
201 class EarlyCSE : public FunctionPass {
202 public:
203   const TargetData *TD;
204   DominatorTree *DT;
205   typedef RecyclingAllocator<BumpPtrAllocator,
206                       ScopedHashTableVal<SimpleValue, Value*> > AllocatorTy;
207   typedef ScopedHashTable<SimpleValue, Value*, DenseMapInfo<SimpleValue>,
208                           AllocatorTy> ScopedHTType;
209   
210   /// AvailableValues - This scoped hash table contains the current values of
211   /// all of our simple scalar expressions.  As we walk down the domtree, we
212   /// look to see if instructions are in this: if so, we replace them with what
213   /// we find, otherwise we insert them so that dominated values can succeed in
214   /// their lookup.
215   ScopedHTType *AvailableValues;
216   
217   /// AvailableLoads - This scoped hash table contains the current values
218   /// of loads.  This allows us to get efficient access to dominating loads when
219   /// we have a fully redundant load.  In addition to the most recent load, we
220   /// keep track of a generation count of the read, which is compared against
221   /// the current generation count.  The current generation count is
222   /// incremented after every possibly writing memory operation, which ensures
223   /// that we only CSE loads with other loads that have no intervening store.
224   typedef ScopedHashTable<Value*, std::pair<Value*, unsigned> > LoadHTType;
225   LoadHTType *AvailableLoads;
226   
227   /// AvailableCalls - This scoped hash table contains the current values
228   /// of read-only call values.  It uses the same generation count as loads.
229   typedef ScopedHashTable<CallValue, std::pair<Value*, unsigned> > CallHTType;
230   CallHTType *AvailableCalls;
231   
232   /// CurrentGeneration - This is the current generation of the memory value.
233   unsigned CurrentGeneration;
234   
235   static char ID;
236   explicit EarlyCSE() : FunctionPass(ID) {
237     initializeEarlyCSEPass(*PassRegistry::getPassRegistry());
238   }
239
240   bool runOnFunction(Function &F);
241
242 private:
243   
244   bool processNode(DomTreeNode *Node);
245   
246   // This transformation requires dominator postdominator info
247   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
248     AU.addRequired<DominatorTree>();
249     AU.setPreservesCFG();
250   }
251 };
252 }
253
254 char EarlyCSE::ID = 0;
255
256 // createEarlyCSEPass - The public interface to this file.
257 FunctionPass *llvm::createEarlyCSEPass() {
258   return new EarlyCSE();
259 }
260
261 INITIALIZE_PASS_BEGIN(EarlyCSE, "early-cse", "Early CSE", false, false)
262 INITIALIZE_PASS_DEPENDENCY(DominatorTree)
263 INITIALIZE_PASS_END(EarlyCSE, "early-cse", "Early CSE", false, false)
264
265 bool EarlyCSE::processNode(DomTreeNode *Node) {
266   // Define a scope in the scoped hash table.  When we are done processing this
267   // domtree node and recurse back up to our parent domtree node, this will pop
268   // off all the values we install.
269   ScopedHTType::ScopeTy Scope(*AvailableValues);
270   
271   // Define a scope for the load values so that anything we add will get
272   // popped when we recurse back up to our parent domtree node.
273   LoadHTType::ScopeTy LoadScope(*AvailableLoads);
274   
275   // Define a scope for the call values so that anything we add will get
276   // popped when we recurse back up to our parent domtree node.
277   CallHTType::ScopeTy CallScope(*AvailableCalls);
278   
279   BasicBlock *BB = Node->getBlock();
280   
281   // If this block has a single predecessor, then the predecessor is the parent
282   // of the domtree node and all of the live out memory values are still current
283   // in this block.  If this block has multiple predecessors, then they could
284   // have invalidated the live-out memory values of our parent value.  For now,
285   // just be conservative and invalidate memory if this block has multiple
286   // predecessors.
287   if (BB->getSinglePredecessor() == 0)
288     ++CurrentGeneration;
289   
290   bool Changed = false;
291
292   // See if any instructions in the block can be eliminated.  If so, do it.  If
293   // not, add them to AvailableValues.
294   for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) {
295     Instruction *Inst = I++;
296     
297     // Dead instructions should just be removed.
298     if (isInstructionTriviallyDead(Inst)) {
299       DEBUG(dbgs() << "EarlyCSE DCE: " << *Inst << '\n');
300       Inst->eraseFromParent();
301       Changed = true;
302       ++NumSimplify;
303       continue;
304     }
305     
306     // If the instruction can be simplified (e.g. X+0 = X) then replace it with
307     // its simpler value.
308     if (Value *V = SimplifyInstruction(Inst, TD, DT)) {
309       DEBUG(dbgs() << "EarlyCSE Simplify: " << *Inst << "  to: " << *V << '\n');
310       Inst->replaceAllUsesWith(V);
311       Inst->eraseFromParent();
312       Changed = true;
313       ++NumSimplify;
314       continue;
315     }
316     
317     // If this is a simple instruction that we can value number, process it.
318     if (SimpleValue::canHandle(Inst)) {
319       // See if the instruction has an available value.  If so, use it.
320       if (Value *V = AvailableValues->lookup(Inst)) {
321         DEBUG(dbgs() << "EarlyCSE CSE: " << *Inst << "  to: " << *V << '\n');
322         Inst->replaceAllUsesWith(V);
323         Inst->eraseFromParent();
324         Changed = true;
325         ++NumCSE;
326         continue;
327       }
328       
329       // Otherwise, just remember that this value is available.
330       AvailableValues->insert(Inst, Inst);
331       continue;
332     }
333     
334     // If this is a non-volatile load, process it.
335     if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
336       // Ignore volatile loads.
337       if (LI->isVolatile()) continue;
338       
339       // If we have an available version of this load, and if it is the right
340       // generation, replace this instruction.
341       std::pair<Value*, unsigned> InVal =
342         AvailableLoads->lookup(Inst->getOperand(0));
343       if (InVal.first != 0 && InVal.second == CurrentGeneration) {
344         DEBUG(dbgs() << "EarlyCSE CSE LOAD: " << *Inst << "  to: "
345               << *InVal.first << '\n');
346         if (!Inst->use_empty()) Inst->replaceAllUsesWith(InVal.first);
347         Inst->eraseFromParent();
348         Changed = true;
349         ++NumCSELoad;
350         continue;
351       }
352       
353       // Otherwise, remember that we have this instruction.
354       AvailableLoads->insert(Inst->getOperand(0),
355                           std::pair<Value*, unsigned>(Inst, CurrentGeneration));
356       continue;
357     }
358     
359     // If this is a read-only call, process it.
360     if (CallValue::canHandle(Inst)) {
361       // If we have an available version of this call, and if it is the right
362       // generation, replace this instruction.
363       std::pair<Value*, unsigned> InVal = AvailableCalls->lookup(Inst);
364       if (InVal.first != 0 && InVal.second == CurrentGeneration) {
365         DEBUG(dbgs() << "EarlyCSE CSE CALL: " << *Inst << "  to: "
366                      << *InVal.first << '\n');
367         if (!Inst->use_empty()) Inst->replaceAllUsesWith(InVal.first);
368         Inst->eraseFromParent();
369         Changed = true;
370         ++NumCSECall;
371         continue;
372       }
373       
374       // Otherwise, remember that we have this instruction.
375       AvailableCalls->insert(Inst,
376                          std::pair<Value*, unsigned>(Inst, CurrentGeneration));
377       continue;
378     }
379     
380     // Okay, this isn't something we can CSE at all.  Check to see if it is
381     // something that could modify memory.  If so, our available memory values
382     // cannot be used so bump the generation count.
383     if (Inst->mayWriteToMemory()) {
384       ++CurrentGeneration;
385      
386       // Okay, we just invalidated anything we knew about loaded values.  Try to
387       // salvage *something* by remembering that the stored value is a live
388       // version of the pointer.  It is safe to forward from volatile stores to
389       // non-volatile loads, so we don't have to check for volatility of the
390       // store.
391       if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
392         AvailableLoads->insert(SI->getPointerOperand(),
393          std::pair<Value*, unsigned>(SI->getValueOperand(), CurrentGeneration));
394       }
395     }
396   }
397   
398   unsigned LiveOutGeneration = CurrentGeneration;
399   for (DomTreeNode::iterator I = Node->begin(), E = Node->end(); I != E; ++I) {
400     Changed |= processNode(*I);
401     // Pop any generation changes off the stack from the recursive walk.
402     CurrentGeneration = LiveOutGeneration;
403   }
404   return Changed;
405 }
406
407
408 bool EarlyCSE::runOnFunction(Function &F) {
409   TD = getAnalysisIfAvailable<TargetData>();
410   DT = &getAnalysis<DominatorTree>();
411   
412   // Tables that the pass uses when walking the domtree.
413   ScopedHTType AVTable;
414   AvailableValues = &AVTable;
415   LoadHTType LoadTable;
416   AvailableLoads = &LoadTable;
417   CallHTType CallTable;
418   AvailableCalls = &CallTable;
419   
420   CurrentGeneration = 0;
421   return processNode(DT->getRootNode());
422 }