PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};
-/// Printer pass for \c MemorySSA via the walker.
-class MemorySSAWalkerPrinterPass
- : public PassInfoMixin<MemorySSAWalkerPrinterPass> {
- raw_ostream &OS;
-
-public:
- explicit MemorySSAWalkerPrinterPass(raw_ostream &OS) : OS(OS) {}
-
- PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-};
-
/// Verifier pass for \c MemorySSA.
struct MemorySSAVerifierPass : PassInfoMixin<MemorySSAVerifierPass> {
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
VerifyMemorySSAX("verify-memoryssa", cl::location(VerifyMemorySSA),
cl::Hidden, cl::desc("Enable verification of MemorySSA."));
-namespace {
+namespace llvm {
/// An assembly annotator class to print Memory SSA information in
/// comments.
class MemorySSAAnnotatedWriter : public AssemblyAnnotationWriter {
+ friend class MemorySSA;
+
const MemorySSA *MSSA;
public:
}
};
-/// An assembly annotator class to print Memory SSA information in
-/// comments.
-class MemorySSAWalkerAnnotatedWriter : public AssemblyAnnotationWriter {
- MemorySSA *MSSA;
- MemorySSAWalker *Walker;
-
-public:
- MemorySSAWalkerAnnotatedWriter(MemorySSA *M)
- : MSSA(M), Walker(M->getWalker()) {}
-
- void emitInstructionAnnot(const Instruction *I,
- formatted_raw_ostream &OS) override {
- if (MemoryAccess *MA = MSSA->getMemoryAccess(I)) {
- MemoryAccess *Clobber = Walker->getClobberingMemoryAccess(MA);
- OS << "; " << *MA;
- if (Clobber)
- OS << " - clobbered by " << *Clobber;
- OS << "\n";
- }
- }
-};
-
-} // namespace
+} // end namespace llvm
namespace {
return PreservedAnalyses::all();
}
-PreservedAnalyses MemorySSAWalkerPrinterPass::run(Function &F,
- FunctionAnalysisManager &AM) {
- auto &MSSA = AM.getResult<MemorySSAAnalysis>(F).getMSSA();
- OS << "MemorySSA (walker) for function: " << F.getName() << "\n";
- MemorySSAWalkerAnnotatedWriter Writer(&MSSA);
- F.print(OS, &Writer);
-
- return PreservedAnalyses::all();
-}
-
PreservedAnalyses MemorySSAVerifierPass::run(Function &F,
FunctionAnalysisManager &AM) {
AM.getResult<MemorySSAAnalysis>(F).getMSSA().verifyMemorySSA();
InlineSizeEstimatorAnalysisPrinterPass(dbgs()))
FUNCTION_PASS("print<loops>", LoopPrinterPass(dbgs()))
FUNCTION_PASS("print<memoryssa>", MemorySSAPrinterPass(dbgs()))
-FUNCTION_PASS("print<memoryssa-walker>", MemorySSAWalkerPrinterPass(dbgs()))
FUNCTION_PASS("print<phi-values>", PhiValuesPrinterPass(dbgs()))
FUNCTION_PASS("print<regions>", RegionInfoPrinterPass(dbgs()))
FUNCTION_PASS("print<scalar-evolution>", ScalarEvolutionPrinterPass(dbgs()))
+++ /dev/null
-; RUN: opt -passes='print<memoryssa-walker>' -disable-output < %s 2>&1 | FileCheck %s
-
-; CHECK: define void @test
-; CHECK: 1 = MemoryDef(liveOnEntry)->liveOnEntry - clobbered by 0 = MemoryDef(liveOnEntry)
-; CHECK: store i8 42, i8* %a1
-; CHECK: 2 = MemoryDef(1)->liveOnEntry - clobbered by 0 = MemoryDef(liveOnEntry)
-; CHECK: store i8 42, i8* %a2
-; CHECK: MemoryUse(1) MustAlias - clobbered by 1 = MemoryDef(liveOnEntry)->liveOnEntry
-; CHECK: %l1 = load i8, i8* %a1
-; CHECK: MemoryUse(2) MustAlias - clobbered by 2 = MemoryDef(1)->liveOnEntry
-; CHECK: %l2 = load i8, i8* %a2
-; CHECK: 3 = MemoryDef(2)->liveOnEntry - clobbered by 0 = MemoryDef(liveOnEntry)
-; CHECK: store i8 42, i8* %p
-; CHECK: 4 = MemoryDef(3)->3 MustAlias - clobbered by 3 = MemoryDef(2)->liveOnEntry
-; CHECK: store i8 42, i8* %p
-; CHECK: MemoryUse(4) MustAlias - clobbered by 4 = MemoryDef(3)->3 MustAlias
-; CHECK: %p1 = load i8, i8* %p
-; CHECK: MemoryUse(4) MustAlias - clobbered by 4 = MemoryDef(3)->3 MustAlias
-; CHECK: %p2 = load i8, i8* %p
-
-define void @test(i8* %p) {
- %a1 = alloca i8
- %a2 = alloca i8
- store i8 42, i8* %a1
- store i8 42, i8* %a2
- %l1 = load i8, i8* %a1
- %l2 = load i8, i8* %a2
-
- store i8 42, i8* %p
- store i8 42, i8* %p
- %p1 = load i8, i8* %p
- %p2 = load i8, i8* %p
-
- ret void
-}