LLVM 17.0.0git
UniformityAnalysis.cpp
Go to the documentation of this file.
1//===- UniformityAnalysis.cpp ---------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
13#include "llvm/IR/Constants.h"
14#include "llvm/IR/Dominators.h"
18
19using namespace llvm;
20
21template <>
23 const Instruction &I) const {
24 return isDivergent((const Value *)&I);
25}
26
27template <>
29 const Instruction &Instr, bool AllDefsDivergent) {
30 return markDivergent(&Instr);
31}
32
34 for (auto &I : instructions(F)) {
36 markDivergent(I);
37 else if (TTI->isAlwaysUniform(&I))
38 addUniformOverride(I);
39 }
40 for (auto &Arg : F.args()) {
42 markDivergent(&Arg);
43 }
44 }
45}
46
47template <>
49 const Value *V) {
50 for (const auto *User : V->users()) {
51 if (const auto *UserInstr = dyn_cast<const Instruction>(User)) {
52 if (markDivergent(*UserInstr)) {
53 Worklist.push_back(UserInstr);
54 }
55 }
56 }
57}
58
59template <>
61 const Instruction &Instr) {
62 assert(!isAlwaysUniform(Instr));
63 if (Instr.isTerminator())
64 return;
65 pushUsers(cast<Value>(&Instr));
66}
67
68template <>
70 const Instruction &I, const Cycle &DefCycle) const {
71 assert(!isAlwaysUniform(I));
72 for (const Use &U : I.operands()) {
73 if (auto *I = dyn_cast<Instruction>(&U)) {
74 if (DefCycle.contains(I->getParent()))
75 return true;
76 }
77 }
78 return false;
79}
80
81template <>
83 const Use &U) const {
84 const auto *V = U.get();
85 if (isDivergent(V))
86 return true;
87 if (const auto *DefInstr = dyn_cast<Instruction>(V)) {
88 const auto *UseInstr = cast<Instruction>(U.getUser());
89 return isTemporalDivergent(*UseInstr->getParent(), *DefInstr);
90 }
91 return false;
92}
93
94// This ensures explicit instantiation of
95// GenericUniformityAnalysisImpl::ImplDeleter::operator()
99
100//===----------------------------------------------------------------------===//
101// UniformityInfoAnalysis and related pass implementations
102//===----------------------------------------------------------------------===//
103
108 auto &CI = FAM.getResult<CycleAnalysis>(F);
109 return UniformityInfo{F, DT, CI, &TTI};
110}
111
112AnalysisKey UniformityInfoAnalysis::Key;
113
115 : OS(OS) {}
116
119 OS << "UniformityInfo for function '" << F.getName() << "':\n";
121
122 return PreservedAnalyses::all();
123}
124
125//===----------------------------------------------------------------------===//
126// UniformityInfoWrapperPass Implementation
127//===----------------------------------------------------------------------===//
128
130
133}
134
136 "Uniformity Analysis", true, true)
141 "Uniformity Analysis", true, true)
142
143void UniformityInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
144 AU.setPreservesAll();
145 AU.addRequired<DominatorTreeWrapperPass>();
146 AU.addRequiredTransitive<CycleInfoWrapperPass>();
147 AU.addRequired<TargetTransformInfoWrapperPass>();
148}
149
151 auto &cycleInfo = getAnalysis<CycleInfoWrapperPass>().getResult();
152 auto &domTree = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
153 auto &targetTransformInfo =
154 getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
155
156 m_function = &F;
157 m_uniformityInfo =
158 UniformityInfo{F, domTree, cycleInfo, &targetTransformInfo};
159 return false;
160}
161
163 OS << "UniformityInfo for function '" << m_function->getName() << "':\n";
164}
165
167 m_uniformityInfo = UniformityInfo{};
168 m_function = nullptr;
169}
amdgpu Simplify well known AMD library false FunctionCallee Value * Arg
basic Basic Alias true
block Block Frequency Analysis
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
Implementation of uniformity analysis.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
print must be executed print the must be executed context for all instructions
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:55
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:59
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:52
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This pass exposes codegen information to IR-level passes.
LLVM IR instance of the generic uniformity analysis.
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:620
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:774
Represent the analysis usage information of a pass.
Analysis pass which computes a CycleInfo.
Definition: CycleAnalysis.h:52
Legacy analysis pass which computes a CycleInfo.
Definition: CycleAnalysis.h:31
Analysis pass which computes a DominatorTree.
Definition: Dominators.h:279
Legacy analysis pass which computes a DominatorTree.
Definition: Dominators.h:314
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:308
A possibly irreducible generalization of a Loop.
bool contains(const BlockT *Block) const
Return whether Block is contained in the cycle.
Analysis that identifies uniform values in a data-parallel execution.
bool isDivergentUse(const UseT &U) const
bool hasDivergentDefs(const InstructionT &I) const
bool markDefsDivergent(const InstructionT &Instr, bool AllDefsDivergent=true)
bool isTerminator() const
Definition: Instruction.h:171
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
Definition: PassManager.h:152
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: PassManager.h:158
Analysis pass providing the TargetTransformInfo.
Wrapper pass for TargetTransformInfo.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
bool isAlwaysUniform(const Value *V) const
bool isSourceOfDivergence(const Value *V) const
Returns whether V is a source of divergence.
Analysis pass which computes UniformityInfo.
UniformityInfo run(Function &F, FunctionAnalysisManager &)
Run the analysis pass over a function and produce a dominator tree.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Legacy analysis pass which computes a CycleInfo.
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void print(raw_ostream &OS, const Module *M=nullptr) const override
print - Print out the internal state of the pass.
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
LLVM Value Representation.
Definition: Value.h:74
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:308
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr)
void initializeUniformityInfoWrapperPassPass(PassRegistry &)
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: PassManager.h:69