[llvm] d61cba6 - UniformityAnalysis: Skip computation with no branch divergence
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 16 15:42:00 PDT 2023
Author: Matt Arsenault
Date: 2023-06-16T18:41:56-04:00
New Revision: d61cba6de24a2f59c975c23d5945b2dd4421173b
URL: https://github.com/llvm/llvm-project/commit/d61cba6de24a2f59c975c23d5945b2dd4421173b
DIFF: https://github.com/llvm/llvm-project/commit/d61cba6de24a2f59c975c23d5945b2dd4421173b.diff
LOG: UniformityAnalysis: Skip computation with no branch divergence
Check TTI before bothering to run the computation. Everything
will be assumed uniform by default.
Added:
Modified:
llvm/include/llvm/ADT/GenericUniformityImpl.h
llvm/include/llvm/ADT/GenericUniformityInfo.h
llvm/include/llvm/CodeGen/MachineUniformityAnalysis.h
llvm/lib/Analysis/UniformityAnalysis.cpp
llvm/lib/CodeGen/MachineUniformityAnalysis.cpp
llvm/lib/Target/AMDGPU/AMDGPURegBankSelect.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/GenericUniformityImpl.h b/llvm/include/llvm/ADT/GenericUniformityImpl.h
index b6d4424fbb453..4df04accc6835 100644
--- a/llvm/include/llvm/ADT/GenericUniformityImpl.h
+++ b/llvm/include/llvm/ADT/GenericUniformityImpl.h
@@ -1139,8 +1139,6 @@ GenericUniformityInfo<ContextT>::GenericUniformityInfo(
const TargetTransformInfo *TTI)
: F(&Func) {
DA.reset(new ImplT{Func, DT, CI, TTI});
- DA->initialize();
- DA->compute();
}
template <typename ContextT>
diff --git a/llvm/include/llvm/ADT/GenericUniformityInfo.h b/llvm/include/llvm/ADT/GenericUniformityInfo.h
index bbf49843673be..114fdfed765c2 100644
--- a/llvm/include/llvm/ADT/GenericUniformityInfo.h
+++ b/llvm/include/llvm/ADT/GenericUniformityInfo.h
@@ -47,6 +47,11 @@ template <typename ContextT> class GenericUniformityInfo {
GenericUniformityInfo(GenericUniformityInfo &&) = default;
GenericUniformityInfo &operator=(GenericUniformityInfo &&) = default;
+ void compute() {
+ DA->initialize();
+ DA->compute();
+ }
+
/// Whether any divergence was detected.
bool hasDivergence() const;
diff --git a/llvm/include/llvm/CodeGen/MachineUniformityAnalysis.h b/llvm/include/llvm/CodeGen/MachineUniformityAnalysis.h
index fc65e1b71c81e..e6da099751e7a 100644
--- a/llvm/include/llvm/CodeGen/MachineUniformityAnalysis.h
+++ b/llvm/include/llvm/CodeGen/MachineUniformityAnalysis.h
@@ -25,10 +25,12 @@ extern template class GenericUniformityInfo<MachineSSAContext>;
using MachineUniformityInfo = GenericUniformityInfo<MachineSSAContext>;
/// \brief Compute uniformity information for a Machine IR function.
-MachineUniformityInfo
-computeMachineUniformityInfo(MachineFunction &F,
- const MachineCycleInfo &cycleInfo,
- const MachineDomTree &domTree);
+///
+/// If \p HasBranchDivergence is false, produces a dummy result which assumes
+/// everything is uniform.
+MachineUniformityInfo computeMachineUniformityInfo(
+ MachineFunction &F, const MachineCycleInfo &cycleInfo,
+ const MachineDomTree &domTree, bool HasBranchDivergence);
} // namespace llvm
diff --git a/llvm/lib/Analysis/UniformityAnalysis.cpp b/llvm/lib/Analysis/UniformityAnalysis.cpp
index 60d6bb881940a..de5160f7fa04b 100644
--- a/llvm/lib/Analysis/UniformityAnalysis.cpp
+++ b/llvm/lib/Analysis/UniformityAnalysis.cpp
@@ -118,7 +118,12 @@ llvm::UniformityInfo UniformityInfoAnalysis::run(Function &F,
auto &DT = FAM.getResult<DominatorTreeAnalysis>(F);
auto &TTI = FAM.getResult<TargetIRAnalysis>(F);
auto &CI = FAM.getResult<CycleAnalysis>(F);
- return UniformityInfo{F, DT, CI, &TTI};
+ UniformityInfo UI{F, DT, CI, &TTI};
+ // Skip computation if we can assume everything is uniform.
+ if (TTI.hasBranchDivergence())
+ UI.compute();
+
+ return UI;
}
AnalysisKey UniformityInfoAnalysis::Key;
@@ -168,6 +173,11 @@ bool UniformityInfoWrapperPass::runOnFunction(Function &F) {
m_function = &F;
m_uniformityInfo =
UniformityInfo{F, domTree, cycleInfo, &targetTransformInfo};
+
+ // Skip computation if we can assume everything is uniform.
+ if (targetTransformInfo.hasBranchDivergence())
+ m_uniformityInfo.compute();
+
return false;
}
diff --git a/llvm/lib/CodeGen/MachineUniformityAnalysis.cpp b/llvm/lib/CodeGen/MachineUniformityAnalysis.cpp
index b76ecdcae82ba..0e02c50284c60 100644
--- a/llvm/lib/CodeGen/MachineUniformityAnalysis.cpp
+++ b/llvm/lib/CodeGen/MachineUniformityAnalysis.cpp
@@ -153,12 +153,14 @@ template class llvm::GenericUniformityInfo<MachineSSAContext>;
template struct llvm::GenericUniformityAnalysisImplDeleter<
llvm::GenericUniformityAnalysisImpl<MachineSSAContext>>;
-MachineUniformityInfo
-llvm::computeMachineUniformityInfo(MachineFunction &F,
- const MachineCycleInfo &cycleInfo,
- const MachineDomTree &domTree) {
+MachineUniformityInfo llvm::computeMachineUniformityInfo(
+ MachineFunction &F, const MachineCycleInfo &cycleInfo,
+ const MachineDomTree &domTree, bool HasBranchDivergence) {
assert(F.getRegInfo().isSSA() && "Expected to be run on SSA form!");
- return MachineUniformityInfo(F, domTree, cycleInfo);
+ MachineUniformityInfo UI(F, domTree, cycleInfo);
+ if (HasBranchDivergence)
+ UI.compute();
+ return UI;
}
namespace {
@@ -218,7 +220,9 @@ void MachineUniformityAnalysisPass::getAnalysisUsage(AnalysisUsage &AU) const {
bool MachineUniformityAnalysisPass::runOnMachineFunction(MachineFunction &MF) {
auto &DomTree = getAnalysis<MachineDominatorTree>().getBase();
auto &CI = getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo();
- UI = computeMachineUniformityInfo(MF, CI, DomTree);
+ // FIXME: Query TTI::hasBranchDivergence. -run-pass seems to end up with a
+ // default NoTTI
+ UI = computeMachineUniformityInfo(MF, CI, DomTree, true);
return false;
}
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegBankSelect.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegBankSelect.cpp
index 62ffef31e4b3f..f763ca91b6321 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPURegBankSelect.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPURegBankSelect.cpp
@@ -63,8 +63,9 @@ bool AMDGPURegBankSelect::runOnMachineFunction(MachineFunction &MF) {
getAnalysis<MachineCycleInfoWrapperPass>().getCycleInfo();
MachineDominatorTree &DomTree = getAnalysis<MachineDominatorTree>();
+ // TODO: Check for single lane execution.
MachineUniformityInfo Uniformity =
- computeMachineUniformityInfo(MF, CycleInfo, DomTree.getBase());
+ computeMachineUniformityInfo(MF, CycleInfo, DomTree.getBase(), true);
(void)Uniformity; // TODO: Use this
assignRegisterBanks(MF);
More information about the llvm-commits
mailing list