mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
[DA] GPUDivergenceAnalysis for unstructured GPU kernels
Summary: This is patch #3 of the new DivergenceAnalysis <https://lists.llvm.org/pipermail/llvm-dev/2018-May/123606.html> The GPUDivergenceAnalysis is intended to eventually supersede the existing LegacyDivergenceAnalysis. The existing LegacyDivergenceAnalysis produces incorrect results on unstructured Control-Flow Graphs: <https://bugs.llvm.org/show_bug.cgi?id=37185> This patch adds the option -use-gpu-divergence-analysis to the LegacyDivergenceAnalysis to turn it into a transparent wrapper for the GPUDivergenceAnalysis. Reviewers: nhaehnle Reviewed By: nhaehnle Subscribers: jholewinski, jvesely, jfb, llvm-commits, alex-t, sameerds, arsenm, nhaehnle Differential Revision: https://reviews.llvm.org/D53493 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@348048 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -422,3 +422,36 @@ void DivergenceAnalysis::print(raw_ostream &OS, const Module *) const {
|
||||
OS << "DIVERGENT:" << I << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
// class GPUDivergenceAnalysis
|
||||
GPUDivergenceAnalysis::GPUDivergenceAnalysis(Function &F,
|
||||
const DominatorTree &DT,
|
||||
const PostDominatorTree &PDT,
|
||||
const LoopInfo &LI,
|
||||
const TargetTransformInfo &TTI)
|
||||
: SDA(DT, PDT, LI), DA(F, nullptr, DT, LI, SDA, false) {
|
||||
for (auto &I : instructions(F)) {
|
||||
if (TTI.isSourceOfDivergence(&I)) {
|
||||
DA.markDivergent(I);
|
||||
} else if (TTI.isAlwaysUniform(&I)) {
|
||||
DA.addUniformOverride(I);
|
||||
}
|
||||
}
|
||||
for (auto &Arg : F.args()) {
|
||||
if (TTI.isSourceOfDivergence(&Arg)) {
|
||||
DA.markDivergent(Arg);
|
||||
}
|
||||
}
|
||||
|
||||
DA.compute();
|
||||
}
|
||||
|
||||
bool GPUDivergenceAnalysis::isDivergent(const Value &val) const {
|
||||
return DA.isDivergent(val);
|
||||
}
|
||||
|
||||
void GPUDivergenceAnalysis::print(raw_ostream &OS, const Module *mod) const {
|
||||
OS << "Divergence of kernel " << DA.getFunction().getName() << " {\n";
|
||||
DA.print(OS, mod);
|
||||
OS << "}\n";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user