Divergence analysis for GPU programs
[oota-llvm.git] / lib / Target / NVPTX / NVPTXTargetTransformInfo.h
1 //===-- NVPTXTargetTransformInfo.h - NVPTX specific TTI ---------*- 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 /// \file
10 /// This file a TargetTransformInfo::Concept conforming object specific to the
11 /// NVPTX target machine. It uses the target's detailed information to
12 /// provide more precise answers to certain TTI queries, while letting the
13 /// target independent and default TTI implementations handle the rest.
14 ///
15 //===----------------------------------------------------------------------===//
16
17 #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXTARGETTRANSFORMINFO_H
18 #define LLVM_LIB_TARGET_NVPTX_NVPTXTARGETTRANSFORMINFO_H
19
20 #include "NVPTX.h"
21 #include "NVPTXTargetMachine.h"
22 #include "llvm/Analysis/TargetTransformInfo.h"
23 #include "llvm/CodeGen/BasicTTIImpl.h"
24 #include "llvm/Target/TargetLowering.h"
25
26 namespace llvm {
27
28 class NVPTXTTIImpl : public BasicTTIImplBase<NVPTXTTIImpl> {
29   typedef BasicTTIImplBase<NVPTXTTIImpl> BaseT;
30   typedef TargetTransformInfo TTI;
31   friend BaseT;
32
33   const NVPTXSubtarget *ST;
34   const NVPTXTargetLowering *TLI;
35
36   const NVPTXSubtarget *getST() const { return ST; };
37   const NVPTXTargetLowering *getTLI() const { return TLI; };
38
39 public:
40   explicit NVPTXTTIImpl(const NVPTXTargetMachine *TM)
41       : BaseT(TM), ST(TM->getSubtargetImpl()), TLI(ST->getTargetLowering()) {}
42
43   // Provide value semantics. MSVC requires that we spell all of these out.
44   NVPTXTTIImpl(const NVPTXTTIImpl &Arg)
45       : BaseT(static_cast<const BaseT &>(Arg)), ST(Arg.ST), TLI(Arg.TLI) {}
46   NVPTXTTIImpl(NVPTXTTIImpl &&Arg)
47       : BaseT(std::move(static_cast<BaseT &>(Arg))), ST(std::move(Arg.ST)),
48         TLI(std::move(Arg.TLI)) {}
49   NVPTXTTIImpl &operator=(const NVPTXTTIImpl &RHS) {
50     BaseT::operator=(static_cast<const BaseT &>(RHS));
51     ST = RHS.ST;
52     TLI = RHS.TLI;
53     return *this;
54   }
55   NVPTXTTIImpl &operator=(NVPTXTTIImpl &&RHS) {
56     BaseT::operator=(std::move(static_cast<BaseT &>(RHS)));
57     ST = std::move(RHS.ST);
58     TLI = std::move(RHS.TLI);
59     return *this;
60   }
61
62   bool hasBranchDivergence() { return true; }
63
64   bool isSourceOfDivergence(const Value *V);
65
66   unsigned getArithmeticInstrCost(
67       unsigned Opcode, Type *Ty,
68       TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
69       TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
70       TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
71       TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None);
72 };
73
74 } // end namespace llvm
75
76 #endif