1*9880d681SAndroid Build Coastguard Worker //===-- AMDGPU.h - MachineFunction passes hw codegen --------------*- C++ -*-=// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker /// \file 9*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPU_H 12*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AMDGPU_AMDGPU_H 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h" 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker namespace llvm { 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker class AMDGPUInstrPrinter; 20*9880d681SAndroid Build Coastguard Worker class AMDGPUSubtarget; 21*9880d681SAndroid Build Coastguard Worker class AMDGPUTargetMachine; 22*9880d681SAndroid Build Coastguard Worker class FunctionPass; 23*9880d681SAndroid Build Coastguard Worker struct MachineSchedContext; 24*9880d681SAndroid Build Coastguard Worker class MCAsmInfo; 25*9880d681SAndroid Build Coastguard Worker class raw_ostream; 26*9880d681SAndroid Build Coastguard Worker class ScheduleDAGInstrs; 27*9880d681SAndroid Build Coastguard Worker class Target; 28*9880d681SAndroid Build Coastguard Worker class TargetMachine; 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker // R600 Passes 31*9880d681SAndroid Build Coastguard Worker FunctionPass *createR600VectorRegMerger(TargetMachine &tm); 32*9880d681SAndroid Build Coastguard Worker FunctionPass *createR600ExpandSpecialInstrsPass(TargetMachine &tm); 33*9880d681SAndroid Build Coastguard Worker FunctionPass *createR600EmitClauseMarkers(); 34*9880d681SAndroid Build Coastguard Worker FunctionPass *createR600ClauseMergePass(TargetMachine &tm); 35*9880d681SAndroid Build Coastguard Worker FunctionPass *createR600Packetizer(TargetMachine &tm); 36*9880d681SAndroid Build Coastguard Worker FunctionPass *createR600ControlFlowFinalizer(TargetMachine &tm); 37*9880d681SAndroid Build Coastguard Worker FunctionPass *createAMDGPUCFGStructurizerPass(); 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker // SI Passes 40*9880d681SAndroid Build Coastguard Worker FunctionPass *createSITypeRewriter(); 41*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIAnnotateControlFlowPass(); 42*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIFoldOperandsPass(); 43*9880d681SAndroid Build Coastguard Worker FunctionPass *createSILowerI1CopiesPass(); 44*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIShrinkInstructionsPass(); 45*9880d681SAndroid Build Coastguard Worker FunctionPass *createSILoadStoreOptimizerPass(TargetMachine &tm); 46*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIWholeQuadModePass(); 47*9880d681SAndroid Build Coastguard Worker FunctionPass *createSILowerControlFlowPass(); 48*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIFixControlFlowLiveIntervalsPass(); 49*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIFixSGPRCopiesPass(); 50*9880d681SAndroid Build Coastguard Worker FunctionPass *createSICodeEmitterPass(formatted_raw_ostream &OS); 51*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIDebuggerInsertNopsPass(); 52*9880d681SAndroid Build Coastguard Worker FunctionPass *createSIInsertWaitsPass(); 53*9880d681SAndroid Build Coastguard Worker FunctionPass *createAMDGPUCodeGenPreparePass(const TargetMachine *TM = nullptr); 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker ScheduleDAGInstrs *createSIMachineScheduler(MachineSchedContext *C); 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker ModulePass *createAMDGPUAnnotateKernelFeaturesPass(); 58*9880d681SAndroid Build Coastguard Worker void initializeAMDGPUAnnotateKernelFeaturesPass(PassRegistry &); 59*9880d681SAndroid Build Coastguard Worker extern char &AMDGPUAnnotateKernelFeaturesID; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker void initializeSIFoldOperandsPass(PassRegistry &); 62*9880d681SAndroid Build Coastguard Worker extern char &SIFoldOperandsID; 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker void initializeSIShrinkInstructionsPass(PassRegistry&); 65*9880d681SAndroid Build Coastguard Worker extern char &SIShrinkInstructionsID; 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker void initializeSIFixSGPRCopiesPass(PassRegistry &); 68*9880d681SAndroid Build Coastguard Worker extern char &SIFixSGPRCopiesID; 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker void initializeSILowerI1CopiesPass(PassRegistry &); 71*9880d681SAndroid Build Coastguard Worker extern char &SILowerI1CopiesID; 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker void initializeSILoadStoreOptimizerPass(PassRegistry &); 74*9880d681SAndroid Build Coastguard Worker extern char &SILoadStoreOptimizerID; 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker void initializeSIWholeQuadModePass(PassRegistry &); 77*9880d681SAndroid Build Coastguard Worker extern char &SIWholeQuadModeID; 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker void initializeSILowerControlFlowPass(PassRegistry &); 80*9880d681SAndroid Build Coastguard Worker extern char &SILowerControlFlowPassID; 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker // Passes common to R600 and SI 84*9880d681SAndroid Build Coastguard Worker FunctionPass *createAMDGPUPromoteAlloca(const TargetMachine *TM = nullptr); 85*9880d681SAndroid Build Coastguard Worker void initializeAMDGPUPromoteAllocaPass(PassRegistry&); 86*9880d681SAndroid Build Coastguard Worker extern char &AMDGPUPromoteAllocaID; 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker FunctionPass *createAMDGPUAddDivergenceMetadata(const AMDGPUSubtarget &ST); 89*9880d681SAndroid Build Coastguard Worker Pass *createAMDGPUStructurizeCFGPass(); 90*9880d681SAndroid Build Coastguard Worker FunctionPass *createAMDGPUISelDag(TargetMachine &tm); 91*9880d681SAndroid Build Coastguard Worker ModulePass *createAMDGPUAlwaysInlinePass(); 92*9880d681SAndroid Build Coastguard Worker ModulePass *createAMDGPUOpenCLImageTypeLoweringPass(); 93*9880d681SAndroid Build Coastguard Worker FunctionPass *createAMDGPUAnnotateUniformValues(); 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker void initializeSIFixControlFlowLiveIntervalsPass(PassRegistry&); 96*9880d681SAndroid Build Coastguard Worker extern char &SIFixControlFlowLiveIntervalsID; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker void initializeAMDGPUAnnotateUniformValuesPass(PassRegistry&); 99*9880d681SAndroid Build Coastguard Worker extern char &AMDGPUAnnotateUniformValuesPassID; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker void initializeAMDGPUCodeGenPreparePass(PassRegistry&); 102*9880d681SAndroid Build Coastguard Worker extern char &AMDGPUCodeGenPrepareID; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker void initializeSIAnnotateControlFlowPass(PassRegistry&); 105*9880d681SAndroid Build Coastguard Worker extern char &SIAnnotateControlFlowPassID; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker void initializeSIDebuggerInsertNopsPass(PassRegistry&); 108*9880d681SAndroid Build Coastguard Worker extern char &SIDebuggerInsertNopsID; 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker void initializeSIInsertWaitsPass(PassRegistry&); 111*9880d681SAndroid Build Coastguard Worker extern char &SIInsertWaitsID; 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker extern Target TheAMDGPUTarget; 114*9880d681SAndroid Build Coastguard Worker extern Target TheGCNTarget; 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker namespace AMDGPU { 117*9880d681SAndroid Build Coastguard Worker enum TargetIndex { 118*9880d681SAndroid Build Coastguard Worker TI_CONSTDATA_START, 119*9880d681SAndroid Build Coastguard Worker TI_SCRATCH_RSRC_DWORD0, 120*9880d681SAndroid Build Coastguard Worker TI_SCRATCH_RSRC_DWORD1, 121*9880d681SAndroid Build Coastguard Worker TI_SCRATCH_RSRC_DWORD2, 122*9880d681SAndroid Build Coastguard Worker TI_SCRATCH_RSRC_DWORD3 123*9880d681SAndroid Build Coastguard Worker }; 124*9880d681SAndroid Build Coastguard Worker } 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker } // End namespace llvm 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker /// OpenCL uses address spaces to differentiate between 129*9880d681SAndroid Build Coastguard Worker /// various memory regions on the hardware. On the CPU 130*9880d681SAndroid Build Coastguard Worker /// all of the address spaces point to the same memory, 131*9880d681SAndroid Build Coastguard Worker /// however on the GPU, each address space points to 132*9880d681SAndroid Build Coastguard Worker /// a separate piece of memory that is unique from other 133*9880d681SAndroid Build Coastguard Worker /// memory locations. 134*9880d681SAndroid Build Coastguard Worker namespace AMDGPUAS { 135*9880d681SAndroid Build Coastguard Worker enum AddressSpaces : unsigned { 136*9880d681SAndroid Build Coastguard Worker PRIVATE_ADDRESS = 0, ///< Address space for private memory. 137*9880d681SAndroid Build Coastguard Worker GLOBAL_ADDRESS = 1, ///< Address space for global memory (RAT0, VTX0). 138*9880d681SAndroid Build Coastguard Worker CONSTANT_ADDRESS = 2, ///< Address space for constant memory (VTX2) 139*9880d681SAndroid Build Coastguard Worker LOCAL_ADDRESS = 3, ///< Address space for local memory. 140*9880d681SAndroid Build Coastguard Worker FLAT_ADDRESS = 4, ///< Address space for flat memory. 141*9880d681SAndroid Build Coastguard Worker REGION_ADDRESS = 5, ///< Address space for region memory. 142*9880d681SAndroid Build Coastguard Worker PARAM_D_ADDRESS = 6, ///< Address space for direct addressible parameter memory (CONST0) 143*9880d681SAndroid Build Coastguard Worker PARAM_I_ADDRESS = 7, ///< Address space for indirect addressible parameter memory (VTX1) 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker // Do not re-order the CONSTANT_BUFFER_* enums. Several places depend on this 146*9880d681SAndroid Build Coastguard Worker // order to be able to dynamically index a constant buffer, for example: 147*9880d681SAndroid Build Coastguard Worker // 148*9880d681SAndroid Build Coastguard Worker // ConstantBufferAS = CONSTANT_BUFFER_0 + CBIdx 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_0 = 8, 151*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_1 = 9, 152*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_2 = 10, 153*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_3 = 11, 154*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_4 = 12, 155*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_5 = 13, 156*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_6 = 14, 157*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_7 = 15, 158*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_8 = 16, 159*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_9 = 17, 160*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_10 = 18, 161*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_11 = 19, 162*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_12 = 20, 163*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_13 = 21, 164*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_14 = 22, 165*9880d681SAndroid Build Coastguard Worker CONSTANT_BUFFER_15 = 23, 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker // Some places use this if the address space can't be determined. 168*9880d681SAndroid Build Coastguard Worker UNKNOWN_ADDRESS_SPACE = ~0u 169*9880d681SAndroid Build Coastguard Worker }; 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker } // namespace AMDGPUAS 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker #endif 174