From: James Molloy Date: Thu, 6 Oct 2016 07:56:00 +0000 (+0000) Subject: [ARM] Constant pool promotion - fix alignment calculation X-Git-Tag: android-x86-7.1-r4~26180 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3747be0f9d00f31cc1bdaeecc82f09ed266fe61f;p=android-x86%2Fexternal-llvm.git [ARM] Constant pool promotion - fix alignment calculation Global variables are GlobalValues, so they have explicit alignment. Querying DataLayout for the alignment was incorrect. Testcase added. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283423 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 234c3f59858..0e36ea89c5e 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -3084,7 +3084,7 @@ static SDValue promoteToConstantPool(const GlobalValue *GV, SelectionDAG &DAG, // that are strings for simplicity. auto *CDAInit = dyn_cast(Init); unsigned Size = DAG.getDataLayout().getTypeAllocSize(Init->getType()); - unsigned Align = DAG.getDataLayout().getABITypeAlignment(Init->getType()); + unsigned Align = GVar->getAlignment(); unsigned RequiredPadding = 4 - (Size % 4); bool PaddingPossible = RequiredPadding == 4 || (CDAInit && CDAInit->isString()); diff --git a/test/CodeGen/ARM/constantpool-promote.ll b/test/CodeGen/ARM/constantpool-promote.ll index c70f08cff17..fb1bdfd62fb 100644 --- a/test/CodeGen/ARM/constantpool-promote.ll +++ b/test/CodeGen/ARM/constantpool-promote.ll @@ -15,6 +15,7 @@ target triple = "armv7--linux-gnueabihf" @.arr2 = private unnamed_addr constant [2 x i16] [i16 7, i16 8], align 2 @.arr3 = private unnamed_addr constant [2 x i16*] [i16* null, i16* null], align 4 @.ptr = private unnamed_addr constant [2 x i16*] [i16* getelementptr inbounds ([2 x i16], [2 x i16]* @.arr2, i32 0, i32 0), i16* null], align 2 +@.arr4 = private unnamed_addr constant [2 x i16] [i16 3, i16 4], align 16 ; CHECK-LABEL: @test1 ; CHECK: adr r0, [[x:.*]] @@ -125,6 +126,15 @@ entry: ret void } +; This shouldn't be promoted, as the global requires >4 byte alignment. +; CHECK-LABEL: @test9 +; CHECK-NOT: adr +define void @test9() #0 { + tail call void @c(i16* getelementptr inbounds ([2 x i16], [2 x i16]* @.arr4, i32 0, i32 0)) #2 + ret void +} + + declare void @b(i8*) #1 declare void @c(i16*) #1 declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i32, i1)