From 6530ea409506a5778bb773615725b9ddee0538f0 Mon Sep 17 00:00:00 2001 From: Kyungwoo Lee Date: Sun, 25 Jul 2021 10:50:39 -0700 Subject: [PATCH] [AArch64] Fix Local Deallocation for Homogeneous Prolog/Epilog The stack adjustment for local deallocation was incorrectly ported. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D106760 --- llvm/lib/Target/AArch64/AArch64FrameLowering.cpp | 2 +- .../AArch64/arm64-homogeneous-prolog-epilog.ll | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp index 9d318d8..f6a528c 100644 --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -1738,7 +1738,7 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF, // Adjust local stack emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::SP, - StackOffset::getFixed(-AFI->getLocalStackSize()), TII, + StackOffset::getFixed(AFI->getLocalStackSize()), TII, MachineInstr::FrameDestroy, false, NeedsWinCFI); // SP has been already adjusted while restoring callee save regs. diff --git a/llvm/test/CodeGen/AArch64/arm64-homogeneous-prolog-epilog.ll b/llvm/test/CodeGen/AArch64/arm64-homogeneous-prolog-epilog.ll index 498bbb5..64e58a8 100644 --- a/llvm/test/CodeGen/AArch64/arm64-homogeneous-prolog-epilog.ll +++ b/llvm/test/CodeGen/AArch64/arm64-homogeneous-prolog-epilog.ll @@ -29,6 +29,27 @@ define i32 @_Z3hooii(i32 %b, i32 %a) nounwind ssp minsize { declare i32 @_Z3gooi(i32); +; CHECK-LABEL: _foo: +; CHECK: sub sp, sp, #16 +; CHECK: bl _goo +; CHECK: add sp, sp, #16 + +define i32 @foo(i32 %c) nounwind minsize { +entry: + %buffer = alloca [1 x i32], align 4 + %0 = bitcast [1 x i32]* %buffer to i8* + call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) + %arraydecay = getelementptr inbounds [1 x i32], [1 x i32]* %buffer, i64 0, i64 0 + %call = call i32 @goo(i32* nonnull %arraydecay) + %sub = sub nsw i32 %c, %call + call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) + + ret i32 %sub +} + +declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) +declare i32 @goo(i32*) +declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) ; CHECK-LABEL: _OUTLINED_FUNCTION_PROLOG_x30x29x19x20x21x22: ; CHECK: stp x22, x21, [sp, #-32]! -- 2.7.4