From 964b70d559fad083744ea2791def82c564087388 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 22 Feb 2016 22:23:11 +0000 Subject: [PATCH] [X86] Create mergeable constant pool entries for AVX We supported creating mergeable constant pool entries for smaller constants but not for 32-byte AVX constants. llvm-svn: 261584 --- llvm/include/llvm/MC/MCObjectFileInfo.h | 4 ++++ llvm/include/llvm/MC/SectionKind.h | 8 +++++++- llvm/lib/CodeGen/MachineFunction.cpp | 2 ++ llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 8 ++++++-- llvm/lib/MC/MCObjectFileInfo.cpp | 4 ++++ llvm/lib/Target/TargetLoweringObjectFile.cpp | 1 + llvm/lib/Target/X86/X86TargetObjectFile.cpp | 5 +++++ llvm/test/CodeGen/X86/global-sections.ll | 11 +++++++++++ llvm/test/CodeGen/X86/win_cst_pool.ll | 16 +++++++++++++++- 9 files changed, 55 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/MC/MCObjectFileInfo.h b/llvm/include/llvm/MC/MCObjectFileInfo.h index f8346f2..d0e34e6 100644 --- a/llvm/include/llvm/MC/MCObjectFileInfo.h +++ b/llvm/include/llvm/MC/MCObjectFileInfo.h @@ -159,6 +159,7 @@ protected: MCSection *MergeableConst4Section; MCSection *MergeableConst8Section; MCSection *MergeableConst16Section; + MCSection *MergeableConst32Section; // MachO specific sections. @@ -298,6 +299,9 @@ public: const MCSection *getMergeableConst16Section() const { return MergeableConst16Section; } + const MCSection *getMergeableConst32Section() const { + return MergeableConst32Section; + } // MachO specific sections. const MCSection *getTLSTLVSection() const { return TLSTLVSection; } diff --git a/llvm/include/llvm/MC/SectionKind.h b/llvm/include/llvm/MC/SectionKind.h index b09b93c..02fb226 100644 --- a/llvm/include/llvm/MC/SectionKind.h +++ b/llvm/include/llvm/MC/SectionKind.h @@ -63,6 +63,10 @@ class SectionKind { /// for example, vectors. MergeableConst16, + /// MergeableConst32 - This is a section used by 32-byte constants, + /// for example, vectors. + MergeableConst32, + /// Writeable - This is the base of all segments that need to be written /// to during program runtime. @@ -125,11 +129,12 @@ public: bool isMergeableConst() const { return K == MergeableConst4 || K == MergeableConst8 || - K == MergeableConst16; + K == MergeableConst16 || K == MergeableConst32; } bool isMergeableConst4() const { return K == MergeableConst4; } bool isMergeableConst8() const { return K == MergeableConst8; } bool isMergeableConst16() const { return K == MergeableConst16; } + bool isMergeableConst32() const { return K == MergeableConst32; } bool isWriteable() const { return isThreadLocal() || isGlobalWriteableData(); @@ -180,6 +185,7 @@ public: static SectionKind getMergeableConst4() { return get(MergeableConst4); } static SectionKind getMergeableConst8() { return get(MergeableConst8); } static SectionKind getMergeableConst16() { return get(MergeableConst16); } + static SectionKind getMergeableConst32() { return get(MergeableConst32); } static SectionKind getThreadBSS() { return get(ThreadBSS); } static SectionKind getThreadData() { return get(ThreadData); } static SectionKind getBSS() { return get(BSS); } diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index a282350..e93299f 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -852,6 +852,8 @@ MachineConstantPoolEntry::getSectionKind(const DataLayout *DL) const { return SectionKind::getMergeableConst8(); case 16: return SectionKind::getMergeableConst16(); + case 32: + return SectionKind::getMergeableConst32(); default: return SectionKind::getReadOnly(); } diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 624eaec..4229741 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -270,9 +270,11 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV, EntrySize = 4; } else if (Kind.isMergeableConst8()) { EntrySize = 8; - } else { - assert(Kind.isMergeableConst16() && "unknown data width"); + } else if (Kind.isMergeableConst16()) { EntrySize = 16; + } else { + assert(Kind.isMergeableConst32() && "unknown data width"); + EntrySize = 32; } } @@ -375,6 +377,8 @@ MCSection *TargetLoweringObjectFileELF::getSectionForConstant( return MergeableConst8Section; if (Kind.isMergeableConst16() && MergeableConst16Section) return MergeableConst16Section; + if (Kind.isMergeableConst32() && MergeableConst32Section) + return MergeableConst32Section; if (Kind.isReadOnly()) return ReadOnlySection; diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp index a3f9937..2948f69 100644 --- a/llvm/lib/MC/MCObjectFileInfo.cpp +++ b/llvm/lib/MC/MCObjectFileInfo.cpp @@ -469,6 +469,10 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(Triple T) { Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, ELF::SHF_ALLOC | ELF::SHF_MERGE, 16, ""); + MergeableConst32Section = + Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS, + ELF::SHF_ALLOC | ELF::SHF_MERGE, 32, ""); + StaticCtorSection = Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS, ELF::SHF_ALLOC | ELF::SHF_WRITE); diff --git a/llvm/lib/Target/TargetLoweringObjectFile.cpp b/llvm/lib/Target/TargetLoweringObjectFile.cpp index 3c04a21..4169237 100644 --- a/llvm/lib/Target/TargetLoweringObjectFile.cpp +++ b/llvm/lib/Target/TargetLoweringObjectFile.cpp @@ -202,6 +202,7 @@ SectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, case 4: return SectionKind::getMergeableConst4(); case 8: return SectionKind::getMergeableConst8(); case 16: return SectionKind::getMergeableConst16(); + case 32: return SectionKind::getMergeableConst32(); default: return SectionKind::getReadOnly(); } diff --git a/llvm/lib/Target/X86/X86TargetObjectFile.cpp b/llvm/lib/Target/X86/X86TargetObjectFile.cpp index 0d37fcd..e72f3a7 100644 --- a/llvm/lib/Target/X86/X86TargetObjectFile.cpp +++ b/llvm/lib/Target/X86/X86TargetObjectFile.cpp @@ -176,6 +176,11 @@ MCSection *X86WindowsTargetObjectFile::getSectionForConstant( COMDATSymName = "__xmm@" + scalarConstantToHexString(C); Align = 16; } + } else if (Kind.isMergeableConst32()) { + if (Align <= 32) { + COMDATSymName = "__ymm@" + scalarConstantToHexString(C); + Align = 32; + } } if (!COMDATSymName.empty()) diff --git a/llvm/test/CodeGen/X86/global-sections.ll b/llvm/test/CodeGen/X86/global-sections.ll index a18b662..1401218 100644 --- a/llvm/test/CodeGen/X86/global-sections.ll +++ b/llvm/test/CodeGen/X86/global-sections.ll @@ -298,3 +298,14 @@ bb7: ; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G15 ; WIN32-SECTIONS: _G15: + +@G16 = unnamed_addr constant i256 0 + +; LINUX: .section .rodata.cst32,"aM",@progbits,32 +; LINUX: G16: + +; LINUX-SECTIONS: .section .rodata.cst32,"aM",@progbits,32 +; LINUX-SECTIONS: G16: + +; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G16 +; WIN32-SECTIONS: _G16: diff --git a/llvm/test/CodeGen/X86/win_cst_pool.ll b/llvm/test/CodeGen/X86/win_cst_pool.ll index 2856a08..a674d8c 100644 --- a/llvm/test/CodeGen/X86/win_cst_pool.ll +++ b/llvm/test/CodeGen/X86/win_cst_pool.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -mtriple=x86_64-win32 -mattr=sse2 | FileCheck %s +; RUN: llc < %s -mtriple=x86_64-win32 -mattr=sse2 -mattr=avx | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-windows-msvc" @@ -77,3 +77,17 @@ define float @pr23966(i32 %a) { ; CHECK-NEXT: __real@bf8000003f800000: ; CHECK-NEXT: .long 1065353216 ; CHECK-NEXT: .long 3212836864 + +define <4 x i64> @ymm() { +entry: + ret <4 x i64> +} + +; CHECK: .globl __ymm@0000000400000003000000020000000100000004000000030000000200000001 +; CHECK: .section .rdata,"dr",discard,__ymm@0000000400000003000000020000000100000004000000030000000200000001 +; CHECK: .p2align 5 +; CHECK: __ymm@0000000400000003000000020000000100000004000000030000000200000001: +; CHECK: .quad 8589934593 # 0x200000001 +; CHECK: .quad 17179869187 # 0x400000003 +; CHECK: .quad 8589934593 # 0x200000001 +; CHECK: .quad 17179869187 -- 2.7.4