LLVM 17.0.0git
|
#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/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/iterator.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/CFGPrinter.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/LLVMContext.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Use.h"
#include "llvm/InitializePasses.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/GraphWriter.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <iterator>
#include <memory>
#include <utility>
Go to the source code of this file.
Classes | |
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... | |
class | DOTFuncMSSAInfo |
struct | llvm::GraphTraits< DOTFuncMSSAInfo * > |
struct | llvm::DOTGraphTraits< DOTFuncMSSAInfo * > |
Namespaces | |
namespace | llvm |
This is an optimization pass for GlobalISel generic memory operations. | |
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< 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 bool | areLoadsReorderable (const LoadInst *Use, const LoadInst *MayClobber) |
This does one-way checks to see if Use could theoretically be hoisted above MayClobber. | |
template<typename AliasAnalysisType > | |
static bool | instructionClobbersQuery (const MemoryDef *MD, const MemoryLocation &UseLoc, const Instruction *UseInst, AliasAnalysisType &AA) |
template<typename AliasAnalysisType > | |
static bool | instructionClobbersQuery (MemoryDef *MD, const MemoryUseOrDef *MU, const MemoryLocOrCall &UseMLOC, AliasAnalysisType &AA) |
static bool | isUseTriviallyOptimizableToLiveOnEntry (BatchAAResults &AA, const Instruction *I) |
static LLVM_ATTRIBUTE_UNUSED void | checkClobberSanity (const MemoryAccess *Start, MemoryAccess *ClobberAt, const MemoryLocation &StartLoc, const MemorySSA &MSSA, const UpwardsMemoryQuery &Query, BatchAAResults &AA, bool AllowImpreciseClobber=false) |
Verifies that Start is clobbered by ClobberAt , and that nothing inbetween Start and ClobberAt can clobbers Start . | |
static bool | isOrdered (const Instruction *I) |
static const Instruction * | getInvariantGroupClobberingInstruction (Instruction &I, DominatorTree &DT) |
Variables | |
static cl::opt< std::string > | DotCFGMSSA ("dot-cfg-mssa", cl::value_desc("file name for generated dot file"), cl::desc("file name for generated dot file"), cl::init("")) |
memoryssa | |
Memory | SSA |
Memory | false |
Memory true print Memory SSA | Printer |
static cl::opt< bool, true > | VerifyMemorySSAX ("verify-memoryssa", cl::location(VerifyMemorySSA), cl::Hidden, cl::desc("Enable verification of MemorySSA.")) |
static const char | LiveOnEntryStr [] = "liveOnEntry" |
#define DEBUG_TYPE "memoryssa" |
Definition at line 60 of file MemorySSA.cpp.
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 261 of file MemorySSA.cpp.
References llvm::LoadInst::getOrdering(), llvm::isAtLeastOrStrongerThan(), and llvm::LoadInst::isVolatile().
Referenced by instructionClobbersQuery().
|
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.
Start | The MemoryAccess that we want to walk from. |
ClobberAt | A clobber for Start. |
StartLoc | The MemoryLocation for Start. |
MSSA | The MemorySSA instance that Start and ClobberAt belong to. |
Query | The UpwardsMemoryQuery we used for our search. |
AA | The AliasAnalysis we used for our search. |
AllowImpreciseClobber | Always false, unless we do relaxed verify. |
Definition at line 399 of file MemorySSA.cpp.
References assert(), llvm::def_chain(), llvm::MemorySSA::dominates(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::SmallVectorBase< Size_T >::empty(), llvm::MemorySSA::getDomTree(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), instructionClobbersQuery(), llvm::MemorySSA::isLiveOnEntryDef(), llvm::DominatorTree::isReachableFromEntry(), MAP, llvm::SmallVectorImpl< T >::pop_back_val(), llvm::upward_defs_begin(), and llvm::upward_defs_end().
|
static |
Definition at line 2456 of file MemorySSA.cpp.
References assert(), llvm::DominatorTree::dominates(), llvm::SmallVectorBase< Size_T >::empty(), GEP, llvm::getLoadStorePointerOperand(), I, llvm::SmallVectorImpl< T >::pop_back_val(), Ptr, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::Value::stripPointerCasts().
Referenced by llvm::MemorySSA::ClobberWalkerBase::getClobberingMemoryAccessBase().
Memory true INITIALIZE_PASS_BEGIN | ( | MemorySSAPrinterLegacyPass | , |
"print-memoryssa" | , | ||
"Memory SSA Printer" | , | ||
false | , | ||
false | |||
) |
INITIALIZE_PASS_BEGIN | ( | MemorySSAWrapperPass | , |
"memoryssa" | , | ||
"Memory SSA" | , | ||
false | , | ||
true | |||
) |
|
static |
Definition at line 287 of file MemorySSA.cpp.
References areLoadsReorderable(), assert(), llvm::MemoryUseOrDef::getMemoryInst(), I, llvm::isModOrRefSet(), llvm::isModSet(), and llvm_unreachable.
Referenced by checkClobberSanity(), llvm::MemorySSAUtil::defClobbersUseOrDef(), and instructionClobbersQuery().
|
static |
Definition at line 330 of file MemorySSA.cpp.
References llvm::MemoryUseOrDef::getMemoryInst(), and instructionClobbersQuery().
|
inlinestatic |
Definition at line 1712 of file MemorySSA.cpp.
Referenced by llvm::MemoryDependenceResults::getNonLocalPointerDependency().
|
static |
Definition at line 373 of file MemorySSA.cpp.
References llvm::MemoryLocation::get(), llvm::BatchAAResults::getModRefInfoMask(), I, and llvm::isModSet().
Referenced by llvm::MemorySSA::ClobberWalkerBase::getClobberingMemoryAccessBase().
|
static |
Referenced by llvm::MemorySSAPrinterPass::run(), and llvm::MemorySSAPrinterLegacyPass::runOnFunction().
Definition at line 96 of file MemorySSA.cpp.
Referenced by llvm::MemoryUse::print(), llvm::MemoryDef::print(), and llvm::MemoryPhi::print().
Definition at line 71 of file MemorySSA.cpp.
Definition at line 78 of file MemorySSA.cpp.
Referenced by llvm::AArch64MCInstLower::AArch64MCInstLower(), llvm::LLVMTargetMachine::addAsmPrinter(), llvm::LLVMTargetMachine::addPassesToEmitMC(), llvm::ARCMCInstLower::ARCMCInstLower(), llvm::AVRMCInstLower::AVRMCInstLower(), llvm::BPFMCInstLower::BPFMCInstLower(), llvm::createGCInfoPrinter(), llvm::CSKYMCInstLower::CSKYMCInstLower(), llvm::MCInst::dump_pretty(), llvm::pdb::SymbolGroup::formatFromChecksumsOffset(), llvm::pdb::SymbolGroup::formatFromFileName(), formatInternal(), GetSymbolRef(), llvm::LanaiMCInstLower::LanaiMCInstLower(), llvm::MSP430MCInstLower::MSP430MCInstLower(), llvm::pdb::operator<<(), llvm::printAmdKernelCodeField(), llvm::VPlan::printDOT(), llvm::ScopedPrinter::printList(), llvm::printMIR(), llvm::codeview::printTypeIndex(), SimplifyShortMoveForm(), llvm::WebAssemblyMCInstLower::WebAssemblyMCInstLower(), writeDIArgList(), writeDIAssignID(), writeDIBasicType(), writeDICommonBlock(), writeDICompileUnit(), writeDICompositeType(), writeDIDerivedType(), writeDIEnumerator(), writeDIFile(), writeDIGenericSubrange(), writeDIGlobalVariable(), writeDIGlobalVariableExpression(), writeDIImportedEntity(), writeDILabel(), writeDILexicalBlock(), writeDILexicalBlockFile(), writeDILocalVariable(), writeDILocation(), writeDIMacro(), writeDIMacroFile(), writeDIModule(), writeDINamespace(), writeDIObjCProperty(), writeDIStringType(), writeDISubprogram(), writeDISubrange(), writeDISubroutineType(), writeDITemplateTypeParameter(), writeDITemplateValueParameter(), writeGenericDINode(), and llvm::XCoreMCInstLower::XCoreMCInstLower().
Memory SSA |
Definition at line 71 of file MemorySSA.cpp.
Referenced by llvm::promoteLoopAccessesToScalars(), and RewriteUsesOfClonedInstructions().