Line data Source code
1 : //===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- 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 : /// \file
11 : /// The AMDGPU TargetMachine interface definition for hw codgen targets.
12 : //
13 : //===----------------------------------------------------------------------===//
14 :
15 : #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
16 : #define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
17 :
18 : #include "AMDGPUIntrinsicInfo.h"
19 : #include "AMDGPUSubtarget.h"
20 : #include "llvm/ADT/Optional.h"
21 : #include "llvm/ADT/StringMap.h"
22 : #include "llvm/ADT/StringRef.h"
23 : #include "llvm/Analysis/TargetTransformInfo.h"
24 : #include "llvm/Support/CodeGen.h"
25 : #include "llvm/Target/TargetMachine.h"
26 : #include <memory>
27 :
28 : namespace llvm {
29 :
30 : //===----------------------------------------------------------------------===//
31 : // AMDGPU Target Machine (R600+)
32 : //===----------------------------------------------------------------------===//
33 :
34 2790 : class AMDGPUTargetMachine : public LLVMTargetMachine {
35 : protected:
36 : std::unique_ptr<TargetLoweringObjectFile> TLOF;
37 :
38 : StringRef getGPUName(const Function &F) const;
39 : StringRef getFeatureString(const Function &F) const;
40 :
41 : public:
42 : static bool EnableLateStructurizeCFG;
43 : static bool EnableFunctionCalls;
44 :
45 : AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
46 : StringRef FS, TargetOptions Options,
47 : Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
48 : CodeGenOpt::Level OL);
49 : ~AMDGPUTargetMachine() override;
50 :
51 : const TargetSubtargetInfo *getSubtargetImpl() const;
52 : const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override = 0;
53 :
54 82102 : TargetLoweringObjectFile *getObjFileLowering() const override {
55 82102 : return TLOF.get();
56 : }
57 :
58 : void adjustPassManager(PassManagerBuilder &) override;
59 :
60 : /// Get the integer value of a null pointer in the given address space.
61 0 : uint64_t getNullPointerValue(unsigned AddrSpace) const {
62 44 : return (AddrSpace == AMDGPUAS::LOCAL_ADDRESS ||
63 44 : AddrSpace == AMDGPUAS::REGION_ADDRESS) ? -1 : 0;
64 : }
65 : };
66 :
67 : //===----------------------------------------------------------------------===//
68 : // R600 Target Machine (R600 -> Cayman)
69 : //===----------------------------------------------------------------------===//
70 :
71 : class R600TargetMachine final : public AMDGPUTargetMachine {
72 : private:
73 : mutable StringMap<std::unique_ptr<R600Subtarget>> SubtargetMap;
74 :
75 : public:
76 : R600TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
77 : StringRef FS, TargetOptions Options,
78 : Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
79 : CodeGenOpt::Level OL, bool JIT);
80 :
81 : TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
82 :
83 : const R600Subtarget *getSubtargetImpl(const Function &) const override;
84 :
85 : TargetTransformInfo getTargetTransformInfo(const Function &F) override;
86 :
87 0 : bool isMachineVerifierClean() const override {
88 0 : return false;
89 : }
90 : };
91 :
92 : //===----------------------------------------------------------------------===//
93 : // GCN Target Machine (SI+)
94 : //===----------------------------------------------------------------------===//
95 :
96 : class GCNTargetMachine final : public AMDGPUTargetMachine {
97 : private:
98 : AMDGPUIntrinsicInfo IntrinsicInfo;
99 : mutable StringMap<std::unique_ptr<GCNSubtarget>> SubtargetMap;
100 :
101 : public:
102 : GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
103 : StringRef FS, TargetOptions Options,
104 : Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
105 : CodeGenOpt::Level OL, bool JIT);
106 :
107 : TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
108 :
109 : const GCNSubtarget *getSubtargetImpl(const Function &) const override;
110 :
111 : TargetTransformInfo getTargetTransformInfo(const Function &F) override;
112 :
113 26699 : const AMDGPUIntrinsicInfo *getIntrinsicInfo() const override {
114 26699 : return &IntrinsicInfo;
115 : }
116 :
117 2367 : bool useIPRA() const override {
118 2367 : return true;
119 : }
120 : };
121 :
122 : } // end namespace llvm
123 :
124 : #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
|