[llvm] [LVI] Add NewPM printer pass (PR #73425)

via llvm-commits llvm-commits at lists.llvm.org
Sat Nov 25 21:22:45 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-analysis

Author: Aiden Grossman (boomanaiden154)

<details>
<summary>Changes</summary>

This patch adds a NewPM printer pass for the LazyValueAnalysis.

---
Full diff: https://github.com/llvm/llvm-project/pull/73425.diff


4 Files Affected:

- (modified) llvm/include/llvm/Analysis/LazyValueInfo.h (+11) 
- (modified) llvm/lib/Analysis/LazyValueInfo.cpp (+9) 
- (modified) llvm/lib/Passes/PassRegistry.def (+1) 
- (added) llvm/test/Analysis/LazyValueAnalysis/print.ll (+49) 


``````````diff
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
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/73425


More information about the llvm-commits mailing list