forked from OSchip/llvm-project
[IRTranslator] Use the alloc size instead of the store size when translating allocas
We use to incorrectly use the store size instead of the alloc size when creating the stack slot for allocas. On aarch64 this can be demonstrated by allocating weirdly sized types. For instance, in the added test case, we use an alloca for i19. We used to allocate a slot of size 24-bit (19 rounded up to the next byte), whereas we really want to use a full 32-bit slot for this type. llvm-svn: 359856
This commit is contained in:
parent
7238353848
commit
c9256cc6ba
|
@ -219,7 +219,7 @@ int IRTranslator::getOrCreateFrameIndex(const AllocaInst &AI) {
|
|||
if (FrameIndices.find(&AI) != FrameIndices.end())
|
||||
return FrameIndices[&AI];
|
||||
|
||||
unsigned ElementSize = DL->getTypeStoreSize(AI.getAllocatedType());
|
||||
unsigned ElementSize = DL->getTypeAllocSize(AI.getAllocatedType());
|
||||
unsigned Size =
|
||||
ElementSize * cast<ConstantInt>(AI.getArraySize())->getZExtValue();
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
; RUN: llc -global-isel -stop-after irtranslator -mtriple aarch64-apple-ios %s -o - | FileCheck %s
|
||||
|
||||
; We use to incorrectly use the store size instead of the alloc size when
|
||||
; creating the stack slot for allocas. This shows on aarch64 only when
|
||||
; we allocated weirdly sized type. For instance, in that case, we used
|
||||
; to allocate a slot of size 24-bit (19 rounded up to the next byte),
|
||||
; whereas we really want to use a full 32-bit slot for this type.
|
||||
; CHECK-LABEL: foo
|
||||
; Check that the stack slot is 4-byte wide instead of the previously
|
||||
; wrongly 3-byte sized slot.
|
||||
; CHECK: stack:
|
||||
; CHECK-NEXT: - { id: 0, name: stack_slot, type: default, offset: 0, size: 4, alignment: 4
|
||||
define void @foo() {
|
||||
%stack_slot = alloca i19
|
||||
call void @bar(i19* %stack_slot)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @bar(i19* %a)
|
Loading…
Reference in New Issue