From cd3a6717de356ca12a5f8068c4ff6f82dbb4c3f9 Mon Sep 17 00:00:00 2001 From: Quentin Colombet Date: Fri, 3 May 2019 01:23:56 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359856 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/GlobalISel/IRTranslator.cpp | 2 +- .../irtranslator-weird-alloca-size.ll | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll diff --git a/lib/CodeGen/GlobalISel/IRTranslator.cpp b/lib/CodeGen/GlobalISel/IRTranslator.cpp index cb769a57f3d..ba560544867 100644 --- a/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -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(AI.getArraySize())->getZExtValue(); diff --git a/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll b/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll new file mode 100644 index 00000000000..741bae3d757 --- /dev/null +++ b/test/CodeGen/AArch64/GlobalISel/irtranslator-weird-alloca-size.ll @@ -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) -- 2.50.1