From: Tom Stellard Date: Wed, 2 Dec 2015 17:00:42 +0000 (+0000) Subject: AMDGPU/SI: Don't emit group segment global variables X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=26ecf8e5acc30aee067dc759723a33ec24858485;p=oota-llvm.git AMDGPU/SI: Don't emit group segment global variables Summary: Only global or readonly segment variables should appear in object files. Reviewers: arsenm Subscribers: arsenm, llvm-commits Differential Revision: http://reviews.llvm.org/D15111 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254519 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp index 87a0cf20d17..84c71e0cc9c 100644 --- a/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -123,6 +123,13 @@ void AMDGPUAsmPrinter::EmitFunctionEntryLabel() { AsmPrinter::EmitFunctionEntryLabel(); } +void AMDGPUAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { + + if (TM.getTargetTriple().getOS() != Triple::AMDHSA || + !AMDGPU::isGroupSegment(GV)) + return AsmPrinter::EmitGlobalVariable(GV); +} + bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) { // The starting address of all shader programs must be 256 bytes aligned. diff --git a/lib/Target/AMDGPU/AMDGPUAsmPrinter.h b/lib/Target/AMDGPU/AMDGPUAsmPrinter.h index 687f239ecab..1aaef00a4dd 100644 --- a/lib/Target/AMDGPU/AMDGPUAsmPrinter.h +++ b/lib/Target/AMDGPU/AMDGPUAsmPrinter.h @@ -103,6 +103,8 @@ public: void EmitFunctionEntryLabel() override; + void EmitGlobalVariable(const GlobalVariable *GV) override; + bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &O) override; diff --git a/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp b/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp index e70f79d5a7b..81ade517254 100644 --- a/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp +++ b/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// #include "AMDGPUBaseInfo.h" +#include "AMDGPU.h" +#include "llvm/IR/GlobalValue.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSectionELF.h" #include "llvm/MC/SubtargetFeature.h" @@ -66,5 +68,9 @@ MCSection *getHSATextSection(MCContext &Ctx) { ELF::SHF_AMDGPU_HSA_CODE); } +bool isGroupSegment(const GlobalValue *GV) { + return GV->getType()->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS; +} + } // End namespace AMDGPU } // End namespace llvm diff --git a/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h b/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h index 59a32a6b592..bf9377ed86c 100644 --- a/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h +++ b/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h @@ -15,6 +15,7 @@ namespace llvm { class FeatureBitset; +class GlobalValue; class MCContext; class MCSection; @@ -31,6 +32,8 @@ void initDefaultAMDKernelCodeT(amd_kernel_code_t &Header, const FeatureBitset &Features); MCSection *getHSATextSection(MCContext &Ctx); +bool isGroupSegment(const GlobalValue *GV); + } // end namespace AMDGPU } // end namespace llvm diff --git a/test/CodeGen/AMDGPU/hsa-group-segment.ll b/test/CodeGen/AMDGPU/hsa-group-segment.ll new file mode 100644 index 00000000000..1999dc38a6b --- /dev/null +++ b/test/CodeGen/AMDGPU/hsa-group-segment.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -mtriple=amdgcn--amdhsa -mcpu=kaveri | FileCheck --check-prefix=HSA %s + +@internal_group = internal addrspace(3) global i32 undef +@external_group = addrspace(3) global i32 undef + +define void @test() { +entry: + store i32 0, i32 addrspace(3)* @internal_group + store i32 0, i32 addrspace(3)* @external_group + ret void +} + +; HSA-NOT: internal_group: +; HSA-NOT: external_group: