Coverage Report

Created: 2017-10-03 07:32

/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/include/llvm/Analysis/DivergenceAnalysis.h
Line
Count
Source
1
//===- llvm/Analysis/DivergenceAnalysis.h - Divergence Analysis -*- C++ -*-===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
// The divergence analysis is an LLVM pass which can be used to find out
11
// if a branch instruction in a GPU program is divergent or not. It can help
12
// branch optimizations such as jump threading and loop unswitching to make
13
// better decisions.
14
//
15
//===----------------------------------------------------------------------===//
16
17
#include "llvm/ADT/DenseSet.h"
18
#include "llvm/IR/Function.h"
19
#include "llvm/Pass.h"
20
21
namespace llvm {
22
class Value;
23
class DivergenceAnalysis : public FunctionPass {
24
public:
25
  static char ID;
26
27
5.97k
  DivergenceAnalysis() : FunctionPass(ID) {
28
5.97k
    initializeDivergenceAnalysisPass(*PassRegistry::getPassRegistry());
29
5.97k
  }
30
31
  void getAnalysisUsage(AnalysisUsage &AU) const override;
32
33
  bool runOnFunction(Function &F) override;
34
35
  // Print all divergent branches in the function.
36
  void print(raw_ostream &OS, const Module *) const override;
37
38
  // Returns true if V is divergent.
39
15.5k
  bool isDivergent(const Value *V) const { return DivergentValues.count(V); }
40
41
  // Returns true if V is uniform/non-divergent.
42
15.5k
  bool isUniform(const Value *V) const { return !isDivergent(V); }
43
44
private:
45
  // Stores all divergent values.
46
  DenseSet<const Value *> DivergentValues;
47
};
48
} // End llvm namespace