LLVM  8.0.1
Classes | Namespaces | Macros | Functions | Variables
MemorySSA.cpp File Reference
#include "llvm/Analysis/MemorySSA.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/iterator.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/IteratedDominanceFrontier.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/AssemblyAnnotationWriter.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Use.h"
#include "llvm/Pass.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <iterator>
#include <memory>
#include <utility>
Include dependency graph for MemorySSA.cpp:

Go to the source code of this file.

Classes

class  llvm::MemorySSAAnnotatedWriter
 An assembly annotator class to print Memory SSA information in comments. More...
 
struct  llvm::DenseMapInfo< MemoryLocOrCall >
 
class  llvm::MemorySSA::ClobberWalkerBase
 
class  llvm::MemorySSA::CachingWalker
 A MemorySSAWalker that does AA walks to disambiguate accesses. More...
 
class  llvm::MemorySSA::SkipSelfWalker
 
class  llvm::MemorySSA::OptimizeUses
 This class is a batch walker of all MemoryUse's in the program, and points their defining access at the thing that actually clobbers them. More...
 

Namespaces

 llvm
 This class represents lattice values for constants.
 

Macros

#define DEBUG_TYPE   "memoryssa"
 

Functions

 INITIALIZE_PASS_BEGIN (MemorySSAWrapperPass, "memoryssa", "Memory SSA", false, true) INITIALIZE_PASS_END(MemorySSAWrapperPass
 
Memory true INITIALIZE_PASS_BEGIN (MemorySSAPrinterLegacyPass, "print-memoryssa", "Memory SSA Printer", false, false) INITIALIZE_PASS_END(MemorySSAPrinterLegacyPass
 
Memory true print Memory SSA static false cl::opt< unsignedMaxCheckLimit ("memssa-check-limit", cl::Hidden, cl::init(100), cl::desc("The maximum number of stores/phis MemorySSA" "will consider trying to walk past (default = 100)"))
 
static bool areLoadsReorderable (const LoadInst *Use, const LoadInst *MayClobber)
 This does one-way checks to see if Use could theoretically be hoisted above MayClobber. More...
 
static ClobberAlias instructionClobbersQuery (const MemoryDef *MD, const MemoryLocation &UseLoc, const Instruction *UseInst, AliasAnalysis &AA)
 
static ClobberAlias instructionClobbersQuery (MemoryDef *MD, const MemoryUseOrDef *MU, const MemoryLocOrCall &UseMLOC, AliasAnalysis &AA)
 
static bool lifetimeEndsAt (MemoryDef *MD, const MemoryLocation &Loc, AliasAnalysis &AA)
 
static bool isUseTriviallyOptimizableToLiveOnEntry (AliasAnalysis &AA, const Instruction *I)
 
static void checkClobberSanity (const MemoryAccess *Start, MemoryAccess *ClobberAt, const MemoryLocation &StartLoc, const MemorySSA &MSSA, const UpwardsMemoryQuery &Query, AliasAnalysis &AA, bool AllowImpreciseClobber=false)
 Verifies that Start is clobbered by ClobberAt, and that nothing inbetween Start and ClobberAt can clobbers Start. More...
 
static bool isOrdered (const Instruction *I)
 

Variables

 memoryssa
 
Memory SSA
 
Memory false
 
Memory true print Memory SSA Printer
 
static cl::opt< bool, trueVerifyMemorySSAX ("verify-memoryssa", cl::location(VerifyMemorySSA), cl::Hidden, cl::desc("Enable verification of MemorySSA."))
 
static const char LiveOnEntryStr [] = "liveOnEntry"
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "memoryssa"

Definition at line 59 of file MemorySSA.cpp.

Function Documentation

◆ areLoadsReorderable()

static bool areLoadsReorderable ( const LoadInst Use,
const LoadInst MayClobber 
)
static

This does one-way checks to see if Use could theoretically be hoisted above MayClobber.

This will not check the other way around.

This assumes that, for the purposes of MemorySSA, Use comes directly after MayClobber, with no potentially clobbering operations in between them. (Where potentially clobbering ops are memory barriers, aliased stores, etc.)

Definition at line 220 of file MemorySSA.cpp.

References llvm::Acquire, llvm::LoadInst::getOrdering(), llvm::isAtLeastOrStrongerThan(), llvm::LoadInst::isVolatile(), and llvm::SequentiallyConsistent.

Referenced by instructionClobbersQuery().

◆ checkClobberSanity()

static void checkClobberSanity ( const MemoryAccess Start,
MemoryAccess ClobberAt,
const MemoryLocation StartLoc,
const MemorySSA MSSA,
const UpwardsMemoryQuery &  Query,
AliasAnalysis AA,
bool  AllowImpreciseClobber = false 
)
static

Verifies that Start is clobbered by ClobberAt, and that nothing inbetween Start and ClobberAt can clobbers Start.

This is meant to be as simple and self-contained as possible. Because it uses no cache, etc., it can be relatively expensive.

Parameters
StartThe MemoryAccess that we want to walk from.
ClobberAtA clobber for Start.
StartLocThe MemoryLocation for Start.
MSSAThe MemorySSA instance that Start and ClobberAt belong to.
QueryThe UpwardsMemoryQuery we used for our search.
AAThe AliasAnalysis we used for our search.
AllowImpreciseClobberAlways false, unless we do relaxed verify.

Definition at line 385 of file MemorySSA.cpp.

Referenced by llvm::MemorySSA::checkClobberSanityAccess().

◆ INITIALIZE_PASS_BEGIN() [1/2]

INITIALIZE_PASS_BEGIN ( MemorySSAWrapperPass  ,
"memoryssa"  ,
"Memory SSA ,
false  ,
true   
)

◆ INITIALIZE_PASS_BEGIN() [2/2]

Memory true INITIALIZE_PASS_BEGIN ( MemorySSAPrinterLegacyPass  ,
"print-memoryssa ,
"Memory SSA Printer ,
false  ,
false   
)

◆ instructionClobbersQuery() [1/2]

static ClobberAlias instructionClobbersQuery ( const MemoryDef MD,
const MemoryLocation UseLoc,
const Instruction UseInst,
AliasAnalysis AA 
)
static

◆ instructionClobbersQuery() [2/2]

static ClobberAlias instructionClobbersQuery ( MemoryDef MD,
const MemoryUseOrDef MU,
const MemoryLocOrCall &  UseMLOC,
AliasAnalysis AA 
)
static

◆ isOrdered()

static bool isOrdered ( const Instruction I)
inlinestatic

◆ isUseTriviallyOptimizableToLiveOnEntry()

static bool isUseTriviallyOptimizableToLiveOnEntry ( AliasAnalysis AA,
const Instruction I 
)
static

◆ lifetimeEndsAt()

static bool lifetimeEndsAt ( MemoryDef MD,
const MemoryLocation Loc,
AliasAnalysis AA 
)
static

◆ MaxCheckLimit()

Memory true print Memory SSA static false cl::opt<unsigned> MaxCheckLimit ( "memssa-check-limit"  ,
cl::Hidden  ,
cl::init(100)  ,
cl::desc("The maximum number of stores/phis MemorySSA" "will consider trying to walk past (default = 100)")   
)
static

Variable Documentation

◆ false

Definition at line 65 of file MemorySSA.cpp.

◆ LiveOnEntryStr

const char LiveOnEntryStr[] = "liveOnEntry"
static

◆ memoryssa

Memory true print memoryssa

Definition at line 65 of file MemorySSA.cpp.

◆ Printer

Definition at line 71 of file MemorySSA.cpp.

◆ SSA

Memory SSA

◆ VerifyMemorySSAX

cl::opt<bool, true> VerifyMemorySSAX("verify-memoryssa", cl::location(VerifyMemorySSA), cl::Hidden, cl::desc("Enable verification of MemorySSA."))
static