From df74b86e1e9ee32e08c22f7eef51da0b65ec053d Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Fri, 7 Jun 2013 20:52:05 +0000 Subject: [PATCH] R600: Fix calculation of stack offset in AMDGPUFrameLowering We weren't computing structure size correctly and we were relying on the original alloca instruction to compute the offset, which isn't always reliable. Reviewed-by: Vincent Lejeune git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183568 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/R600/AMDGPUFrameLowering.cpp | 23 ++--------------- test/CodeGen/R600/indirect-addressing.ll | 33 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/Target/R600/AMDGPUFrameLowering.cpp b/lib/Target/R600/AMDGPUFrameLowering.cpp index 815d6f71c3b..40f14d2f67c 100644 --- a/lib/Target/R600/AMDGPUFrameLowering.cpp +++ b/lib/Target/R600/AMDGPUFrameLowering.cpp @@ -78,27 +78,8 @@ int AMDGPUFrameLowering::getFrameIndexOffset(const MachineFunction &MF, int UpperBound = FI == -1 ? MFI->getNumObjects() : FI; for (int i = MFI->getObjectIndexBegin(); i < UpperBound; ++i) { - const AllocaInst *Alloca = MFI->getObjectAllocation(i); - unsigned ArrayElements; - const Type *AllocaType = Alloca->getAllocatedType(); - const Type *ElementType; - - if (AllocaType->isArrayTy()) { - ArrayElements = AllocaType->getArrayNumElements(); - ElementType = AllocaType->getArrayElementType(); - } else { - ArrayElements = 1; - ElementType = AllocaType; - } - - unsigned VectorElements; - if (ElementType->isVectorTy()) { - VectorElements = ElementType->getVectorNumElements(); - } else { - VectorElements = 1; - } - - Offset += (VectorElements / getStackWidth(MF)) * ArrayElements; + unsigned Size = MFI->getObjectSize(i); + Offset += (Size / (getStackWidth(MF) * 4)); } return Offset; } diff --git a/test/CodeGen/R600/indirect-addressing.ll b/test/CodeGen/R600/indirect-addressing.ll index 7291cb42e7f..bd72cd96e2e 100644 --- a/test/CodeGen/R600/indirect-addressing.ll +++ b/test/CodeGen/R600/indirect-addressing.ll @@ -30,3 +30,36 @@ entry: store i32 %3, i32 addrspace(1)* %arrayidx13 ret void } + +; This test checks that the stack offset is calculated correctly for structs. +; All register loads/stores should be optimized away, so there shouldn't be +; any MOVA instructions. +; +; XXX: This generated code has unnecessary MOVs, we should be able to optimize +; this. + +; CHECK: @multiple_structs +; CHECK-NOT: MOVA_INT + +%struct.point = type { i32, i32 } + +define void @multiple_structs(i32 addrspace(1)* %out) { +entry: + %a = alloca %struct.point + %b = alloca %struct.point + %a.x.ptr = getelementptr %struct.point* %a, i32 0, i32 0 + %a.y.ptr = getelementptr %struct.point* %a, i32 0, i32 1 + %b.x.ptr = getelementptr %struct.point* %b, i32 0, i32 0 + %b.y.ptr = getelementptr %struct.point* %b, i32 0, i32 1 + store i32 0, i32* %a.x.ptr + store i32 1, i32* %a.y.ptr + store i32 2, i32* %b.x.ptr + store i32 3, i32* %b.y.ptr + %a.indirect.ptr = getelementptr %struct.point* %a, i32 0, i32 0 + %b.indirect.ptr = getelementptr %struct.point* %b, i32 0, i32 0 + %a.indirect = load i32* %a.indirect.ptr + %b.indirect = load i32* %b.indirect.ptr + %0 = add i32 %a.indirect, %b.indirect + store i32 %0, i32 addrspace(1)* %out + ret void +} -- 2.34.1