
We have too many mechanisms for tracking the various offsets used for kernel arguments, so remove one. There's still a lot of confusion with these because there are two different "implicit" argument areas located at the beginning and end of the kernarg segment. Additionally, the offset was determined based on the memory size of the split element types. This would break in a future commit where v3i32 is decomposed into separate i32 pieces. llvm-svn: 335830
59 lines
2.0 KiB
C++
59 lines
2.0 KiB
C++
//===-- AMDGPUMachineFunctionInfo.cpp ---------------------------------------=//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "AMDGPUMachineFunction.h"
|
|
#include "AMDGPUSubtarget.h"
|
|
#include "AMDGPUPerfHintAnalysis.h"
|
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
|
|
|
using namespace llvm;
|
|
|
|
AMDGPUMachineFunction::AMDGPUMachineFunction(const MachineFunction &MF) :
|
|
MachineFunctionInfo(),
|
|
LocalMemoryObjects(),
|
|
ExplicitKernArgSize(0),
|
|
MaxKernArgAlign(0),
|
|
LDSSize(0),
|
|
IsEntryFunction(AMDGPU::isEntryFunctionCC(MF.getFunction().getCallingConv())),
|
|
NoSignedZerosFPMath(MF.getTarget().Options.NoSignedZerosFPMath),
|
|
MemoryBound(false),
|
|
WaveLimiter(false) {
|
|
// FIXME: Should initialize KernArgSize based on ExplicitKernelArgOffset,
|
|
// except reserved size is not correctly aligned.
|
|
|
|
if (auto *Resolver = MF.getMMI().getResolver()) {
|
|
if (AMDGPUPerfHintAnalysis *PHA = static_cast<AMDGPUPerfHintAnalysis*>(
|
|
Resolver->getAnalysisIfAvailable(&AMDGPUPerfHintAnalysisID, true))) {
|
|
MemoryBound = PHA->isMemoryBound(&MF.getFunction());
|
|
WaveLimiter = PHA->needsWaveLimiter(&MF.getFunction());
|
|
}
|
|
}
|
|
}
|
|
|
|
unsigned AMDGPUMachineFunction::allocateLDSGlobal(const DataLayout &DL,
|
|
const GlobalValue &GV) {
|
|
auto Entry = LocalMemoryObjects.insert(std::make_pair(&GV, 0));
|
|
if (!Entry.second)
|
|
return Entry.first->second;
|
|
|
|
unsigned Align = GV.getAlignment();
|
|
if (Align == 0)
|
|
Align = DL.getABITypeAlignment(GV.getValueType());
|
|
|
|
/// TODO: We should sort these to minimize wasted space due to alignment
|
|
/// padding. Currently the padding is decided by the first encountered use
|
|
/// during lowering.
|
|
unsigned Offset = LDSSize = alignTo(LDSSize, Align);
|
|
|
|
Entry.first->second = Offset;
|
|
LDSSize += DL.getTypeAllocSize(GV.getValueType());
|
|
|
|
return Offset;
|
|
}
|