152ef4019SMatt Arsenault //===-- AMDGPUMachineFunctionInfo.cpp ---------------------------------------=// 252ef4019SMatt Arsenault // 352ef4019SMatt Arsenault // The LLVM Compiler Infrastructure 452ef4019SMatt Arsenault // 552ef4019SMatt Arsenault // This file is distributed under the University of Illinois Open Source 652ef4019SMatt Arsenault // License. See LICENSE.TXT for details. 752ef4019SMatt Arsenault // 852ef4019SMatt Arsenault //===----------------------------------------------------------------------===// 952ef4019SMatt Arsenault 1045bb48eaSTom Stellard #include "AMDGPUMachineFunction.h" 1152ef4019SMatt Arsenault #include "AMDGPUSubtarget.h" 12*1c538423SStanislav Mekhanoshin #include "AMDGPUPerfHintAnalysis.h" 13*1c538423SStanislav Mekhanoshin #include "llvm/CodeGen/MachineModuleInfo.h" 14e935f05aSMatt Arsenault 1545bb48eaSTom Stellard using namespace llvm; 1645bb48eaSTom Stellard 1745bb48eaSTom Stellard AMDGPUMachineFunction::AMDGPUMachineFunction(const MachineFunction &MF) : 1845bb48eaSTom Stellard MachineFunctionInfo(), 1952ef4019SMatt Arsenault LocalMemoryObjects(), 20e935f05aSMatt Arsenault KernArgSize(0), 21e935f05aSMatt Arsenault MaxKernArgAlign(0), 2245bb48eaSTom Stellard LDSSize(0), 23e928533dSTom Stellard ABIArgOffset(0), 24f1caa283SMatthias Braun IsEntryFunction(AMDGPU::isEntryFunctionCC(MF.getFunction().getCallingConv())), 25*1c538423SStanislav Mekhanoshin NoSignedZerosFPMath(MF.getTarget().Options.NoSignedZerosFPMath), 26*1c538423SStanislav Mekhanoshin MemoryBound(false), 27*1c538423SStanislav Mekhanoshin WaveLimiter(false) { 2852ef4019SMatt Arsenault // FIXME: Should initialize KernArgSize based on ExplicitKernelArgOffset, 2952ef4019SMatt Arsenault // except reserved size is not correctly aligned. 30*1c538423SStanislav Mekhanoshin 31*1c538423SStanislav Mekhanoshin if (auto *Resolver = MF.getMMI().getResolver()) { 32*1c538423SStanislav Mekhanoshin if (AMDGPUPerfHintAnalysis *PHA = static_cast<AMDGPUPerfHintAnalysis*>( 33*1c538423SStanislav Mekhanoshin Resolver->getAnalysisIfAvailable(&AMDGPUPerfHintAnalysisID, true))) { 34*1c538423SStanislav Mekhanoshin MemoryBound = PHA->isMemoryBound(&MF.getFunction()); 35*1c538423SStanislav Mekhanoshin WaveLimiter = PHA->needsWaveLimiter(&MF.getFunction()); 36*1c538423SStanislav Mekhanoshin } 37*1c538423SStanislav Mekhanoshin } 38beb24f5bSNikolay Haustov } 39beb24f5bSNikolay Haustov 4052ef4019SMatt Arsenault unsigned AMDGPUMachineFunction::allocateLDSGlobal(const DataLayout &DL, 4152ef4019SMatt Arsenault const GlobalValue &GV) { 4252ef4019SMatt Arsenault auto Entry = LocalMemoryObjects.insert(std::make_pair(&GV, 0)); 4352ef4019SMatt Arsenault if (!Entry.second) 4452ef4019SMatt Arsenault return Entry.first->second; 4552ef4019SMatt Arsenault 4652ef4019SMatt Arsenault unsigned Align = GV.getAlignment(); 4752ef4019SMatt Arsenault if (Align == 0) 4852ef4019SMatt Arsenault Align = DL.getABITypeAlignment(GV.getValueType()); 4952ef4019SMatt Arsenault 5052ef4019SMatt Arsenault /// TODO: We should sort these to minimize wasted space due to alignment 5152ef4019SMatt Arsenault /// padding. Currently the padding is decided by the first encountered use 5252ef4019SMatt Arsenault /// during lowering. 5352ef4019SMatt Arsenault unsigned Offset = LDSSize = alignTo(LDSSize, Align); 5452ef4019SMatt Arsenault 5552ef4019SMatt Arsenault Entry.first->second = Offset; 5652ef4019SMatt Arsenault LDSSize += DL.getTypeAllocSize(GV.getValueType()); 5752ef4019SMatt Arsenault 5852ef4019SMatt Arsenault return Offset; 59beb24f5bSNikolay Haustov } 60