diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -1738,7 +1738,7 @@ // 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 --- a/llvm/test/CodeGen/AArch64/arm64-homogeneous-prolog-epilog.ll +++ b/llvm/test/CodeGen/AArch64/arm64-homogeneous-prolog-epilog.ll @@ -29,6 +29,27 @@ 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]!