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 #include "llvm/Transforms/Scalar/EarlyCSE.h"
16 #include "llvm/ADT/Hashing.h"
17 #include "llvm/ADT/ScopedHashTable.h"
18 #include "llvm/ADT/Statistic.h"
19 #include "llvm/Analysis/AssumptionCache.h"
20 #include "llvm/Analysis/GlobalsModRef.h"
21 #include "llvm/Analysis/InstructionSimplify.h"
22 #include "llvm/Analysis/TargetLibraryInfo.h"
23 #include "llvm/Analysis/TargetTransformInfo.h"
24 #include "llvm/IR/DataLayout.h"
25 #include "llvm/IR/Dominators.h"
26 #include "llvm/IR/Instructions.h"
27 #include "llvm/IR/IntrinsicInst.h"
28 #include "llvm/IR/PatternMatch.h"
29 #include "llvm/Pass.h"
30 #include "llvm/Support/Debug.h"
31 #include "llvm/Support/RecyclingAllocator.h"
32 #include "llvm/Support/raw_ostream.h"
33 #include "llvm/Transforms/Scalar.h"
34 #include "llvm/Transforms/Utils/Local.h"
35 #include "llvm/Transforms/Utils/MemorySSA.h"
36 #include <deque>
37 using namespace llvm;
38 using namespace llvm::PatternMatch;
39 
40 #define DEBUG_TYPE "early-cse"
41 
42 STATISTIC(NumSimplify, "Number of instructions simplified or DCE'd");
43 STATISTIC(NumCSE,      "Number of instructions CSE'd");
44 STATISTIC(NumCSECVP,   "Number of compare instructions CVP'd");
45 STATISTIC(NumCSELoad,  "Number of load instructions CSE'd");
46 STATISTIC(NumCSECall,  "Number of call instructions CSE'd");
47 STATISTIC(NumDSE,      "Number of trivial dead stores removed");
48 
49 //===----------------------------------------------------------------------===//
50 // SimpleValue
51 //===----------------------------------------------------------------------===//
52 
53 namespace {
54 /// \brief Struct representing the available values in the scoped hash table.
55 struct SimpleValue {
56   Instruction *Inst;
57 
58   SimpleValue(Instruction *I) : Inst(I) {
59     assert((isSentinel() || canHandle(I)) && "Inst can't be handled!");
60   }
61 
62   bool isSentinel() const {
63     return Inst == DenseMapInfo<Instruction *>::getEmptyKey() ||
64            Inst == DenseMapInfo<Instruction *>::getTombstoneKey();
65   }
66 
67   static bool canHandle(Instruction *Inst) {
68     // This can only handle non-void readnone functions.
69     if (CallInst *CI = dyn_cast<CallInst>(Inst))
70       return CI->doesNotAccessMemory() && !CI->getType()->isVoidTy();
71     return isa<CastInst>(Inst) || isa<BinaryOperator>(Inst) ||
72            isa<GetElementPtrInst>(Inst) || isa<CmpInst>(Inst) ||
73            isa<SelectInst>(Inst) || isa<ExtractElementInst>(Inst) ||
74            isa<InsertElementInst>(Inst) || isa<ShuffleVectorInst>(Inst) ||
75            isa<ExtractValueInst>(Inst) || isa<InsertValueInst>(Inst);
76   }
77 };
78 }
79 
80 namespace llvm {
81 template <> struct DenseMapInfo<SimpleValue> {
82   static inline SimpleValue getEmptyKey() {
83     return DenseMapInfo<Instruction *>::getEmptyKey();
84   }
85   static inline SimpleValue getTombstoneKey() {
86     return DenseMapInfo<Instruction *>::getTombstoneKey();
87   }
88   static unsigned getHashValue(SimpleValue Val);
89   static bool isEqual(SimpleValue LHS, SimpleValue RHS);
90 };
91 }
92 
93 unsigned DenseMapInfo<SimpleValue>::getHashValue(SimpleValue Val) {
94   Instruction *Inst = Val.Inst;
95   // Hash in all of the operands as pointers.
96   if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(Inst)) {
97     Value *LHS = BinOp->getOperand(0);
98     Value *RHS = BinOp->getOperand(1);
99     if (BinOp->isCommutative() && BinOp->getOperand(0) > BinOp->getOperand(1))
100       std::swap(LHS, RHS);
101 
102     return hash_combine(BinOp->getOpcode(), LHS, RHS);
103   }
104 
105   if (CmpInst *CI = dyn_cast<CmpInst>(Inst)) {
106     Value *LHS = CI->getOperand(0);
107     Value *RHS = CI->getOperand(1);
108     CmpInst::Predicate Pred = CI->getPredicate();
109     if (Inst->getOperand(0) > Inst->getOperand(1)) {
110       std::swap(LHS, RHS);
111       Pred = CI->getSwappedPredicate();
112     }
113     return hash_combine(Inst->getOpcode(), Pred, LHS, RHS);
114   }
115 
116   if (CastInst *CI = dyn_cast<CastInst>(Inst))
117     return hash_combine(CI->getOpcode(), CI->getType(), CI->getOperand(0));
118 
119   if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(Inst))
120     return hash_combine(EVI->getOpcode(), EVI->getOperand(0),
121                         hash_combine_range(EVI->idx_begin(), EVI->idx_end()));
122 
123   if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(Inst))
124     return hash_combine(IVI->getOpcode(), IVI->getOperand(0),
125                         IVI->getOperand(1),
126                         hash_combine_range(IVI->idx_begin(), IVI->idx_end()));
127 
128   assert((isa<CallInst>(Inst) || isa<BinaryOperator>(Inst) ||
129           isa<GetElementPtrInst>(Inst) || isa<SelectInst>(Inst) ||
130           isa<ExtractElementInst>(Inst) || isa<InsertElementInst>(Inst) ||
131           isa<ShuffleVectorInst>(Inst)) &&
132          "Invalid/unknown instruction");
133 
134   // Mix in the opcode.
135   return hash_combine(
136       Inst->getOpcode(),
137       hash_combine_range(Inst->value_op_begin(), Inst->value_op_end()));
138 }
139 
140 bool DenseMapInfo<SimpleValue>::isEqual(SimpleValue LHS, SimpleValue RHS) {
141   Instruction *LHSI = LHS.Inst, *RHSI = RHS.Inst;
142 
143   if (LHS.isSentinel() || RHS.isSentinel())
144     return LHSI == RHSI;
145 
146   if (LHSI->getOpcode() != RHSI->getOpcode())
147     return false;
148   if (LHSI->isIdenticalToWhenDefined(RHSI))
149     return true;
150 
151   // If we're not strictly identical, we still might be a commutable instruction
152   if (BinaryOperator *LHSBinOp = dyn_cast<BinaryOperator>(LHSI)) {
153     if (!LHSBinOp->isCommutative())
154       return false;
155 
156     assert(isa<BinaryOperator>(RHSI) &&
157            "same opcode, but different instruction type?");
158     BinaryOperator *RHSBinOp = cast<BinaryOperator>(RHSI);
159 
160     // Commuted equality
161     return LHSBinOp->getOperand(0) == RHSBinOp->getOperand(1) &&
162            LHSBinOp->getOperand(1) == RHSBinOp->getOperand(0);
163   }
164   if (CmpInst *LHSCmp = dyn_cast<CmpInst>(LHSI)) {
165     assert(isa<CmpInst>(RHSI) &&
166            "same opcode, but different instruction type?");
167     CmpInst *RHSCmp = cast<CmpInst>(RHSI);
168     // Commuted equality
169     return LHSCmp->getOperand(0) == RHSCmp->getOperand(1) &&
170            LHSCmp->getOperand(1) == RHSCmp->getOperand(0) &&
171            LHSCmp->getSwappedPredicate() == RHSCmp->getPredicate();
172   }
173 
174   return false;
175 }
176 
177 //===----------------------------------------------------------------------===//
178 // CallValue
179 //===----------------------------------------------------------------------===//
180 
181 namespace {
182 /// \brief Struct representing the available call values in the scoped hash
183 /// table.
184 struct CallValue {
185   Instruction *Inst;
186 
187   CallValue(Instruction *I) : Inst(I) {
188     assert((isSentinel() || canHandle(I)) && "Inst can't be handled!");
189   }
190 
191   bool isSentinel() const {
192     return Inst == DenseMapInfo<Instruction *>::getEmptyKey() ||
193            Inst == DenseMapInfo<Instruction *>::getTombstoneKey();
194   }
195 
196   static bool canHandle(Instruction *Inst) {
197     // Don't value number anything that returns void.
198     if (Inst->getType()->isVoidTy())
199       return false;
200 
201     CallInst *CI = dyn_cast<CallInst>(Inst);
202     if (!CI || !CI->onlyReadsMemory())
203       return false;
204     return true;
205   }
206 };
207 }
208 
209 namespace llvm {
210 template <> struct DenseMapInfo<CallValue> {
211   static inline CallValue getEmptyKey() {
212     return DenseMapInfo<Instruction *>::getEmptyKey();
213   }
214   static inline CallValue getTombstoneKey() {
215     return DenseMapInfo<Instruction *>::getTombstoneKey();
216   }
217   static unsigned getHashValue(CallValue Val);
218   static bool isEqual(CallValue LHS, CallValue RHS);
219 };
220 }
221 
222 unsigned DenseMapInfo<CallValue>::getHashValue(CallValue Val) {
223   Instruction *Inst = Val.Inst;
224   // Hash all of the operands as pointers and mix in the opcode.
225   return hash_combine(
226       Inst->getOpcode(),
227       hash_combine_range(Inst->value_op_begin(), Inst->value_op_end()));
228 }
229 
230 bool DenseMapInfo<CallValue>::isEqual(CallValue LHS, CallValue RHS) {
231   Instruction *LHSI = LHS.Inst, *RHSI = RHS.Inst;
232   if (LHS.isSentinel() || RHS.isSentinel())
233     return LHSI == RHSI;
234   return LHSI->isIdenticalTo(RHSI);
235 }
236 
237 //===----------------------------------------------------------------------===//
238 // EarlyCSE implementation
239 //===----------------------------------------------------------------------===//
240 
241 namespace {
242 /// \brief A simple and fast domtree-based CSE pass.
243 ///
244 /// This pass does a simple depth-first walk over the dominator tree,
245 /// eliminating trivially redundant instructions and using instsimplify to
246 /// canonicalize things as it goes. It is intended to be fast and catch obvious
247 /// cases so that instcombine and other passes are more effective. It is
248 /// expected that a later pass of GVN will catch the interesting/hard cases.
249 class EarlyCSE {
250 public:
251   const TargetLibraryInfo &TLI;
252   const TargetTransformInfo &TTI;
253   DominatorTree &DT;
254   AssumptionCache &AC;
255   MemorySSA *MSSA;
256   typedef RecyclingAllocator<
257       BumpPtrAllocator, ScopedHashTableVal<SimpleValue, Value *>> AllocatorTy;
258   typedef ScopedHashTable<SimpleValue, Value *, DenseMapInfo<SimpleValue>,
259                           AllocatorTy> ScopedHTType;
260 
261   /// \brief A scoped hash table of the current values of all of our simple
262   /// scalar expressions.
263   ///
264   /// As we walk down the domtree, we look to see if instructions are in this:
265   /// if so, we replace them with what we find, otherwise we insert them so
266   /// that dominated values can succeed in their lookup.
267   ScopedHTType AvailableValues;
268 
269   /// A scoped hash table of the current values of previously encounted memory
270   /// locations.
271   ///
272   /// This allows us to get efficient access to dominating loads or stores when
273   /// we have a fully redundant load.  In addition to the most recent load, we
274   /// keep track of a generation count of the read, which is compared against
275   /// the current generation count.  The current generation count is incremented
276   /// after every possibly writing memory operation, which ensures that we only
277   /// CSE loads with other loads that have no intervening store.  Ordering
278   /// events (such as fences or atomic instructions) increment the generation
279   /// count as well; essentially, we model these as writes to all possible
280   /// locations.  Note that atomic and/or volatile loads and stores can be
281   /// present the table; it is the responsibility of the consumer to inspect
282   /// the atomicity/volatility if needed.
283   struct LoadValue {
284     Instruction *DefInst;
285     unsigned Generation;
286     int MatchingId;
287     bool IsAtomic;
288     bool IsInvariant;
289     LoadValue()
290         : DefInst(nullptr), Generation(0), MatchingId(-1), IsAtomic(false),
291           IsInvariant(false) {}
292     LoadValue(Instruction *Inst, unsigned Generation, unsigned MatchingId,
293               bool IsAtomic, bool IsInvariant)
294         : DefInst(Inst), Generation(Generation), MatchingId(MatchingId),
295           IsAtomic(IsAtomic), IsInvariant(IsInvariant) {}
296   };
297   typedef RecyclingAllocator<BumpPtrAllocator,
298                              ScopedHashTableVal<Value *, LoadValue>>
299       LoadMapAllocator;
300   typedef ScopedHashTable<Value *, LoadValue, DenseMapInfo<Value *>,
301                           LoadMapAllocator> LoadHTType;
302   LoadHTType AvailableLoads;
303 
304   /// \brief A scoped hash table of the current values of read-only call
305   /// values.
306   ///
307   /// It uses the same generation count as loads.
308   typedef ScopedHashTable<CallValue, std::pair<Instruction *, unsigned>>
309       CallHTType;
310   CallHTType AvailableCalls;
311 
312   /// \brief This is the current generation of the memory value.
313   unsigned CurrentGeneration;
314 
315   /// \brief Set up the EarlyCSE runner for a particular function.
316   EarlyCSE(const TargetLibraryInfo &TLI, const TargetTransformInfo &TTI,
317            DominatorTree &DT, AssumptionCache &AC, MemorySSA *MSSA)
318       : TLI(TLI), TTI(TTI), DT(DT), AC(AC), MSSA(MSSA), CurrentGeneration(0) {}
319 
320   bool run();
321 
322 private:
323   // Almost a POD, but needs to call the constructors for the scoped hash
324   // tables so that a new scope gets pushed on. These are RAII so that the
325   // scope gets popped when the NodeScope is destroyed.
326   class NodeScope {
327   public:
328     NodeScope(ScopedHTType &AvailableValues, LoadHTType &AvailableLoads,
329               CallHTType &AvailableCalls)
330         : Scope(AvailableValues), LoadScope(AvailableLoads),
331           CallScope(AvailableCalls) {}
332 
333   private:
334     NodeScope(const NodeScope &) = delete;
335     void operator=(const NodeScope &) = delete;
336 
337     ScopedHTType::ScopeTy Scope;
338     LoadHTType::ScopeTy LoadScope;
339     CallHTType::ScopeTy CallScope;
340   };
341 
342   // Contains all the needed information to create a stack for doing a depth
343   // first traversal of the tree. This includes scopes for values, loads, and
344   // calls as well as the generation. There is a child iterator so that the
345   // children do not need to be store separately.
346   class StackNode {
347   public:
348     StackNode(ScopedHTType &AvailableValues, LoadHTType &AvailableLoads,
349               CallHTType &AvailableCalls, unsigned cg, DomTreeNode *n,
350               DomTreeNode::iterator child, DomTreeNode::iterator end)
351         : CurrentGeneration(cg), ChildGeneration(cg), Node(n), ChildIter(child),
352           EndIter(end), Scopes(AvailableValues, AvailableLoads, AvailableCalls),
353           Processed(false) {}
354 
355     // Accessors.
356     unsigned currentGeneration() { return CurrentGeneration; }
357     unsigned childGeneration() { return ChildGeneration; }
358     void childGeneration(unsigned generation) { ChildGeneration = generation; }
359     DomTreeNode *node() { return Node; }
360     DomTreeNode::iterator childIter() { return ChildIter; }
361     DomTreeNode *nextChild() {
362       DomTreeNode *child = *ChildIter;
363       ++ChildIter;
364       return child;
365     }
366     DomTreeNode::iterator end() { return EndIter; }
367     bool isProcessed() { return Processed; }
368     void process() { Processed = true; }
369 
370   private:
371     StackNode(const StackNode &) = delete;
372     void operator=(const StackNode &) = delete;
373 
374     // Members.
375     unsigned CurrentGeneration;
376     unsigned ChildGeneration;
377     DomTreeNode *Node;
378     DomTreeNode::iterator ChildIter;
379     DomTreeNode::iterator EndIter;
380     NodeScope Scopes;
381     bool Processed;
382   };
383 
384   /// \brief Wrapper class to handle memory instructions, including loads,
385   /// stores and intrinsic loads and stores defined by the target.
386   class ParseMemoryInst {
387   public:
388     ParseMemoryInst(Instruction *Inst, const TargetTransformInfo &TTI)
389       : IsTargetMemInst(false), Inst(Inst) {
390       if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst))
391         if (TTI.getTgtMemIntrinsic(II, Info) && Info.NumMemRefs == 1)
392           IsTargetMemInst = true;
393     }
394     bool isLoad() const {
395       if (IsTargetMemInst) return Info.ReadMem;
396       return isa<LoadInst>(Inst);
397     }
398     bool isStore() const {
399       if (IsTargetMemInst) return Info.WriteMem;
400       return isa<StoreInst>(Inst);
401     }
402     bool isAtomic() const {
403       if (IsTargetMemInst) {
404         assert(Info.IsSimple && "need to refine IsSimple in TTI");
405         return false;
406       }
407       return Inst->isAtomic();
408     }
409     bool isUnordered() const {
410       if (IsTargetMemInst) {
411         assert(Info.IsSimple && "need to refine IsSimple in TTI");
412         return true;
413       }
414       if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
415         return LI->isUnordered();
416       } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
417         return SI->isUnordered();
418       }
419       // Conservative answer
420       return !Inst->isAtomic();
421     }
422 
423     bool isVolatile() const {
424       if (IsTargetMemInst) {
425         assert(Info.IsSimple && "need to refine IsSimple in TTI");
426         return false;
427       }
428       if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
429         return LI->isVolatile();
430       } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
431         return SI->isVolatile();
432       }
433       // Conservative answer
434       return true;
435     }
436 
437     bool isInvariantLoad() const {
438       if (auto *LI = dyn_cast<LoadInst>(Inst))
439         return LI->getMetadata(LLVMContext::MD_invariant_load) != nullptr;
440       return false;
441     }
442 
443     bool isMatchingMemLoc(const ParseMemoryInst &Inst) const {
444       return (getPointerOperand() == Inst.getPointerOperand() &&
445               getMatchingId() == Inst.getMatchingId());
446     }
447     bool isValid() const { return getPointerOperand() != nullptr; }
448 
449     // For regular (non-intrinsic) loads/stores, this is set to -1. For
450     // intrinsic loads/stores, the id is retrieved from the corresponding
451     // field in the MemIntrinsicInfo structure.  That field contains
452     // non-negative values only.
453     int getMatchingId() const {
454       if (IsTargetMemInst) return Info.MatchingId;
455       return -1;
456     }
457     Value *getPointerOperand() const {
458       if (IsTargetMemInst) return Info.PtrVal;
459       if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
460         return LI->getPointerOperand();
461       } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
462         return SI->getPointerOperand();
463       }
464       return nullptr;
465     }
466     bool mayReadFromMemory() const {
467       if (IsTargetMemInst) return Info.ReadMem;
468       return Inst->mayReadFromMemory();
469     }
470     bool mayWriteToMemory() const {
471       if (IsTargetMemInst) return Info.WriteMem;
472       return Inst->mayWriteToMemory();
473     }
474 
475   private:
476     bool IsTargetMemInst;
477     MemIntrinsicInfo Info;
478     Instruction *Inst;
479   };
480 
481   bool processNode(DomTreeNode *Node);
482 
483   Value *getOrCreateResult(Value *Inst, Type *ExpectedType) const {
484     if (auto *LI = dyn_cast<LoadInst>(Inst))
485       return LI;
486     if (auto *SI = dyn_cast<StoreInst>(Inst))
487       return SI->getValueOperand();
488     assert(isa<IntrinsicInst>(Inst) && "Instruction not supported");
489     return TTI.getOrCreateResultFromMemIntrinsic(cast<IntrinsicInst>(Inst),
490                                                  ExpectedType);
491   }
492 
493   bool isSameMemGeneration(unsigned EarlierGeneration, unsigned LaterGeneration,
494                            Instruction *EarlierInst, Instruction *LaterInst);
495 
496   void removeMSSA(Instruction *Inst) {
497     if (!MSSA)
498       return;
499     // Removing a store here can leave MemorySSA in an unoptimized state by
500     // creating MemoryPhis that have identical arguments and by creating
501     // MemoryUses whose defining access is not an actual clobber.  We handle the
502     // phi case eagerly here.  The non-optimized MemoryUse case is lazily
503     // updated by MemorySSA getClobberingMemoryAccess.
504     if (MemoryAccess *MA = MSSA->getMemoryAccess(Inst)) {
505       // Optimize MemoryPhi nodes that may become redundant by having all the
506       // same input values once MA is removed.
507       SmallVector<MemoryPhi *, 4> PhisToCheck;
508       SmallVector<MemoryAccess *, 8> WorkQueue;
509       WorkQueue.push_back(MA);
510       // Process MemoryPhi nodes in FIFO order using a ever-growing vector since
511       // we shouldn't be processing that many phis and this will avoid an
512       // allocation in almost all cases.
513       for (unsigned I = 0; I < WorkQueue.size(); ++I) {
514         MemoryAccess *WI = WorkQueue[I];
515 
516         for (auto *U : WI->users())
517           if (MemoryPhi *MP = dyn_cast<MemoryPhi>(U))
518             PhisToCheck.push_back(MP);
519 
520         MSSA->removeMemoryAccess(WI);
521 
522         for (MemoryPhi *MP : PhisToCheck) {
523           MemoryAccess *FirstIn = MP->getIncomingValue(0);
524           if (all_of(MP->incoming_values(),
525                      [=](Use &In) { return In == FirstIn; }))
526             WorkQueue.push_back(MP);
527         }
528         PhisToCheck.clear();
529       }
530     }
531   }
532 };
533 }
534 
535 /// Determine if the memory referenced by LaterInst is from the same heap
536 /// version as EarlierInst.
537 /// This is currently called in two scenarios:
538 ///
539 ///   load p
540 ///   ...
541 ///   load p
542 ///
543 /// and
544 ///
545 ///   x = load p
546 ///   ...
547 ///   store x, p
548 ///
549 /// in both cases we want to verify that there are no possible writes to the
550 /// memory referenced by p between the earlier and later instruction.
551 bool EarlyCSE::isSameMemGeneration(unsigned EarlierGeneration,
552                                    unsigned LaterGeneration,
553                                    Instruction *EarlierInst,
554                                    Instruction *LaterInst) {
555   // Check the simple memory generation tracking first.
556   if (EarlierGeneration == LaterGeneration)
557     return true;
558 
559   if (!MSSA)
560     return false;
561 
562   // Since we know LaterDef dominates LaterInst and EarlierInst dominates
563   // LaterInst, if LaterDef dominates EarlierInst then it can't occur between
564   // EarlierInst and LaterInst and neither can any other write that potentially
565   // clobbers LaterInst.
566   MemoryAccess *LaterDef =
567       MSSA->getWalker()->getClobberingMemoryAccess(LaterInst);
568   return MSSA->dominates(LaterDef, MSSA->getMemoryAccess(EarlierInst));
569 }
570 
571 bool EarlyCSE::processNode(DomTreeNode *Node) {
572   bool Changed = false;
573   BasicBlock *BB = Node->getBlock();
574 
575   // If this block has a single predecessor, then the predecessor is the parent
576   // of the domtree node and all of the live out memory values are still current
577   // in this block.  If this block has multiple predecessors, then they could
578   // have invalidated the live-out memory values of our parent value.  For now,
579   // just be conservative and invalidate memory if this block has multiple
580   // predecessors.
581   if (!BB->getSinglePredecessor())
582     ++CurrentGeneration;
583 
584   // If this node has a single predecessor which ends in a conditional branch,
585   // we can infer the value of the branch condition given that we took this
586   // path.  We need the single predecessor to ensure there's not another path
587   // which reaches this block where the condition might hold a different
588   // value.  Since we're adding this to the scoped hash table (like any other
589   // def), it will have been popped if we encounter a future merge block.
590   if (BasicBlock *Pred = BB->getSinglePredecessor())
591     if (auto *BI = dyn_cast<BranchInst>(Pred->getTerminator()))
592       if (BI->isConditional())
593         if (auto *CondInst = dyn_cast<Instruction>(BI->getCondition()))
594           if (SimpleValue::canHandle(CondInst)) {
595             assert(BI->getSuccessor(0) == BB || BI->getSuccessor(1) == BB);
596             auto *ConditionalConstant = (BI->getSuccessor(0) == BB) ?
597               ConstantInt::getTrue(BB->getContext()) :
598               ConstantInt::getFalse(BB->getContext());
599             AvailableValues.insert(CondInst, ConditionalConstant);
600             DEBUG(dbgs() << "EarlyCSE CVP: Add conditional value for '"
601                   << CondInst->getName() << "' as " << *ConditionalConstant
602                   << " in " << BB->getName() << "\n");
603             // Replace all dominated uses with the known value.
604             if (unsigned Count =
605                     replaceDominatedUsesWith(CondInst, ConditionalConstant, DT,
606                                              BasicBlockEdge(Pred, BB))) {
607               Changed = true;
608               NumCSECVP = NumCSECVP + Count;
609             }
610           }
611 
612   /// LastStore - Keep track of the last non-volatile store that we saw... for
613   /// as long as there in no instruction that reads memory.  If we see a store
614   /// to the same location, we delete the dead store.  This zaps trivial dead
615   /// stores which can occur in bitfield code among other things.
616   Instruction *LastStore = nullptr;
617 
618   const DataLayout &DL = BB->getModule()->getDataLayout();
619 
620   // See if any instructions in the block can be eliminated.  If so, do it.  If
621   // not, add them to AvailableValues.
622   for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;) {
623     Instruction *Inst = &*I++;
624 
625     // Dead instructions should just be removed.
626     if (isInstructionTriviallyDead(Inst, &TLI)) {
627       DEBUG(dbgs() << "EarlyCSE DCE: " << *Inst << '\n');
628       removeMSSA(Inst);
629       Inst->eraseFromParent();
630       Changed = true;
631       ++NumSimplify;
632       continue;
633     }
634 
635     // Skip assume intrinsics, they don't really have side effects (although
636     // they're marked as such to ensure preservation of control dependencies),
637     // and this pass will not disturb any of the assumption's control
638     // dependencies.
639     if (match(Inst, m_Intrinsic<Intrinsic::assume>())) {
640       DEBUG(dbgs() << "EarlyCSE skipping assumption: " << *Inst << '\n');
641       continue;
642     }
643 
644     // Skip invariant.start intrinsics since they only read memory, and we can
645     // forward values across it. Also, we dont need to consume the last store
646     // since the semantics of invariant.start allow us to perform DSE of the
647     // last store, if there was a store following invariant.start. Consider:
648     //
649     // store 30, i8* p
650     // invariant.start(p)
651     // store 40, i8* p
652     // We can DSE the store to 30, since the store 40 to invariant location p
653     // causes undefined behaviour.
654     if (match(Inst, m_Intrinsic<Intrinsic::invariant_start>()))
655       continue;
656 
657     if (match(Inst, m_Intrinsic<Intrinsic::experimental_guard>())) {
658       if (auto *CondI =
659               dyn_cast<Instruction>(cast<CallInst>(Inst)->getArgOperand(0))) {
660         // The condition we're on guarding here is true for all dominated
661         // locations.
662         if (SimpleValue::canHandle(CondI))
663           AvailableValues.insert(CondI, ConstantInt::getTrue(BB->getContext()));
664       }
665 
666       // Guard intrinsics read all memory, but don't write any memory.
667       // Accordingly, don't update the generation but consume the last store (to
668       // avoid an incorrect DSE).
669       LastStore = nullptr;
670       continue;
671     }
672 
673     // If the instruction can be simplified (e.g. X+0 = X) then replace it with
674     // its simpler value.
675     if (Value *V = SimplifyInstruction(Inst, DL, &TLI, &DT, &AC)) {
676       DEBUG(dbgs() << "EarlyCSE Simplify: " << *Inst << "  to: " << *V << '\n');
677       bool Killed = false;
678       if (!Inst->use_empty()) {
679         Inst->replaceAllUsesWith(V);
680         Changed = true;
681       }
682       if (isInstructionTriviallyDead(Inst, &TLI)) {
683         removeMSSA(Inst);
684         Inst->eraseFromParent();
685         Changed = true;
686         Killed = true;
687       }
688       if (Changed)
689         ++NumSimplify;
690       if (Killed)
691         continue;
692     }
693 
694     // If this is a simple instruction that we can value number, process it.
695     if (SimpleValue::canHandle(Inst)) {
696       // See if the instruction has an available value.  If so, use it.
697       if (Value *V = AvailableValues.lookup(Inst)) {
698         DEBUG(dbgs() << "EarlyCSE CSE: " << *Inst << "  to: " << *V << '\n');
699         if (auto *I = dyn_cast<Instruction>(V))
700           I->andIRFlags(Inst);
701         Inst->replaceAllUsesWith(V);
702         removeMSSA(Inst);
703         Inst->eraseFromParent();
704         Changed = true;
705         ++NumCSE;
706         continue;
707       }
708 
709       // Otherwise, just remember that this value is available.
710       AvailableValues.insert(Inst, Inst);
711       continue;
712     }
713 
714     ParseMemoryInst MemInst(Inst, TTI);
715     // If this is a non-volatile load, process it.
716     if (MemInst.isValid() && MemInst.isLoad()) {
717       // (conservatively) we can't peak past the ordering implied by this
718       // operation, but we can add this load to our set of available values
719       if (MemInst.isVolatile() || !MemInst.isUnordered()) {
720         LastStore = nullptr;
721         ++CurrentGeneration;
722       }
723 
724       // If we have an available version of this load, and if it is the right
725       // generation or the load is known to be from an invariant location,
726       // replace this instruction.
727       //
728       // If either the dominating load or the current load are invariant, then
729       // we can assume the current load loads the same value as the dominating
730       // load.
731       LoadValue InVal = AvailableLoads.lookup(MemInst.getPointerOperand());
732       if (InVal.DefInst != nullptr &&
733           InVal.MatchingId == MemInst.getMatchingId() &&
734           // We don't yet handle removing loads with ordering of any kind.
735           !MemInst.isVolatile() && MemInst.isUnordered() &&
736           // We can't replace an atomic load with one which isn't also atomic.
737           InVal.IsAtomic >= MemInst.isAtomic() &&
738           (InVal.IsInvariant || MemInst.isInvariantLoad() ||
739            isSameMemGeneration(InVal.Generation, CurrentGeneration,
740                                InVal.DefInst, Inst))) {
741         Value *Op = getOrCreateResult(InVal.DefInst, Inst->getType());
742         if (Op != nullptr) {
743           DEBUG(dbgs() << "EarlyCSE CSE LOAD: " << *Inst
744                        << "  to: " << *InVal.DefInst << '\n');
745           if (!Inst->use_empty())
746             Inst->replaceAllUsesWith(Op);
747           removeMSSA(Inst);
748           Inst->eraseFromParent();
749           Changed = true;
750           ++NumCSELoad;
751           continue;
752         }
753       }
754 
755       // Otherwise, remember that we have this instruction.
756       AvailableLoads.insert(
757           MemInst.getPointerOperand(),
758           LoadValue(Inst, CurrentGeneration, MemInst.getMatchingId(),
759                     MemInst.isAtomic(), MemInst.isInvariantLoad()));
760       LastStore = nullptr;
761       continue;
762     }
763 
764     // If this instruction may read from memory or throw (and potentially read
765     // from memory in the exception handler), forget LastStore.  Load/store
766     // intrinsics will indicate both a read and a write to memory.  The target
767     // may override this (e.g. so that a store intrinsic does not read from
768     // memory, and thus will be treated the same as a regular store for
769     // commoning purposes).
770     if ((Inst->mayReadFromMemory() || Inst->mayThrow()) &&
771         !(MemInst.isValid() && !MemInst.mayReadFromMemory()))
772       LastStore = nullptr;
773 
774     // If this is a read-only call, process it.
775     if (CallValue::canHandle(Inst)) {
776       // If we have an available version of this call, and if it is the right
777       // generation, replace this instruction.
778       std::pair<Instruction *, unsigned> InVal = AvailableCalls.lookup(Inst);
779       if (InVal.first != nullptr &&
780           isSameMemGeneration(InVal.second, CurrentGeneration, InVal.first,
781                               Inst)) {
782         DEBUG(dbgs() << "EarlyCSE CSE CALL: " << *Inst
783                      << "  to: " << *InVal.first << '\n');
784         if (!Inst->use_empty())
785           Inst->replaceAllUsesWith(InVal.first);
786         removeMSSA(Inst);
787         Inst->eraseFromParent();
788         Changed = true;
789         ++NumCSECall;
790         continue;
791       }
792 
793       // Otherwise, remember that we have this instruction.
794       AvailableCalls.insert(
795           Inst, std::pair<Instruction *, unsigned>(Inst, CurrentGeneration));
796       continue;
797     }
798 
799     // A release fence requires that all stores complete before it, but does
800     // not prevent the reordering of following loads 'before' the fence.  As a
801     // result, we don't need to consider it as writing to memory and don't need
802     // to advance the generation.  We do need to prevent DSE across the fence,
803     // but that's handled above.
804     if (FenceInst *FI = dyn_cast<FenceInst>(Inst))
805       if (FI->getOrdering() == AtomicOrdering::Release) {
806         assert(Inst->mayReadFromMemory() && "relied on to prevent DSE above");
807         continue;
808       }
809 
810     // write back DSE - If we write back the same value we just loaded from
811     // the same location and haven't passed any intervening writes or ordering
812     // operations, we can remove the write.  The primary benefit is in allowing
813     // the available load table to remain valid and value forward past where
814     // the store originally was.
815     if (MemInst.isValid() && MemInst.isStore()) {
816       LoadValue InVal = AvailableLoads.lookup(MemInst.getPointerOperand());
817       if (InVal.DefInst &&
818           InVal.DefInst == getOrCreateResult(Inst, InVal.DefInst->getType()) &&
819           InVal.MatchingId == MemInst.getMatchingId() &&
820           // We don't yet handle removing stores with ordering of any kind.
821           !MemInst.isVolatile() && MemInst.isUnordered() &&
822           isSameMemGeneration(InVal.Generation, CurrentGeneration,
823                               InVal.DefInst, Inst)) {
824         // It is okay to have a LastStore to a different pointer here if MemorySSA
825         // tells us that the load and store are from the same memory generation.
826         // In that case, LastStore should keep its present value since we're
827         // removing the current store.
828         assert((!LastStore ||
829                 ParseMemoryInst(LastStore, TTI).getPointerOperand() ==
830                     MemInst.getPointerOperand() ||
831                 MSSA) &&
832                "can't have an intervening store if not using MemorySSA!");
833         DEBUG(dbgs() << "EarlyCSE DSE (writeback): " << *Inst << '\n');
834         removeMSSA(Inst);
835         Inst->eraseFromParent();
836         Changed = true;
837         ++NumDSE;
838         // We can avoid incrementing the generation count since we were able
839         // to eliminate this store.
840         continue;
841       }
842     }
843 
844     // Okay, this isn't something we can CSE at all.  Check to see if it is
845     // something that could modify memory.  If so, our available memory values
846     // cannot be used so bump the generation count.
847     if (Inst->mayWriteToMemory()) {
848       ++CurrentGeneration;
849 
850       if (MemInst.isValid() && MemInst.isStore()) {
851         // We do a trivial form of DSE if there are two stores to the same
852         // location with no intervening loads.  Delete the earlier store.
853         // At the moment, we don't remove ordered stores, but do remove
854         // unordered atomic stores.  There's no special requirement (for
855         // unordered atomics) about removing atomic stores only in favor of
856         // other atomic stores since we we're going to execute the non-atomic
857         // one anyway and the atomic one might never have become visible.
858         if (LastStore) {
859           ParseMemoryInst LastStoreMemInst(LastStore, TTI);
860           assert(LastStoreMemInst.isUnordered() &&
861                  !LastStoreMemInst.isVolatile() &&
862                  "Violated invariant");
863           if (LastStoreMemInst.isMatchingMemLoc(MemInst)) {
864             DEBUG(dbgs() << "EarlyCSE DEAD STORE: " << *LastStore
865                          << "  due to: " << *Inst << '\n');
866             removeMSSA(LastStore);
867             LastStore->eraseFromParent();
868             Changed = true;
869             ++NumDSE;
870             LastStore = nullptr;
871           }
872           // fallthrough - we can exploit information about this store
873         }
874 
875         // Okay, we just invalidated anything we knew about loaded values.  Try
876         // to salvage *something* by remembering that the stored value is a live
877         // version of the pointer.  It is safe to forward from volatile stores
878         // to non-volatile loads, so we don't have to check for volatility of
879         // the store.
880         AvailableLoads.insert(
881             MemInst.getPointerOperand(),
882             LoadValue(Inst, CurrentGeneration, MemInst.getMatchingId(),
883                       MemInst.isAtomic(), /*IsInvariant=*/false));
884 
885         // Remember that this was the last unordered store we saw for DSE. We
886         // don't yet handle DSE on ordered or volatile stores since we don't
887         // have a good way to model the ordering requirement for following
888         // passes  once the store is removed.  We could insert a fence, but
889         // since fences are slightly stronger than stores in their ordering,
890         // it's not clear this is a profitable transform. Another option would
891         // be to merge the ordering with that of the post dominating store.
892         if (MemInst.isUnordered() && !MemInst.isVolatile())
893           LastStore = Inst;
894         else
895           LastStore = nullptr;
896       }
897     }
898   }
899 
900   return Changed;
901 }
902 
903 bool EarlyCSE::run() {
904   // Note, deque is being used here because there is significant performance
905   // gains over vector when the container becomes very large due to the
906   // specific access patterns. For more information see the mailing list
907   // discussion on this:
908   // http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20120116/135228.html
909   std::deque<StackNode *> nodesToProcess;
910 
911   bool Changed = false;
912 
913   // Process the root node.
914   nodesToProcess.push_back(new StackNode(
915       AvailableValues, AvailableLoads, AvailableCalls, CurrentGeneration,
916       DT.getRootNode(), DT.getRootNode()->begin(), DT.getRootNode()->end()));
917 
918   // Save the current generation.
919   unsigned LiveOutGeneration = CurrentGeneration;
920 
921   // Process the stack.
922   while (!nodesToProcess.empty()) {
923     // Grab the first item off the stack. Set the current generation, remove
924     // the node from the stack, and process it.
925     StackNode *NodeToProcess = nodesToProcess.back();
926 
927     // Initialize class members.
928     CurrentGeneration = NodeToProcess->currentGeneration();
929 
930     // Check if the node needs to be processed.
931     if (!NodeToProcess->isProcessed()) {
932       // Process the node.
933       Changed |= processNode(NodeToProcess->node());
934       NodeToProcess->childGeneration(CurrentGeneration);
935       NodeToProcess->process();
936     } else if (NodeToProcess->childIter() != NodeToProcess->end()) {
937       // Push the next child onto the stack.
938       DomTreeNode *child = NodeToProcess->nextChild();
939       nodesToProcess.push_back(
940           new StackNode(AvailableValues, AvailableLoads, AvailableCalls,
941                         NodeToProcess->childGeneration(), child, child->begin(),
942                         child->end()));
943     } else {
944       // It has been processed, and there are no more children to process,
945       // so delete it and pop it off the stack.
946       delete NodeToProcess;
947       nodesToProcess.pop_back();
948     }
949   } // while (!nodes...)
950 
951   // Reset the current generation.
952   CurrentGeneration = LiveOutGeneration;
953 
954   return Changed;
955 }
956 
957 PreservedAnalyses EarlyCSEPass::run(Function &F,
958                                     FunctionAnalysisManager &AM) {
959   auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
960   auto &TTI = AM.getResult<TargetIRAnalysis>(F);
961   auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
962   auto &AC = AM.getResult<AssumptionAnalysis>(F);
963   auto *MSSA =
964       UseMemorySSA ? &AM.getResult<MemorySSAAnalysis>(F).getMSSA() : nullptr;
965 
966   EarlyCSE CSE(TLI, TTI, DT, AC, MSSA);
967 
968   if (!CSE.run())
969     return PreservedAnalyses::all();
970 
971   PreservedAnalyses PA;
972   PA.preserveSet<CFGAnalyses>();
973   PA.preserve<GlobalsAA>();
974   if (UseMemorySSA)
975     PA.preserve<MemorySSAAnalysis>();
976   return PA;
977 }
978 
979 namespace {
980 /// \brief A simple and fast domtree-based CSE pass.
981 ///
982 /// This pass does a simple depth-first walk over the dominator tree,
983 /// eliminating trivially redundant instructions and using instsimplify to
984 /// canonicalize things as it goes. It is intended to be fast and catch obvious
985 /// cases so that instcombine and other passes are more effective. It is
986 /// expected that a later pass of GVN will catch the interesting/hard cases.
987 template<bool UseMemorySSA>
988 class EarlyCSELegacyCommonPass : public FunctionPass {
989 public:
990   static char ID;
991 
992   EarlyCSELegacyCommonPass() : FunctionPass(ID) {
993     if (UseMemorySSA)
994       initializeEarlyCSEMemSSALegacyPassPass(*PassRegistry::getPassRegistry());
995     else
996       initializeEarlyCSELegacyPassPass(*PassRegistry::getPassRegistry());
997   }
998 
999   bool runOnFunction(Function &F) override {
1000     if (skipFunction(F))
1001       return false;
1002 
1003     auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
1004     auto &TTI = getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
1005     auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
1006     auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
1007     auto *MSSA =
1008         UseMemorySSA ? &getAnalysis<MemorySSAWrapperPass>().getMSSA() : nullptr;
1009 
1010     EarlyCSE CSE(TLI, TTI, DT, AC, MSSA);
1011 
1012     return CSE.run();
1013   }
1014 
1015   void getAnalysisUsage(AnalysisUsage &AU) const override {
1016     AU.addRequired<AssumptionCacheTracker>();
1017     AU.addRequired<DominatorTreeWrapperPass>();
1018     AU.addRequired<TargetLibraryInfoWrapperPass>();
1019     AU.addRequired<TargetTransformInfoWrapperPass>();
1020     if (UseMemorySSA) {
1021       AU.addRequired<MemorySSAWrapperPass>();
1022       AU.addPreserved<MemorySSAWrapperPass>();
1023     }
1024     AU.addPreserved<GlobalsAAWrapperPass>();
1025     AU.setPreservesCFG();
1026   }
1027 };
1028 }
1029 
1030 using EarlyCSELegacyPass = EarlyCSELegacyCommonPass</*UseMemorySSA=*/false>;
1031 
1032 template<>
1033 char EarlyCSELegacyPass::ID = 0;
1034 
1035 INITIALIZE_PASS_BEGIN(EarlyCSELegacyPass, "early-cse", "Early CSE", false,
1036                       false)
1037 INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
1038 INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
1039 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
1040 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
1041 INITIALIZE_PASS_END(EarlyCSELegacyPass, "early-cse", "Early CSE", false, false)
1042 
1043 using EarlyCSEMemSSALegacyPass =
1044     EarlyCSELegacyCommonPass</*UseMemorySSA=*/true>;
1045 
1046 template<>
1047 char EarlyCSEMemSSALegacyPass::ID = 0;
1048 
1049 FunctionPass *llvm::createEarlyCSEPass(bool UseMemorySSA) {
1050   if (UseMemorySSA)
1051     return new EarlyCSEMemSSALegacyPass();
1052   else
1053     return new EarlyCSELegacyPass();
1054 }
1055 
1056 INITIALIZE_PASS_BEGIN(EarlyCSEMemSSALegacyPass, "early-cse-memssa",
1057                       "Early CSE w/ MemorySSA", false, false)
1058 INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
1059 INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
1060 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
1061 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
1062 INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass)
1063 INITIALIZE_PASS_END(EarlyCSEMemSSALegacyPass, "early-cse-memssa",
1064                     "Early CSE w/ MemorySSA", false, false)
1065