forked from OSchip/llvm-project
[ARM] Fix PR32130: Handle promotion of zero sized constants.
The special case of zero sized values was previously not handled correctly. This patch handles this by not promoting if the size is zero. Patch by Tim Neumann. Differential Revision: https://reviews.llvm.org/D31116 llvm-svn: 298320
This commit is contained in:
parent
5ba576ffe6
commit
ba789cbd3d
|
@ -3063,7 +3063,8 @@ static SDValue promoteToConstantPool(const GlobalValue *GV, SelectionDAG &DAG,
|
|||
unsigned RequiredPadding = 4 - (Size % 4);
|
||||
bool PaddingPossible =
|
||||
RequiredPadding == 4 || (CDAInit && CDAInit->isString());
|
||||
if (!PaddingPossible || Align > 4 || Size > ConstpoolPromotionMaxSize)
|
||||
if (!PaddingPossible || Align > 4 || Size > ConstpoolPromotionMaxSize ||
|
||||
Size == 0)
|
||||
return SDValue();
|
||||
|
||||
unsigned PaddedSize = Size + ((RequiredPadding == 4) ? 0 : RequiredPadding);
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
@.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
|
||||
@.zerosize = private unnamed_addr constant [0 x i16] zeroinitializer, align 4
|
||||
|
||||
; CHECK-LABEL: @test1
|
||||
; CHECK: adr r0, [[x:.*]]
|
||||
|
@ -139,6 +140,14 @@ define void @test9() #0 {
|
|||
ret void
|
||||
}
|
||||
|
||||
; Ensure that zero sized values are supported / not promoted.
|
||||
; CHECK-LABEL: @pr32130
|
||||
; CHECK-NOT: adr
|
||||
define void @pr32130() #0 {
|
||||
tail call void @c(i16* getelementptr inbounds ([0 x i16], [0 x i16]* @.zerosize, i32 0, i32 0)) #2
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test10
|
||||
; CHECK-V6M: adr r{{[0-9]*}}, [[x:.*]]
|
||||
; CHECK-V6M: [[x]]:
|
||||
|
|
Loading…
Reference in New Issue