LLVM 24.0.0git
AMDGPUTargetMachine.h
Go to the documentation of this file.
1//===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// The AMDGPU TargetMachine interface definition for hw codegen targets.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
16
17#include "GCNSubtarget.h"
20#include "llvm/MC/MCStreamer.h"
21#include <optional>
22#include <utility>
23
24namespace llvm {
25
26//===----------------------------------------------------------------------===//
27// AMDGPU Target Machine (R600+)
28//===----------------------------------------------------------------------===//
29
30namespace AMDGPU {
31StringRef getSchedStrategy(const AMDGPUOptions &CLOpts, const Function &F);
32}
33
35protected:
36 const AMDGPUOptions &CLOpts;
37 std::unique_ptr<TargetLoweringObjectFile> TLOF;
38
39 StringRef getGPUName(const Function &F) const;
41
42public:
46
47 AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
49 std::optional<Reloc::Model> RM,
50 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL);
52
53 const AMDGPUOptions &getCLOpts() const { return CLOpts; }
54
56 getSubtargetImpl(const Function &) const override = 0;
57
59 return TLOF.get();
60 }
61
64
65 bool isNoopAddrSpaceCast(const DataLayout &DL, unsigned SrcAS,
66 unsigned DestAS) const override;
67
68 unsigned getAssumedAddrSpace(const Value *V) const override;
69
70 std::pair<const Value *, unsigned>
71 getPredicatedAddrSpace(const Value *V) const override;
72
73 unsigned getAddressSpaceForPseudoSourceKind(unsigned Kind) const override;
74
75 bool splitModule(Module &M, unsigned NumParts,
76 function_ref<void(std::unique_ptr<Module> MPart)>
77 ModuleCallback) override;
80};
81
82//===----------------------------------------------------------------------===//
83// GCN Target Machine (SI+)
84//===----------------------------------------------------------------------===//
85
87private:
88 mutable StringMap<std::unique_ptr<GCNSubtarget>> SubtargetMap;
89
90public:
91 GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
93 std::optional<Reloc::Model> RM,
94 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,
95 bool JIT);
96
98
99 const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override;
100
102
103 bool useIPRA() const override { return true; }
104
107 CodeGenFileType FileType,
108 const CGPassBuilderOption &Opts, MCContext &Ctx,
110
112
113 /// Get xnack/sramecc setting from module flag or command line option (for
114 /// testing).
115 /// Returns Any if not specified.
117 getTargetIDSettingFromModuleFlag(const Module &M, StringRef FlagName) const;
118
121 const TargetSubtargetInfo *STI) const override;
122
125 convertFuncInfoToYAML(const MachineFunction &MF) const override;
129 SMRange &SourceRange) const override;
134};
135
136//===----------------------------------------------------------------------===//
137// AMDGPU Pass Setup - For Legacy Pass Manager.
138//===----------------------------------------------------------------------===//
139
141protected:
142 const AMDGPUOptions &CLOpts;
143
144public:
146
152 void addIRPasses() override;
153 void addCodeGenPrepare() override;
154 bool addPreISel() override;
155 bool addInstSelector() override;
156 bool addGCPasses() override;
157
158 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
159
160 /// Check if a pass is enabled given \p Opt option. The option always
161 /// overrides defaults if explicitly used. Otherwise the pass is enabled at an
162 /// optimization \p Level minimum.
165 return valueOr(Opt, TM->getOptLevel() >= Level);
166 }
167};
168
169} // end namespace llvm
170
171#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
unsigned NumParts
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
AMD GCN specific subclass of TargetSubtarget.
#define F(x, y, z)
Definition MD5.cpp:54
#define T
ModuleAnalysisManager MAM
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
PassInstrumentationCallbacks PIC
Basic Register Allocator
Target-Independent Code Generator Pass Configuration Options pass.
A manager for alias analyses.
AMDGPUTargetMachine & getAMDGPUTargetMachine() const
std::unique_ptr< CSEConfigBase > getCSEConfig() const override
Returns the CSEConfig object to use for the current optimization level.
const AMDGPUOptions & CLOpts
bool addPreISel() override
Methods with trivial inline returns are convenient points in the common codegen pass pipeline where t...
bool addInstSelector() override
addInstSelector - This method should install an instruction selector pass, which converts from LLVM c...
bool addGCPasses() override
addGCPasses - Add late codegen passes that analyze code for garbage collection.
AMDGPUPassConfig(TargetMachine &TM, PassManagerBase &PM)
bool isPassEnabled(BoolOrDefault Opt, CodeGenOptLevel Level=CodeGenOptLevel::Default) const
Check if a pass is enabled given Opt option.
void addIRPasses() override
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
void addCodeGenPrepare() override
Add pass to prepare the LLVM IR for code generation.
std::unique_ptr< TargetLoweringObjectFile > TLOF
unsigned getAddressSpaceForPseudoSourceKind(unsigned Kind) const override
getAddressSpaceForPseudoSourceKind - Given the kind of memory (e.g.
TargetLoweringObjectFile * getObjFileLowering() const override
bool isNoopAddrSpaceCast(const DataLayout &DL, unsigned SrcAS, unsigned DestAS) const override
Returns true if a cast between SrcAS and DestAS is a noop.
void registerDefaultAliasAnalyses(AAManager &) override
Allow the target to register alias analyses with the AAManager for use with the new pass manager.
std::pair< const Value *, unsigned > getPredicatedAddrSpace(const Value *V) const override
If the specified predicate checks whether a generic pointer falls within a specified address space,...
StringRef getFeatureString(const Function &F) const
ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override
Create an instance of ScheduleDAGInstrs to be run within the standard MachineScheduler pass for this ...
const AMDGPUOptions & CLOpts
AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL)
const AMDGPUOptions & getCLOpts() const
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
StringRef getGPUName(const Function &F) const
unsigned getAssumedAddrSpace(const Value *V) const override
If the specified generic pointer could be assumed as a pointer to a specific address space,...
bool splitModule(Module &M, unsigned NumParts, function_ref< void(std::unique_ptr< Module > MPart)> ModuleCallback) override
Entry point for module splitting.
const TargetSubtargetInfo * getSubtargetImpl(const Function &) const override=0
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
CodeGenTargetMachineImpl(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
const TargetSubtargetInfo * getSubtargetImpl(const Function &) const override
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
ScheduleDAGInstrs * createPostMachineScheduler(MachineSchedContext *C) const override
Similar to createMachineScheduler but used when postRA machine scheduling is enabled.
ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override
Create an instance of ScheduleDAGInstrs to be run within the standard MachineScheduler pass for this ...
void registerMachineRegisterInfoCallback(MachineFunction &MF) const override
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const override
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const override
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const override
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
Error buildCodeGenPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, const CGPassBuilderOption &Opts, MCContext &Ctx, PassInstrumentationCallbacks *PIC) override
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
bool useIPRA() const override
True if the target wants to use interprocedural register allocation by default.
GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
AMDGPU::TargetIDSetting getTargetIDSettingFromModuleFlag(const Module &M, StringRef FlagName) const
Get xnack/sramecc setting from module flag or command line option (for testing).
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
Context object for machine code objects.
Definition MCContext.h:83
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:307
Represents a range in source code.
Definition SMLoc.h:47
A ScheduleDAG for scheduling lists of MachineInstr.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:129
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Primary interface to the complete machine description for the target machine.
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
Target-Independent Code Generator Pass Configuration Options.
TargetPassConfig(TargetMachine &TM, PassManagerBase &PM)
TMC & getTM() const
Get the right type of TargetMachine for this target.
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
LLVM Value Representation.
Definition Value.h:75
An efficient, type-erasing, non-owning reference to a callable.
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
An abstract base class for streams implementations that also support a pwrite operation.
StringRef getSchedStrategy(const AMDGPUOptions &CLOpts, const Function &F)
This is an optimization pass for GlobalISel generic memory operations.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
Definition CodeGen.h:309
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:280
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:283
constexpr bool valueOr(BoolOrDefault X, bool Default)
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:391
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.