Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LVI] Add NewPM printer pass #73425

Merged

Conversation

boomanaiden154
Copy link
Contributor

This patch adds a NewPM printer pass for the LazyValueAnalysis.

This patch adds a NewPM printer pass for the LazyValueAnalysis.
@llvmbot
Copy link
Collaborator

llvmbot commented Nov 26, 2023

@llvm/pr-subscribers-llvm-analysis

Author: Aiden Grossman (boomanaiden154)

Changes

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

Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@boomanaiden154 boomanaiden154 merged commit 5a74805 into main Nov 26, 2023
4 checks passed
@boomanaiden154 boomanaiden154 deleted the users/boomanaiden154/lazyvalueinfo-newpm-printer branch November 26, 2023 20:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants