[llvm] r359856 - [IRTranslator] Use the alloc size instead of the store size when translating allocas

Quentin Colombet via llvm-commits llvm-commits at lists.llvm.org
Thu May 2 18:23:56 PDT 2019


Author: qcolombet
Date: Thu May  2 18:23:56 2019
New Revision: 359856

URL: http://llvm.org/viewvc/llvm-project?rev=359856&view=rev
Log:
[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.

Added:
    llvm/trunk/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll
Modified:
    llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp

Modified: llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp?rev=359856&r1=359855&r2=359856&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp Thu May  2 18:23:56 2019
@@ -219,7 +219,7 @@ int IRTranslator::getOrCreateFrameIndex(
   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();
 

Added: llvm/trunk/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll?rev=359856&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll Thu May  2 18:23:56 2019
@@ -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)




More information about the llvm-commits mailing list