From: Stanislav Mekhanoshin Date: Tue, 3 Aug 2021 21:50:10 +0000 (-0700) Subject: [AMDGPU] Avoid assert for saved FP X-Git-Tag: upstream/15.0.7~33042 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=11b7ee974a69cabb379b12ce62a808594a53ef95;p=platform%2Fupstream%2Fllvm.git [AMDGPU] Avoid assert for saved FP With spilling into AGPRs enabled we cannot reliably predict if we need to save FP or not. We may finally spill everything into AGPRs and never touch stack. In this case we still may save FP. This is deficiency but not an error, so avoid the assert. Differential Revision: https://reviews.llvm.org/D107404 --- diff --git a/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp b/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp index fe0132b..a567e89 100644 --- a/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIFrameLowering.cpp @@ -959,8 +959,11 @@ void SIFrameLowering::emitPrologue(MachineFunction &MF, FuncInfo->FramePointerSaveIndex)) && "Needed to save FP but didn't save it anywhere"); + // If we allow spilling to AGPRs we may have saved FP but then spill + // everything into AGPRs instead of the stack. assert((HasFP || (!FuncInfo->SGPRForFPSaveRestoreCopy && - !FuncInfo->FramePointerSaveIndex)) && + !FuncInfo->FramePointerSaveIndex) || + EnableSpillVGPRToAGPR) && "Saved FP but didn't need it"); assert((!HasBP || (FuncInfo->SGPRForBPSaveRestoreCopy || diff --git a/llvm/test/CodeGen/AMDGPU/save-fp.ll b/llvm/test/CodeGen/AMDGPU/save-fp.ll new file mode 100644 index 0000000..6bed1dbf --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/save-fp.ll @@ -0,0 +1,29 @@ +; RUN: llc -march=amdgcn -mcpu=gfx908 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX908 %s +; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX900 %s + +define void @foo() { +bb: + ret void +} + +; FIXME: We spill v40 into AGPR, but still save and restore FP +; which is not needed in this case. + +; GCN-LABEL: {{^}}caller: + +; GFX900: s_mov_b32 [[SAVED_FP:s[0-9]+]], s33 +; GFX900: s_mov_b32 s33, s32 +; GFX908-NOT: s_mov_b32 s33, s32 +; GFX900: buffer_store_dword +; GFX908-DAG: s_mov_b32 [[SAVED_FP:s[0-9]+]], s33 +; GFX908-DAG: v_accvgpr_write_b32 +; GCN: s_swappc_b64 +; GFX900: buffer_load_dword +; GFX908: v_accvgpr_read_b32 +; GCN: s_mov_b32 s33, [[SAVED_FP]] +define i64 @caller() { +bb: + call void asm sideeffect "", "~{v40}" () + tail call void @foo() + ret i64 0 +}