forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- AMDGPUMachineFunctionInfo.cpp ---------------------------------------=//
 | 
						|
//
 | 
						|
// 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
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#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),
 | 
						|
  LDSSize(0),
 | 
						|
  Mode(MF.getFunction(), MF.getSubtarget<GCNSubtarget>()),
 | 
						|
  IsEntryFunction(AMDGPU::isEntryFunctionCC(MF.getFunction().getCallingConv())),
 | 
						|
  NoSignedZerosFPMath(MF.getTarget().Options.NoSignedZerosFPMath),
 | 
						|
  MemoryBound(false),
 | 
						|
  WaveLimiter(false) {
 | 
						|
  const AMDGPUSubtarget &ST = AMDGPUSubtarget::get(MF);
 | 
						|
 | 
						|
  // FIXME: Should initialize KernArgSize based on ExplicitKernelArgOffset,
 | 
						|
  // except reserved size is not correctly aligned.
 | 
						|
  const Function &F = MF.getFunction();
 | 
						|
 | 
						|
  Attribute MemBoundAttr = F.getFnAttribute("amdgpu-memory-bound");
 | 
						|
  MemoryBound = MemBoundAttr.isStringAttribute() &&
 | 
						|
                MemBoundAttr.getValueAsString() == "true";
 | 
						|
 | 
						|
  Attribute WaveLimitAttr = F.getFnAttribute("amdgpu-wave-limiter");
 | 
						|
  WaveLimiter = WaveLimitAttr.isStringAttribute() &&
 | 
						|
                WaveLimitAttr.getValueAsString() == "true";
 | 
						|
 | 
						|
  CallingConv::ID CC = F.getCallingConv();
 | 
						|
  if (CC == CallingConv::AMDGPU_KERNEL || CC == CallingConv::SPIR_KERNEL)
 | 
						|
    ExplicitKernArgSize = ST.getExplicitKernArgSize(F, MaxKernArgAlign);
 | 
						|
}
 | 
						|
 | 
						|
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;
 | 
						|
}
 |