forked from OSchip/llvm-project
[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. llvm-svn: 283423
This commit is contained in:
parent
78561c4917
commit
6215fad0e9
|
@ -3084,7 +3084,7 @@ static SDValue promoteToConstantPool(const GlobalValue *GV, SelectionDAG &DAG,
|
||||||
// that are strings for simplicity.
|
// that are strings for simplicity.
|
||||||
auto *CDAInit = dyn_cast<ConstantDataArray>(Init);
|
auto *CDAInit = dyn_cast<ConstantDataArray>(Init);
|
||||||
unsigned Size = DAG.getDataLayout().getTypeAllocSize(Init->getType());
|
unsigned Size = DAG.getDataLayout().getTypeAllocSize(Init->getType());
|
||||||
unsigned Align = DAG.getDataLayout().getABITypeAlignment(Init->getType());
|
unsigned Align = GVar->getAlignment();
|
||||||
unsigned RequiredPadding = 4 - (Size % 4);
|
unsigned RequiredPadding = 4 - (Size % 4);
|
||||||
bool PaddingPossible =
|
bool PaddingPossible =
|
||||||
RequiredPadding == 4 || (CDAInit && CDAInit->isString());
|
RequiredPadding == 4 || (CDAInit && CDAInit->isString());
|
||||||
|
|
|
@ -15,6 +15,7 @@ target triple = "armv7--linux-gnueabihf"
|
||||||
@.arr2 = private unnamed_addr constant [2 x i16] [i16 7, i16 8], align 2
|
@.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
|
@.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
|
@.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-LABEL: @test1
|
||||||
; CHECK: adr r0, [[x:.*]]
|
; CHECK: adr r0, [[x:.*]]
|
||||||
|
@ -125,6 +126,15 @@ entry:
|
||||||
ret void
|
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 @b(i8*) #1
|
||||||
declare void @c(i16*) #1
|
declare void @c(i16*) #1
|
||||||
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i32, i1)
|
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i32, i1)
|
||||||
|
|
Loading…
Reference in New Issue