mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
d849f468b0
The definition of the DivergenceAnalysis pass was in a CPP file and wasn't accessible to users of the analysis to get it through "getAnalysis<>()". This patch extracts the definition into a separate header that can be used by users of the analysis to fetch the results. Patch by Volkan Keles (vkeles@apple.com) llvm-svn: 248186
49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
//===- llvm/Analysis/DivergenceAnalysis.h - Divergence Analysis -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// The divergence analysis is an LLVM pass which can be used to find out
|
|
// if a branch instruction in a GPU program is divergent or not. It can help
|
|
// branch optimizations such as jump threading and loop unswitching to make
|
|
// better decisions.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/DenseSet.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/Pass.h"
|
|
|
|
namespace llvm {
|
|
class Value;
|
|
class DivergenceAnalysis : public FunctionPass {
|
|
public:
|
|
static char ID;
|
|
|
|
DivergenceAnalysis() : FunctionPass(ID) {
|
|
initializeDivergenceAnalysisPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
|
|
|
bool runOnFunction(Function &F) override;
|
|
|
|
// Print all divergent branches in the function.
|
|
void print(raw_ostream &OS, const Module *) const override;
|
|
|
|
// Returns true if V is divergent.
|
|
bool isDivergent(const Value *V) const { return DivergentValues.count(V); }
|
|
|
|
// Returns true if V is uniform/non-divergent.
|
|
bool isUniform(const Value *V) const { return !isDivergent(V); }
|
|
|
|
private:
|
|
// Stores all divergent values.
|
|
DenseSet<const Value *> DivergentValues;
|
|
};
|
|
} // End llvm namespace
|