Home | History | Annotate | Download | only in Analysis
      1 //===- MemorySSAUpdater.h - Memory SSA Updater-------------------*- C++ -*-===//
      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 // \file
     11 // \brief An automatic updater for MemorySSA that handles arbitrary insertion,
     12 // deletion, and moves.  It performs phi insertion where necessary, and
     13 // automatically updates the MemorySSA IR to be correct.
     14 // While updating loads or removing instructions is often easy enough to not
     15 // need this, updating stores should generally not be attemped outside this
     16 // API.
     17 //
     18 // Basic API usage:
     19 // Create the memory access you want for the instruction (this is mainly so
     20 // we know where it is, without having to duplicate the entire set of create
     21 // functions MemorySSA supports).
     22 // Call insertDef or insertUse depending on whether it's a MemoryUse or a
     23 // MemoryDef.
     24 // That's it.
     25 //
     26 // For moving, first, move the instruction itself using the normal SSA
     27 // instruction moving API, then just call moveBefore, moveAfter,or moveTo with
     28 // the right arguments.
     29 //
     30 //===----------------------------------------------------------------------===//
     31 
     32 #ifndef LLVM_ANALYSIS_MEMORYSSAUPDATER_H
     33 #define LLVM_ANALYSIS_MEMORYSSAUPDATER_H
     34 
     35 #include "llvm/ADT/SmallPtrSet.h"
     36 #include "llvm/ADT/SmallVector.h"
     37 #include "llvm/Analysis/MemorySSA.h"
     38 #include "llvm/IR/BasicBlock.h"
     39 #include "llvm/IR/Dominators.h"
     40 #include "llvm/IR/Module.h"
     41 #include "llvm/IR/OperandTraits.h"
     42 #include "llvm/IR/Type.h"
     43 #include "llvm/IR/Use.h"
     44 #include "llvm/IR/User.h"
     45 #include "llvm/IR/Value.h"
     46 #include "llvm/Pass.h"
     47 #include "llvm/Support/Casting.h"
     48 #include "llvm/Support/ErrorHandling.h"
     49 
     50 namespace llvm {
     51 
     52 class Function;
     53 class Instruction;
     54 class MemoryAccess;
     55 class LLVMContext;
     56 class raw_ostream;
     57 
     58 class MemorySSAUpdater {
     59 private:
     60   MemorySSA *MSSA;
     61   SmallVector<MemoryPhi *, 8> InsertedPHIs;
     62   SmallPtrSet<BasicBlock *, 8> VisitedBlocks;
     63 
     64 public:
     65   MemorySSAUpdater(MemorySSA *MSSA) : MSSA(MSSA) {}
     66   /// Insert a definition into the MemorySSA IR.  RenameUses will rename any use
     67   /// below the new def block (and any inserted phis).  RenameUses should be set
     68   /// to true if the definition may cause new aliases for loads below it.  This
     69   /// is not the case for hoisting or sinking or other forms of code *movement*.
     70   /// It *is* the case for straight code insertion.
     71   /// For example:
     72   /// store a
     73   /// if (foo) { }
     74   /// load a
     75   ///
     76   /// Moving the store into the if block, and calling insertDef, does not
     77   /// require RenameUses.
     78   /// However, changing it to:
     79   /// store a
     80   /// if (foo) { store b }
     81   /// load a
     82   /// Where a mayalias b, *does* require RenameUses be set to true.
     83   void insertDef(MemoryDef *Def, bool RenameUses = false);
     84   void insertUse(MemoryUse *Use);
     85   void moveBefore(MemoryUseOrDef *What, MemoryUseOrDef *Where);
     86   void moveAfter(MemoryUseOrDef *What, MemoryUseOrDef *Where);
     87   void moveToPlace(MemoryUseOrDef *What, BasicBlock *BB,
     88                    MemorySSA::InsertionPlace Where);
     89 
     90   // The below are utility functions. Other than creation of accesses to pass
     91   // to insertDef, and removeAccess to remove accesses, you should generally
     92   // not attempt to update memoryssa yourself. It is very non-trivial to get
     93   // the edge cases right, and the above calls already operate in near-optimal
     94   // time bounds.
     95 
     96   /// \brief Create a MemoryAccess in MemorySSA at a specified point in a block,
     97   /// with a specified clobbering definition.
     98   ///
     99   /// Returns the new MemoryAccess.
    100   /// This should be called when a memory instruction is created that is being
    101   /// used to replace an existing memory instruction. It will *not* create PHI
    102   /// nodes, or verify the clobbering definition. The insertion place is used
    103   /// solely to determine where in the memoryssa access lists the instruction
    104   /// will be placed. The caller is expected to keep ordering the same as
    105   /// instructions.
    106   /// It will return the new MemoryAccess.
    107   /// Note: If a MemoryAccess already exists for I, this function will make it
    108   /// inaccessible and it *must* have removeMemoryAccess called on it.
    109   MemoryAccess *createMemoryAccessInBB(Instruction *I, MemoryAccess *Definition,
    110                                        const BasicBlock *BB,
    111                                        MemorySSA::InsertionPlace Point);
    112 
    113   /// \brief Create a MemoryAccess in MemorySSA before or after an existing
    114   /// MemoryAccess.
    115   ///
    116   /// Returns the new MemoryAccess.
    117   /// This should be called when a memory instruction is created that is being
    118   /// used to replace an existing memory instruction. It will *not* create PHI
    119   /// nodes, or verify the clobbering definition.
    120   ///
    121   /// Note: If a MemoryAccess already exists for I, this function will make it
    122   /// inaccessible and it *must* have removeMemoryAccess called on it.
    123   MemoryUseOrDef *createMemoryAccessBefore(Instruction *I,
    124                                            MemoryAccess *Definition,
    125                                            MemoryUseOrDef *InsertPt);
    126   MemoryUseOrDef *createMemoryAccessAfter(Instruction *I,
    127                                           MemoryAccess *Definition,
    128                                           MemoryAccess *InsertPt);
    129 
    130   /// \brief Remove a MemoryAccess from MemorySSA, including updating all
    131   /// definitions and uses.
    132   /// This should be called when a memory instruction that has a MemoryAccess
    133   /// associated with it is erased from the program.  For example, if a store or
    134   /// load is simply erased (not replaced), removeMemoryAccess should be called
    135   /// on the MemoryAccess for that store/load.
    136   void removeMemoryAccess(MemoryAccess *);
    137 
    138 private:
    139   // Move What before Where in the MemorySSA IR.
    140   template <class WhereType>
    141   void moveTo(MemoryUseOrDef *What, BasicBlock *BB, WhereType Where);
    142   MemoryAccess *getPreviousDef(MemoryAccess *);
    143   MemoryAccess *getPreviousDefInBlock(MemoryAccess *);
    144   MemoryAccess *getPreviousDefFromEnd(BasicBlock *);
    145   MemoryAccess *getPreviousDefRecursive(BasicBlock *);
    146   MemoryAccess *recursePhi(MemoryAccess *Phi);
    147   template <class RangeType>
    148   MemoryAccess *tryRemoveTrivialPhi(MemoryPhi *Phi, RangeType &Operands);
    149   void fixupDefs(const SmallVectorImpl<MemoryAccess *> &);
    150 };
    151 } // end namespace llvm
    152 
    153 #endif // LLVM_ANALYSIS_MEMORYSSAUPDATER_H
    154