xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric /// \file
1081ad6265SDimitry Andric /// The AMDGPU TargetMachine interface definition for hw codegen targets.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
150b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
160b57cec5SDimitry Andric 
17e8d8bef9SDimitry Andric #include "GCNSubtarget.h"
18349cc55cSDimitry Andric #include "llvm/CodeGen/TargetPassConfig.h"
190b57cec5SDimitry Andric #include "llvm/Target/TargetMachine.h"
20bdd1243dSDimitry Andric #include <optional>
21349cc55cSDimitry Andric #include <utility>
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric namespace llvm {
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
260b57cec5SDimitry Andric // AMDGPU Target Machine (R600+)
270b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric class AMDGPUTargetMachine : public LLVMTargetMachine {
300b57cec5SDimitry Andric protected:
310b57cec5SDimitry Andric   std::unique_ptr<TargetLoweringObjectFile> TLOF;
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric   StringRef getGPUName(const Function &F) const;
340b57cec5SDimitry Andric   StringRef getFeatureString(const Function &F) const;
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric public:
370b57cec5SDimitry Andric   static bool EnableLateStructurizeCFG;
380b57cec5SDimitry Andric   static bool EnableFunctionCalls;
39fe6060f1SDimitry Andric   static bool EnableLowerModuleLDS;
40*0fca6ea1SDimitry Andric   static bool DisableStructurizer;
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
43*0fca6ea1SDimitry Andric                       StringRef FS, const TargetOptions &Options,
44bdd1243dSDimitry Andric                       std::optional<Reloc::Model> RM,
455f757f3fSDimitry Andric                       std::optional<CodeModel::Model> CM, CodeGenOptLevel OL);
460b57cec5SDimitry Andric   ~AMDGPUTargetMachine() override;
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric   const TargetSubtargetInfo *getSubtargetImpl() const;
490b57cec5SDimitry Andric   const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override = 0;
500b57cec5SDimitry Andric 
getObjFileLowering()510b57cec5SDimitry Andric   TargetLoweringObjectFile *getObjFileLowering() const override {
520b57cec5SDimitry Andric     return TLOF.get();
530b57cec5SDimitry Andric   }
540b57cec5SDimitry Andric 
55*0fca6ea1SDimitry Andric   Error buildCodeGenPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out,
56*0fca6ea1SDimitry Andric                              raw_pwrite_stream *DwoOut,
57*0fca6ea1SDimitry Andric                              CodeGenFileType FileType,
58*0fca6ea1SDimitry Andric                              const CGPassBuilderOption &Opts,
59*0fca6ea1SDimitry Andric                              PassInstrumentationCallbacks *PIC) override;
60*0fca6ea1SDimitry Andric 
61*0fca6ea1SDimitry Andric   void registerPassBuilderCallbacks(PassBuilder &PB) override;
62e8d8bef9SDimitry Andric   void registerDefaultAliasAnalyses(AAManager &) override;
63e8d8bef9SDimitry Andric 
640b57cec5SDimitry Andric   /// Get the integer value of a null pointer in the given address space.
65e8d8bef9SDimitry Andric   static int64_t getNullPointerValue(unsigned AddrSpace);
66e8d8bef9SDimitry Andric 
67e8d8bef9SDimitry Andric   bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override;
68e8d8bef9SDimitry Andric 
69e8d8bef9SDimitry Andric   unsigned getAssumedAddrSpace(const Value *V) const override;
700b57cec5SDimitry Andric 
71349cc55cSDimitry Andric   std::pair<const Value *, unsigned>
72349cc55cSDimitry Andric   getPredicatedAddrSpace(const Value *V) const override;
7381ad6265SDimitry Andric 
7481ad6265SDimitry Andric   unsigned getAddressSpaceForPseudoSourceKind(unsigned Kind) const override;
75*0fca6ea1SDimitry Andric 
76*0fca6ea1SDimitry Andric   bool splitModule(Module &M, unsigned NumParts,
77*0fca6ea1SDimitry Andric                    function_ref<void(std::unique_ptr<Module> MPart)>
78*0fca6ea1SDimitry Andric                        ModuleCallback) override;
790b57cec5SDimitry Andric };
800b57cec5SDimitry Andric 
810b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
820b57cec5SDimitry Andric // GCN Target Machine (SI+)
830b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric class GCNTargetMachine final : public AMDGPUTargetMachine {
860b57cec5SDimitry Andric private:
870b57cec5SDimitry Andric   mutable StringMap<std::unique_ptr<GCNSubtarget>> SubtargetMap;
880b57cec5SDimitry Andric 
890b57cec5SDimitry Andric public:
900b57cec5SDimitry Andric   GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
91*0fca6ea1SDimitry Andric                    StringRef FS, const TargetOptions &Options,
92bdd1243dSDimitry Andric                    std::optional<Reloc::Model> RM,
935f757f3fSDimitry Andric                    std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,
94bdd1243dSDimitry Andric                    bool JIT);
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
970b57cec5SDimitry Andric 
98349cc55cSDimitry Andric   const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override;
990b57cec5SDimitry Andric 
10081ad6265SDimitry Andric   TargetTransformInfo getTargetTransformInfo(const Function &F) const override;
1010b57cec5SDimitry Andric 
useIPRA()1020b57cec5SDimitry Andric   bool useIPRA() const override {
1030b57cec5SDimitry Andric     return true;
1040b57cec5SDimitry Andric   }
1050b57cec5SDimitry Andric 
10606c3fb27SDimitry Andric   void registerMachineRegisterInfoCallback(MachineFunction &MF) const override;
10706c3fb27SDimitry Andric 
108bdd1243dSDimitry Andric   MachineFunctionInfo *
109bdd1243dSDimitry Andric   createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
110bdd1243dSDimitry Andric                             const TargetSubtargetInfo *STI) const override;
111bdd1243dSDimitry Andric 
1120b57cec5SDimitry Andric   yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const override;
1130b57cec5SDimitry Andric   yaml::MachineFunctionInfo *
1140b57cec5SDimitry Andric   convertFuncInfoToYAML(const MachineFunction &MF) const override;
1150b57cec5SDimitry Andric   bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &,
1160b57cec5SDimitry Andric                                 PerFunctionMIParsingState &PFS,
1170b57cec5SDimitry Andric                                 SMDiagnostic &Error,
1180b57cec5SDimitry Andric                                 SMRange &SourceRange) const override;
1190b57cec5SDimitry Andric };
1200b57cec5SDimitry Andric 
121349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
122349cc55cSDimitry Andric // AMDGPU Pass Setup
123349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
124349cc55cSDimitry Andric 
125349cc55cSDimitry Andric class AMDGPUPassConfig : public TargetPassConfig {
126349cc55cSDimitry Andric public:
127349cc55cSDimitry Andric   AMDGPUPassConfig(LLVMTargetMachine &TM, PassManagerBase &PM);
128349cc55cSDimitry Andric 
getAMDGPUTargetMachine()129349cc55cSDimitry Andric   AMDGPUTargetMachine &getAMDGPUTargetMachine() const {
130349cc55cSDimitry Andric     return getTM<AMDGPUTargetMachine>();
131349cc55cSDimitry Andric   }
132349cc55cSDimitry Andric 
133349cc55cSDimitry Andric   ScheduleDAGInstrs *
134349cc55cSDimitry Andric   createMachineScheduler(MachineSchedContext *C) const override;
135349cc55cSDimitry Andric 
136349cc55cSDimitry Andric   void addEarlyCSEOrGVNPass();
137349cc55cSDimitry Andric   void addStraightLineScalarOptimizationPasses();
138349cc55cSDimitry Andric   void addIRPasses() override;
139349cc55cSDimitry Andric   void addCodeGenPrepare() override;
140349cc55cSDimitry Andric   bool addPreISel() override;
141349cc55cSDimitry Andric   bool addInstSelector() override;
142349cc55cSDimitry Andric   bool addGCPasses() override;
143349cc55cSDimitry Andric 
144349cc55cSDimitry Andric   std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
145349cc55cSDimitry Andric 
146349cc55cSDimitry Andric   /// Check if a pass is enabled given \p Opt option. The option always
147349cc55cSDimitry Andric   /// overrides defaults if explicitly used. Otherwise its default will
148349cc55cSDimitry Andric   /// be used given that a pass shall work at an optimization \p Level
149349cc55cSDimitry Andric   /// minimum.
150349cc55cSDimitry Andric   bool isPassEnabled(const cl::opt<bool> &Opt,
1515f757f3fSDimitry Andric                      CodeGenOptLevel Level = CodeGenOptLevel::Default) const {
152349cc55cSDimitry Andric     if (Opt.getNumOccurrences())
153349cc55cSDimitry Andric       return Opt;
154349cc55cSDimitry Andric     if (TM->getOptLevel() < Level)
155349cc55cSDimitry Andric       return false;
156349cc55cSDimitry Andric     return Opt;
157349cc55cSDimitry Andric   }
158349cc55cSDimitry Andric };
159349cc55cSDimitry Andric 
1600b57cec5SDimitry Andric } // end namespace llvm
1610b57cec5SDimitry Andric 
1620b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
163