[llvm] [AA] Move Target Specific AA before BasicAA (PR #125965)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 25 19:11:35 PST 2025
https://github.com/Chengjunp updated https://github.com/llvm/llvm-project/pull/125965
>From 749e4bbb3b56569e526dec15a8ceae25d968e6da Mon Sep 17 00:00:00 2001
From: chengjunp <chengjunp at nvidia.com>
Date: Tue, 25 Feb 2025 01:01:29 +0000
Subject: [PATCH 1/2] Add support for moving target specific AA before basic AA
---
llvm/include/llvm/Analysis/AliasAnalysis.h | 2 ++
llvm/include/llvm/Target/TargetMachine.h | 5 +++++
llvm/lib/Analysis/AliasAnalysis.cpp | 10 +++++++---
llvm/lib/Passes/PassBuilderPipelines.cpp | 4 ++++
llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h | 3 +++
llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp | 2 +-
llvm/lib/Target/NVPTX/NVPTXTargetMachine.h | 2 +-
.../Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll | 15 +++++++++++++++
8 files changed, 38 insertions(+), 5 deletions(-)
create mode 100644 llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll
diff --git a/llvm/include/llvm/Analysis/AliasAnalysis.h b/llvm/include/llvm/Analysis/AliasAnalysis.h
index 9c6084d2d9dee..175e16f607e7e 100644
--- a/llvm/include/llvm/Analysis/AliasAnalysis.h
+++ b/llvm/include/llvm/Analysis/AliasAnalysis.h
@@ -993,6 +993,8 @@ struct ExternalAAWrapperPass : ImmutablePass {
explicit ExternalAAWrapperPass(CallbackT CB);
+ virtual bool runEarly() { return false; }
+
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.setPreservesAll();
}
diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h
index c3e9d41315f61..588025525d8fe 100644
--- a/llvm/include/llvm/Target/TargetMachine.h
+++ b/llvm/include/llvm/Target/TargetMachine.h
@@ -371,6 +371,11 @@ class TargetMachine {
// TODO: Populate all pass names by using <Target>PassRegistry.def.
virtual void registerPassBuilderCallbacks(PassBuilder &) {}
+ /// Allow the target to register early alias analyses(AA before basicAA) with
+ /// the AAManager for use with the new pass manager. Only affects the
+ /// "default" AAManager.
+ virtual void registerEarlyDefaultAliasAnalyses(AAManager &) {}
+
/// Allow the target to register alias analyses with the AAManager for use
/// with the new pass manager. Only affects the "default" AAManager.
virtual void registerDefaultAliasAnalyses(AAManager &) {}
diff --git a/llvm/lib/Analysis/AliasAnalysis.cpp b/llvm/lib/Analysis/AliasAnalysis.cpp
index 20cdbb6320322..ca7a68b3cbca4 100644
--- a/llvm/lib/Analysis/AliasAnalysis.cpp
+++ b/llvm/lib/Analysis/AliasAnalysis.cpp
@@ -752,6 +752,11 @@ bool AAResultsWrapperPass::runOnFunction(Function &F) {
AAR.reset(
new AAResults(getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F)));
+ // Add any target-specific alias analyses that should be run early.
+ auto *ExtWrapperPass = getAnalysisIfAvailable<ExternalAAWrapperPass>();
+ if (ExtWrapperPass && ExtWrapperPass->runEarly() && ExtWrapperPass->CB)
+ ExtWrapperPass->CB(*this, F, *AAR);
+
// BasicAA is always available for function analyses. Also, we add it first
// so that it can trump TBAA results when it proves MustAlias.
// FIXME: TBAA should have an explicit mode to support this and then we
@@ -771,9 +776,8 @@ bool AAResultsWrapperPass::runOnFunction(Function &F) {
// If available, run an external AA providing callback over the results as
// well.
- if (auto *WrapperPass = getAnalysisIfAvailable<ExternalAAWrapperPass>())
- if (WrapperPass->CB)
- WrapperPass->CB(*this, F, *AAR);
+ if (ExtWrapperPass && !ExtWrapperPass->runEarly() && ExtWrapperPass->CB)
+ ExtWrapperPass->CB(*this, F, *AAR);
// Analyses don't mutate the IR, so return false.
return false;
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 17710eb94b6de..0afcf992dcde7 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -2202,6 +2202,10 @@ AAManager PassBuilder::buildDefaultAAPipeline() {
// The order in which these are registered determines their priority when
// being queried.
+ // Add any target-specific alias analyses that should be run early.
+ if (TM)
+ TM->registerEarlyDefaultAliasAnalyses(AA);
+
// First we register the basic alias analysis that provides the majority of
// per-function local AA logic. This is a stateless, on-demand local set of
// AA techniques.
diff --git a/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h b/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h
index 2d204979eb6ce..e509ef3abe67e 100644
--- a/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h
+++ b/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h
@@ -79,10 +79,13 @@ class NVPTXAAWrapperPass : public ImmutablePass {
// Wrapper around ExternalAAWrapperPass so that the default
// constructor gets the callback.
+// Note that NVPTXAA will run before BasicAA to for compile time considerations.
class NVPTXExternalAAWrapper : public ExternalAAWrapperPass {
public:
static char ID;
+ bool runEarly() override { return true; }
+
NVPTXExternalAAWrapper()
: ExternalAAWrapperPass([](Pass &P, Function &, AAResults &AAR) {
if (auto *WrapperPass =
diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
index 7d04cf3dc51e6..c6823961a6e80 100644
--- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp
@@ -221,7 +221,7 @@ MachineFunctionInfo *NVPTXTargetMachine::createMachineFunctionInfo(
F, STI);
}
-void NVPTXTargetMachine::registerDefaultAliasAnalyses(AAManager &AAM) {
+void NVPTXTargetMachine::registerEarlyDefaultAliasAnalyses(AAManager &AAM) {
AAM.registerFunctionAnalysis<NVPTXAA>();
}
diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.h b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.h
index 2b88da67a50f9..bb65a14a8d792 100644
--- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.h
+++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.h
@@ -64,7 +64,7 @@ class NVPTXTargetMachine : public LLVMTargetMachine {
createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
const TargetSubtargetInfo *STI) const override;
- void registerDefaultAliasAnalyses(AAManager &AAM) override;
+ void registerEarlyDefaultAliasAnalyses(AAManager &AAM) override;
void registerPassBuilderCallbacks(PassBuilder &PB) override;
diff --git a/llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll b/llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll
new file mode 100644
index 0000000000000..f01dae60085ed
--- /dev/null
+++ b/llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll
@@ -0,0 +1,15 @@
+; RUN: opt -aa-pipeline=default -passes='require<aa>' -debug-pass-manager -disable-output -S < %s 2>&1 | FileCheck %s
+; RUN: opt -O2 -debug-aa -disable-output -S < %s 2>&1 | FileCheck %s --check-prefix=LEGACY
+; LEGACY: NVPTX AA
+; LEGACY-NEXT: Basic Alias Analysis (stateless AA impl)
+
+; In default AA pipeline, NVPTXAA should run before BasicAA to reduce compile time for NVPTX backend
+target triple = "nvptx64-nvidia-cuda"
+
+; CHECK: Running analysis: NVPTXAA on foo
+; CHECK-NEXT: Running analysis: BasicAA on foo
+define void @foo(){
+entry:
+ ret void
+}
+
>From 0b95b09ca02f02241c1e9f23094a44a11bb4f7cf Mon Sep 17 00:00:00 2001
From: chengjunp <chengjunp at nvidia.com>
Date: Wed, 26 Feb 2025 03:11:21 +0000
Subject: [PATCH 2/2] Update test
---
llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll | 3 ---
1 file changed, 3 deletions(-)
diff --git a/llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll b/llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll
index f01dae60085ed..7d980b0e6f807 100644
--- a/llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll
+++ b/llvm/test/Analysis/NVPTXAA/NVPTXAA_before_BasicAA.ll
@@ -1,7 +1,4 @@
; RUN: opt -aa-pipeline=default -passes='require<aa>' -debug-pass-manager -disable-output -S < %s 2>&1 | FileCheck %s
-; RUN: opt -O2 -debug-aa -disable-output -S < %s 2>&1 | FileCheck %s --check-prefix=LEGACY
-; LEGACY: NVPTX AA
-; LEGACY-NEXT: Basic Alias Analysis (stateless AA impl)
; In default AA pipeline, NVPTXAA should run before BasicAA to reduce compile time for NVPTX backend
target triple = "nvptx64-nvidia-cuda"
More information about the llvm-commits
mailing list