[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:
Quentin Colombet 2019-05-03 01:23:56 +00:00
parent 7238353848
commit c9256cc6ba
2 changed files with 20 additions and 1 deletions

View File

@ -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();

View File

@ -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)