Coverage Report

Created: 2018-07-12 09:57

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/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
#ifndef LLVM_ANALYSIS_DIVERGENCE_ANALYSIS_H
17
#define LLVM_ANALYSIS_DIVERGENCE_ANALYSIS_H
18
19
#include "llvm/ADT/DenseSet.h"
20
#include "llvm/IR/Function.h"
21
#include "llvm/Pass.h"
22
23
namespace llvm {
24
class Value;
25
class DivergenceAnalysis : public FunctionPass {
26
public:
27
  static char ID;
28
29
9.27k
  DivergenceAnalysis() : FunctionPass(ID) {
30
9.27k
    initializeDivergenceAnalysisPass(*PassRegistry::getPassRegistry());
31
9.27k
  }
32
33
  void getAnalysisUsage(AnalysisUsage &AU) const override;
34
35
  bool runOnFunction(Function &F) override;
36
37
  // Print all divergent branches in the function.
38
  void print(raw_ostream &OS, const Module *) const override;
39
40
  // Returns true if V is divergent at its definition.
41
  //
42
  // Even if this function returns false, V may still be divergent when used
43
  // in a different basic block.
44
306k
  bool isDivergent(const Value *V) const { return DivergentValues.count(V); }
45
46
  // Returns true if V is uniform/non-divergent.
47
  //
48
  // Even if this function returns true, V may still be divergent when used
49
  // in a different basic block.
50
36.4k
  bool isUniform(const Value *V) const { return !isDivergent(V); }
51
52
  // Keep the analysis results uptodate by removing an erased value.
53
768
  void removeValue(const Value *V) { DivergentValues.erase(V); }
54
55
private:
56
  // Stores all divergent values.
57
  DenseSet<const Value *> DivergentValues;
58
};
59
} // End llvm namespace
60
61
#endif //LLVM_ANALYSIS_DIVERGENCE_ANALYSIS_H