1 //===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// The AMDGPU TargetMachine interface definition for hw codgen targets.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
15 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
17 #include "AMDGPUSubtarget.h"
18 #include "llvm/ADT/Optional.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Analysis/TargetTransformInfo.h"
22 #include "llvm/Support/CodeGen.h"
23 #include "llvm/Target/TargetMachine.h"
28 //===----------------------------------------------------------------------===//
29 // AMDGPU Target Machine (R600+)
30 //===----------------------------------------------------------------------===//
32 class AMDGPUTargetMachine
: public LLVMTargetMachine
{
34 std::unique_ptr
<TargetLoweringObjectFile
> TLOF
;
36 StringRef
getGPUName(const Function
&F
) const;
37 StringRef
getFeatureString(const Function
&F
) const;
40 static bool EnableLateStructurizeCFG
;
41 static bool EnableFunctionCalls
;
43 AMDGPUTargetMachine(const Target
&T
, const Triple
&TT
, StringRef CPU
,
44 StringRef FS
, TargetOptions Options
,
45 Optional
<Reloc::Model
> RM
, Optional
<CodeModel::Model
> CM
,
46 CodeGenOpt::Level OL
);
47 ~AMDGPUTargetMachine() override
;
49 const TargetSubtargetInfo
*getSubtargetImpl() const;
50 const TargetSubtargetInfo
*getSubtargetImpl(const Function
&) const override
= 0;
52 TargetLoweringObjectFile
*getObjFileLowering() const override
{
56 void adjustPassManager(PassManagerBuilder
&) override
;
58 /// Get the integer value of a null pointer in the given address space.
59 uint64_t getNullPointerValue(unsigned AddrSpace
) const {
60 return (AddrSpace
== AMDGPUAS::LOCAL_ADDRESS
||
61 AddrSpace
== AMDGPUAS::REGION_ADDRESS
) ? -1 : 0;
65 //===----------------------------------------------------------------------===//
66 // R600 Target Machine (R600 -> Cayman)
67 //===----------------------------------------------------------------------===//
69 class R600TargetMachine final
: public AMDGPUTargetMachine
{
71 mutable StringMap
<std::unique_ptr
<R600Subtarget
>> SubtargetMap
;
74 R600TargetMachine(const Target
&T
, const Triple
&TT
, StringRef CPU
,
75 StringRef FS
, TargetOptions Options
,
76 Optional
<Reloc::Model
> RM
, Optional
<CodeModel::Model
> CM
,
77 CodeGenOpt::Level OL
, bool JIT
);
79 TargetPassConfig
*createPassConfig(PassManagerBase
&PM
) override
;
81 const R600Subtarget
*getSubtargetImpl(const Function
&) const override
;
83 TargetTransformInfo
getTargetTransformInfo(const Function
&F
) override
;
85 bool isMachineVerifierClean() const override
{
90 //===----------------------------------------------------------------------===//
91 // GCN Target Machine (SI+)
92 //===----------------------------------------------------------------------===//
94 class GCNTargetMachine final
: public AMDGPUTargetMachine
{
96 mutable StringMap
<std::unique_ptr
<GCNSubtarget
>> SubtargetMap
;
99 GCNTargetMachine(const Target
&T
, const Triple
&TT
, StringRef CPU
,
100 StringRef FS
, TargetOptions Options
,
101 Optional
<Reloc::Model
> RM
, Optional
<CodeModel::Model
> CM
,
102 CodeGenOpt::Level OL
, bool JIT
);
104 TargetPassConfig
*createPassConfig(PassManagerBase
&PM
) override
;
106 const GCNSubtarget
*getSubtargetImpl(const Function
&) const override
;
108 TargetTransformInfo
getTargetTransformInfo(const Function
&F
) override
;
110 bool useIPRA() const override
{
114 yaml::MachineFunctionInfo
*createDefaultFuncInfoYAML() const override
;
115 yaml::MachineFunctionInfo
*
116 convertFuncInfoToYAML(const MachineFunction
&MF
) const override
;
117 bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo
&,
118 PerFunctionMIParsingState
&PFS
,
120 SMRange
&SourceRange
) const override
;
123 } // end namespace llvm
125 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H