Author: Aiden Grossman Date: 2023-11-25T21:20:29-08:00 New Revision: 0276bc121c06eebe3a031d72a971d84a20c7f1b5
URL: https://github.com/llvm/llvm-project/commit/0276bc121c06eebe3a031d72a971d84a20c7f1b5 DIFF: https://github.com/llvm/llvm-project/commit/0276bc121c06eebe3a031d72a971d84a20c7f1b5.diff LOG: [LVI] Add NewPM printer pass This patch adds a NewPM printer pass for the LazyValueAnalysis. Added: llvm/test/Analysis/LazyValueAnalysis/print.ll Modified: llvm/include/llvm/Analysis/LazyValueInfo.h llvm/lib/Analysis/LazyValueInfo.cpp llvm/lib/Passes/PassRegistry.def Removed: ################################################################################ diff --git a/llvm/include/llvm/Analysis/LazyValueInfo.h b/llvm/include/llvm/Analysis/LazyValueInfo.h index f013a4a75d3d6ad..ead9f5f0225cd09 100644 --- a/llvm/include/llvm/Analysis/LazyValueInfo.h +++ b/llvm/include/llvm/Analysis/LazyValueInfo.h @@ -151,6 +151,17 @@ class LazyValueAnalysis : public AnalysisInfoMixin<LazyValueAnalysis> { friend struct AnalysisInfoMixin<LazyValueAnalysis>; }; +/// Printer pass for the LazyValueAnalysis results. +class LazyValueInfoPrinterPass + : public PassInfoMixin<LazyValueInfoPrinterPass> { + raw_ostream &OS; + +public: + explicit LazyValueInfoPrinterPass(raw_ostream &OS) : OS(OS) {} + + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); +}; + /// Wrapper around LazyValueInfo. class LazyValueInfoWrapperPass : public FunctionPass { LazyValueInfoWrapperPass(const LazyValueInfoWrapperPass&) = delete; diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp index 5cb207c8036d40a..868824285301a09 100644 --- a/llvm/lib/Analysis/LazyValueInfo.cpp +++ b/llvm/lib/Analysis/LazyValueInfo.cpp @@ -2087,6 +2087,15 @@ void LazyValueInfoAnnotatedWriter::emitInstructionAnnot( } +PreservedAnalyses LazyValueInfoPrinterPass::run(Function &F, + FunctionAnalysisManager &AM) { + OS << "LVI for function '" << F.getName() << "':\n"; + auto &LVI = AM.getResult<LazyValueAnalysis>(F); + auto &DTree = AM.getResult<DominatorTreeAnalysis>(F); + LVI.printLVI(F, DTree, OS); + return PreservedAnalyses::all(); +} + namespace { // Printer class for LazyValueInfo results. class LazyValueInfoPrinter : public FunctionPass { diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 2067fc473b522db..199a8e4622e35a3 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -400,6 +400,7 @@ FUNCTION_PASS("print<func-properties>", FunctionPropertiesPrinterPass(dbgs())) FUNCTION_PASS("print<inline-cost>", InlineCostAnnotationPrinterPass(dbgs())) FUNCTION_PASS("print<inliner-size-estimator>", InlineSizeEstimatorAnalysisPrinterPass(dbgs())) +FUNCTION_PASS("print<lazy-value-info>", LazyValueInfoPrinterPass(dbgs())) FUNCTION_PASS("print<loops>", LoopPrinterPass(dbgs())) FUNCTION_PASS("print<memoryssa-walker>", MemorySSAWalkerPrinterPass(dbgs())) FUNCTION_PASS("print<phi-values>", PhiValuesPrinterPass(dbgs())) diff --git a/llvm/test/Analysis/LazyValueAnalysis/print.ll b/llvm/test/Analysis/LazyValueAnalysis/print.ll new file mode 100644 index 000000000000000..6b4938a5fd9e07b --- /dev/null +++ b/llvm/test/Analysis/LazyValueAnalysis/print.ll @@ -0,0 +1,49 @@ +; RUN: opt %s -disable-output -passes="jump-threading,print<lazy-value-info>" 2>&1 | FileCheck %s + +; first to populate the values. + +define i32 @constraint(i32 %a) { +; CHECK-LABEL: LVI for function 'constraint': +chklt64: +; CHECK-LABEL: chklt64: +; CHECK-NEXT: ; LatticeVal for: 'i32 %a' is: overdefined +; CHECK-NEXT: ; LatticeVal for: ' %cmp = icmp slt i32 %a, 64' in BB: '%chklt64' is: overdefined +; CHECK-NEXT: ; LatticeVal for: ' %cmp = icmp slt i32 %a, 64' in BB: '%chkgt0' is: constantrange<-1, 0> +; CHECK-NEXT: ; LatticeVal for: ' %cmp = icmp slt i32 %a, 64' in BB: '%notinbounds' is: overdefined +; CHECK-NEXT: %cmp = icmp slt i32 %a, 64 +; CHECK-NEXT: ; LatticeVal for: ' br i1 %cmp, label %chkgt0, label %notinbounds' in BB: '%chklt64' is: overdefined +; CHECK-NEXT: ; LatticeVal for: ' br i1 %cmp, label %chkgt0, label %notinbounds' in BB: '%chkgt0' is: overdefined +; CHECK-NEXT: ; LatticeVal for: ' br i1 %cmp, label %chkgt0, label %notinbounds' in BB: '%notinbounds' is: overdefined +; CHECK-NEXT: br i1 %cmp, label %chkgt0, label %notinbounds + %cmp = icmp slt i32 %a, 64 + br i1 %cmp, label %chkgt0, label %notinbounds + +chkgt0: +; CHECK-LABEL: chkgt0: +; CHECK-NEXT: ; LatticeVal for: 'i32 %a' is: constantrange<-2147483648, 64> +; CHECK-NEXT: ; LatticeVal for: ' %cmp1 = icmp sgt i32 %a, 0' in BB: '%chkgt0' is: overdefined +; CHECK-NEXT: ; LatticeVal for: ' %cmp1 = icmp sgt i32 %a, 0' in BB: '%inbounds' is: constantrange<-1, 0> +; CHECK-NEXT: %cmp1 = icmp sgt i32 %a, 0 +; CHECK-NEXT: ; LatticeVal for: ' br i1 %cmp1, label %inbounds, label %notinbounds' in BB: '%chkgt0' is: overdefined +; CHECK-NEXT: ; LatticeVal for: ' br i1 %cmp1, label %inbounds, label %notinbounds' in BB: '%inbounds' is: overdefined +; CHECK-NEXT: br i1 %cmp1, label %inbounds, label %notinbounds + %cmp1 = icmp sgt i32 %a, 0 + br i1 %cmp1, label %inbounds, label %notinbounds + +inbounds: +; CHECK-LABEL: inbounds: +; CHECK-NEXT: ; LatticeVal for: 'i32 %a' is: constantrange<1, 64> +; CHECK-NEXT: ; LatticeVal for: ' ret i32 %a' in BB: '%inbounds' is: overdefined +; CHECK-NEXT: ret i32 %a + ret i32 %a + +notinbounds: +; CHECK-LABEL: notinbounds: +; CHECK-NEXT: ; LatticeVal for: 'i32 %a' is: constantrange<64, 1> +; CHECK-NEXT: ; LatticeVal for: ' %sum = add i32 %a, 64' in BB: '%notinbounds' is: constantrange<128, 65> +; CHECK-NEXT: %sum = add i32 %a, 64 +; CHECK-NEXT: ; LatticeVal for: ' ret i32 %sum' in BB: '%notinbounds' is: overdefined +; CHECK-NEXT: ret i32 %sum + %sum = add i32 %a, 64 + ret i32 %sum +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits