[IRTranslator] Use the alloc size instead of the store size when translating allocas
authorQuentin Colombet <quentin.colombet@gmail.com>
Fri, 3 May 2019 01:23:56 +0000 (01:23 +0000)
committerQuentin Colombet <quentin.colombet@gmail.com>
Fri, 3 May 2019 01:23:56 +0000 (01:23 +0000)
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

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll [new file with mode: 0644]

index cb769a5..ba56054 100644 (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();
 
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll
new file mode 100644 (file)
index 0000000..741bae3
--- /dev/null
@@ -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)