| //===-- AMDGPU.h - MachineFunction passes hw codegen --------------*- C++ -*-=// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| /// \file | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPU_H | |
| #define LLVM_LIB_TARGET_AMDGPU_AMDGPU_H | |
| #include "llvm/Target/TargetMachine.h" | |
| #include "llvm/IR/IntrinsicsR600.h" // TODO: Sink this. | |
| #include "llvm/IR/IntrinsicsAMDGPU.h" // TODO: Sink this. | |
| namespace llvm { | |
| class AMDGPUTargetMachine; | |
| class FunctionPass; | |
| class GCNTargetMachine; | |
| class ModulePass; | |
| class Pass; | |
| class Target; | |
| class TargetMachine; | |
| class TargetOptions; | |
| class PassRegistry; | |
| class Module; | |
| // R600 Passes | |
| FunctionPass *createR600VectorRegMerger(); | |
| FunctionPass *createR600ExpandSpecialInstrsPass(); | |
| FunctionPass *createR600EmitClauseMarkers(); | |
| FunctionPass *createR600ClauseMergePass(); | |
| FunctionPass *createR600Packetizer(); | |
| FunctionPass *createR600ControlFlowFinalizer(); | |
| FunctionPass *createAMDGPUCFGStructurizerPass(); | |
| FunctionPass *createR600ISelDag(TargetMachine *TM, CodeGenOpt::Level OptLevel); | |
| // SI Passes | |
| FunctionPass *createGCNDPPCombinePass(); | |
| FunctionPass *createSIAnnotateControlFlowPass(); | |
| FunctionPass *createSIFoldOperandsPass(); | |
| FunctionPass *createSIPeepholeSDWAPass(); | |
| FunctionPass *createSILowerI1CopiesPass(); | |
| FunctionPass *createSIFixupVectorISelPass(); | |
| FunctionPass *createSIAddIMGInitPass(); | |
| FunctionPass *createSIShrinkInstructionsPass(); | |
| FunctionPass *createSILoadStoreOptimizerPass(); | |
| FunctionPass *createSIWholeQuadModePass(); | |
| FunctionPass *createSIFixControlFlowLiveIntervalsPass(); | |
| FunctionPass *createSIOptimizeExecMaskingPreRAPass(); | |
| FunctionPass *createSIFixSGPRCopiesPass(); | |
| FunctionPass *createSIMemoryLegalizerPass(); | |
| FunctionPass *createSIInsertWaitcntsPass(); | |
| FunctionPass *createSIPreAllocateWWMRegsPass(); | |
| FunctionPass *createSIFormMemoryClausesPass(); | |
| FunctionPass *createAMDGPUSimplifyLibCallsPass(const TargetOptions &, | |
| const TargetMachine *); | |
| FunctionPass *createAMDGPUUseNativeCallsPass(); | |
| FunctionPass *createAMDGPUCodeGenPreparePass(); | |
| FunctionPass *createAMDGPUMachineCFGStructurizerPass(); | |
| FunctionPass *createAMDGPUPropagateAttributesEarlyPass(const TargetMachine *); | |
| ModulePass *createAMDGPUPropagateAttributesLatePass(const TargetMachine *); | |
| FunctionPass *createAMDGPURewriteOutArgumentsPass(); | |
| FunctionPass *createSIModeRegisterPass(); | |
| void initializeAMDGPUDAGToDAGISelPass(PassRegistry&); | |
| void initializeAMDGPUMachineCFGStructurizerPass(PassRegistry&); | |
| extern char &AMDGPUMachineCFGStructurizerID; | |
| void initializeAMDGPUAlwaysInlinePass(PassRegistry&); | |
| Pass *createAMDGPUAnnotateKernelFeaturesPass(); | |
| void initializeAMDGPUAnnotateKernelFeaturesPass(PassRegistry &); | |
| extern char &AMDGPUAnnotateKernelFeaturesID; | |
| FunctionPass *createAMDGPUAtomicOptimizerPass(); | |
| void initializeAMDGPUAtomicOptimizerPass(PassRegistry &); | |
| extern char &AMDGPUAtomicOptimizerID; | |
| ModulePass *createAMDGPULowerIntrinsicsPass(); | |
| void initializeAMDGPULowerIntrinsicsPass(PassRegistry &); | |
| extern char &AMDGPULowerIntrinsicsID; | |
| ModulePass *createAMDGPUFixFunctionBitcastsPass(); | |
| void initializeAMDGPUFixFunctionBitcastsPass(PassRegistry &); | |
| extern char &AMDGPUFixFunctionBitcastsID; | |
| FunctionPass *createAMDGPULowerKernelArgumentsPass(); | |
| void initializeAMDGPULowerKernelArgumentsPass(PassRegistry &); | |
| extern char &AMDGPULowerKernelArgumentsID; | |
| ModulePass *createAMDGPULowerKernelAttributesPass(); | |
| void initializeAMDGPULowerKernelAttributesPass(PassRegistry &); | |
| extern char &AMDGPULowerKernelAttributesID; | |
| void initializeAMDGPUPropagateAttributesEarlyPass(PassRegistry &); | |
| extern char &AMDGPUPropagateAttributesEarlyID; | |
| void initializeAMDGPUPropagateAttributesLatePass(PassRegistry &); | |
| extern char &AMDGPUPropagateAttributesLateID; | |
| void initializeAMDGPURewriteOutArgumentsPass(PassRegistry &); | |
| extern char &AMDGPURewriteOutArgumentsID; | |
| void initializeGCNDPPCombinePass(PassRegistry &); | |
| extern char &GCNDPPCombineID; | |
| void initializeR600ClauseMergePassPass(PassRegistry &); | |
| extern char &R600ClauseMergePassID; | |
| void initializeR600ControlFlowFinalizerPass(PassRegistry &); | |
| extern char &R600ControlFlowFinalizerID; | |
| void initializeR600ExpandSpecialInstrsPassPass(PassRegistry &); | |
| extern char &R600ExpandSpecialInstrsPassID; | |
| void initializeR600VectorRegMergerPass(PassRegistry &); | |
| extern char &R600VectorRegMergerID; | |
| void initializeR600PacketizerPass(PassRegistry &); | |
| extern char &R600PacketizerID; | |
| void initializeSIFoldOperandsPass(PassRegistry &); | |
| extern char &SIFoldOperandsID; | |
| void initializeSIPeepholeSDWAPass(PassRegistry &); | |
| extern char &SIPeepholeSDWAID; | |
| void initializeSIShrinkInstructionsPass(PassRegistry&); | |
| extern char &SIShrinkInstructionsID; | |
| void initializeSIFixSGPRCopiesPass(PassRegistry &); | |
| extern char &SIFixSGPRCopiesID; | |
| void initializeSIFixVGPRCopiesPass(PassRegistry &); | |
| extern char &SIFixVGPRCopiesID; | |
| void initializeSIFixupVectorISelPass(PassRegistry &); | |
| extern char &SIFixupVectorISelID; | |
| void initializeSILowerI1CopiesPass(PassRegistry &); | |
| extern char &SILowerI1CopiesID; | |
| void initializeSILowerSGPRSpillsPass(PassRegistry &); | |
| extern char &SILowerSGPRSpillsID; | |
| void initializeSILoadStoreOptimizerPass(PassRegistry &); | |
| extern char &SILoadStoreOptimizerID; | |
| void initializeSIWholeQuadModePass(PassRegistry &); | |
| extern char &SIWholeQuadModeID; | |
| void initializeSILowerControlFlowPass(PassRegistry &); | |
| extern char &SILowerControlFlowID; | |
| void initializeSIInsertSkipsPass(PassRegistry &); | |
| extern char &SIInsertSkipsPassID; | |
| void initializeSIOptimizeExecMaskingPass(PassRegistry &); | |
| extern char &SIOptimizeExecMaskingID; | |
| void initializeSIPreAllocateWWMRegsPass(PassRegistry &); | |
| extern char &SIPreAllocateWWMRegsID; | |
| void initializeAMDGPUSimplifyLibCallsPass(PassRegistry &); | |
| extern char &AMDGPUSimplifyLibCallsID; | |
| void initializeAMDGPUUseNativeCallsPass(PassRegistry &); | |
| extern char &AMDGPUUseNativeCallsID; | |
| void initializeSIAddIMGInitPass(PassRegistry &); | |
| extern char &SIAddIMGInitID; | |
| void initializeAMDGPUPerfHintAnalysisPass(PassRegistry &); | |
| extern char &AMDGPUPerfHintAnalysisID; | |
| // Passes common to R600 and SI | |
| FunctionPass *createAMDGPUPromoteAlloca(); | |
| void initializeAMDGPUPromoteAllocaPass(PassRegistry&); | |
| extern char &AMDGPUPromoteAllocaID; | |
| Pass *createAMDGPUStructurizeCFGPass(); | |
| FunctionPass *createAMDGPUISelDag( | |
| TargetMachine *TM = nullptr, | |
| CodeGenOpt::Level OptLevel = CodeGenOpt::Default); | |
| ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true); | |
| ModulePass *createR600OpenCLImageTypeLoweringPass(); | |
| FunctionPass *createAMDGPUAnnotateUniformValues(); | |
| ModulePass *createAMDGPUPrintfRuntimeBinding(); | |
| void initializeAMDGPUPrintfRuntimeBindingPass(PassRegistry&); | |
| extern char &AMDGPUPrintfRuntimeBindingID; | |
| ModulePass* createAMDGPUUnifyMetadataPass(); | |
| void initializeAMDGPUUnifyMetadataPass(PassRegistry&); | |
| extern char &AMDGPUUnifyMetadataID; | |
| void initializeSIOptimizeExecMaskingPreRAPass(PassRegistry&); | |
| extern char &SIOptimizeExecMaskingPreRAID; | |
| void initializeAMDGPUAnnotateUniformValuesPass(PassRegistry&); | |
| extern char &AMDGPUAnnotateUniformValuesPassID; | |
| void initializeAMDGPUCodeGenPreparePass(PassRegistry&); | |
| extern char &AMDGPUCodeGenPrepareID; | |
| void initializeSIAnnotateControlFlowPass(PassRegistry&); | |
| extern char &SIAnnotateControlFlowPassID; | |
| void initializeSIMemoryLegalizerPass(PassRegistry&); | |
| extern char &SIMemoryLegalizerID; | |
| void initializeSIModeRegisterPass(PassRegistry&); | |
| extern char &SIModeRegisterID; | |
| void initializeSIInsertWaitcntsPass(PassRegistry&); | |
| extern char &SIInsertWaitcntsID; | |
| void initializeSIFormMemoryClausesPass(PassRegistry&); | |
| extern char &SIFormMemoryClausesID; | |
| void initializeAMDGPUUnifyDivergentExitNodesPass(PassRegistry&); | |
| extern char &AMDGPUUnifyDivergentExitNodesID; | |
| ImmutablePass *createAMDGPUAAWrapperPass(); | |
| void initializeAMDGPUAAWrapperPassPass(PassRegistry&); | |
| ImmutablePass *createAMDGPUExternalAAWrapperPass(); | |
| void initializeAMDGPUExternalAAWrapperPass(PassRegistry&); | |
| void initializeAMDGPUArgumentUsageInfoPass(PassRegistry &); | |
| Pass *createAMDGPUFunctionInliningPass(); | |
| void initializeAMDGPUInlinerPass(PassRegistry&); | |
| ModulePass *createAMDGPUOpenCLEnqueuedBlockLoweringPass(); | |
| void initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(PassRegistry &); | |
| extern char &AMDGPUOpenCLEnqueuedBlockLoweringID; | |
| void initializeGCNRegBankReassignPass(PassRegistry &); | |
| extern char &GCNRegBankReassignID; | |
| void initializeGCNNSAReassignPass(PassRegistry &); | |
| extern char &GCNNSAReassignID; | |
| namespace AMDGPU { | |
| enum TargetIndex { | |
| TI_CONSTDATA_START, | |
| TI_SCRATCH_RSRC_DWORD0, | |
| TI_SCRATCH_RSRC_DWORD1, | |
| TI_SCRATCH_RSRC_DWORD2, | |
| TI_SCRATCH_RSRC_DWORD3 | |
| }; | |
| } | |
| } // End namespace llvm | |
| /// OpenCL uses address spaces to differentiate between | |
| /// various memory regions on the hardware. On the CPU | |
| /// all of the address spaces point to the same memory, | |
| /// however on the GPU, each address space points to | |
| /// a separate piece of memory that is unique from other | |
| /// memory locations. | |
| namespace AMDGPUAS { | |
| enum : unsigned { | |
| // The maximum value for flat, generic, local, private, constant and region. | |
| MAX_AMDGPU_ADDRESS = 7, | |
| FLAT_ADDRESS = 0, ///< Address space for flat memory. | |
| GLOBAL_ADDRESS = 1, ///< Address space for global memory (RAT0, VTX0). | |
| REGION_ADDRESS = 2, ///< Address space for region memory. (GDS) | |
| CONSTANT_ADDRESS = 4, ///< Address space for constant memory (VTX2). | |
| LOCAL_ADDRESS = 3, ///< Address space for local memory. | |
| PRIVATE_ADDRESS = 5, ///< Address space for private memory. | |
| CONSTANT_ADDRESS_32BIT = 6, ///< Address space for 32-bit constant memory. | |
| BUFFER_FAT_POINTER = 7, ///< Address space for 160-bit buffer fat pointers. | |
| /// Address space for direct addressible parameter memory (CONST0). | |
| PARAM_D_ADDRESS = 6, | |
| /// Address space for indirect addressible parameter memory (VTX1). | |
| PARAM_I_ADDRESS = 7, | |
| // Do not re-order the CONSTANT_BUFFER_* enums. Several places depend on | |
| // this order to be able to dynamically index a constant buffer, for | |
| // example: | |
| // | |
| // ConstantBufferAS = CONSTANT_BUFFER_0 + CBIdx | |
| CONSTANT_BUFFER_0 = 8, | |
| CONSTANT_BUFFER_1 = 9, | |
| CONSTANT_BUFFER_2 = 10, | |
| CONSTANT_BUFFER_3 = 11, | |
| CONSTANT_BUFFER_4 = 12, | |
| CONSTANT_BUFFER_5 = 13, | |
| CONSTANT_BUFFER_6 = 14, | |
| CONSTANT_BUFFER_7 = 15, | |
| CONSTANT_BUFFER_8 = 16, | |
| CONSTANT_BUFFER_9 = 17, | |
| CONSTANT_BUFFER_10 = 18, | |
| CONSTANT_BUFFER_11 = 19, | |
| CONSTANT_BUFFER_12 = 20, | |
| CONSTANT_BUFFER_13 = 21, | |
| CONSTANT_BUFFER_14 = 22, | |
| CONSTANT_BUFFER_15 = 23, | |
| // Some places use this if the address space can't be determined. | |
| UNKNOWN_ADDRESS_SPACE = ~0u, | |
| }; | |
| } | |
| #endif |