The CFI output for when we do stack probing in a loop were not
accounting for the first sp adjustments, we can fix that by using the
frame's total size.
This is already being tested by g++.dg/torture/pr119610.C.
gcc/ChangeLog:
gcc/config/riscv/riscv.cc
(riscv_allocate_and_probe_stack_space): Use the total frame size
instead of the current adjustment size to set the CFI.
gcc/testsuite/ChangeLog:
gcc.target/riscv/stack-check-cfa-2.c: Fix expected output.
---
gcc/config/riscv/riscv.cc | 5 +++--
gcc/testsuite/gcc.target/riscv/stack-check-cfa-2.c | 4 ++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index bbc7547d385..3e31438c50c 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -8977,12 +8977,13 @@ riscv_allocate_and_probe_stack_space (rtx temp1,
HOST_WIDE_INT size)
temp2 = riscv_force_temporary (temp2, gen_int_mode (rounded_size,
Pmode));
insn = emit_insn (gen_sub3_insn (temp2, stack_pointer_rtx, temp2));
+ auto cfa_offset = cfun->machine->frame.total_size;
if (!frame_pointer_needed)
{
/* We want the CFA independent of the stack pointer for the
duration of the loop. */
add_reg_note (insn, REG_CFA_DEF_CFA,
- plus_constant (Pmode, temp1, rounded_size));
+ plus_constant (Pmode, temp1, cfa_offset));
RTX_FRAME_RELATED_P (insn) = 1;
}
@@ -8995,7 +8996,7 @@ riscv_allocate_and_probe_stack_space (rtx temp1,
HOST_WIDE_INT size)
{
insn = get_last_insn ();
add_reg_note (insn, REG_CFA_DEF_CFA,
- plus_constant (Pmode, stack_pointer_rtx, rounded_size));
+ plus_constant (Pmode, stack_pointer_rtx, cfa_offset));
RTX_FRAME_RELATED_P (insn) = 1;
}
diff --git a/gcc/testsuite/gcc.target/riscv/stack-check-cfa-2.c
b/gcc/testsuite/gcc.target/riscv/stack-check-cfa-2.c
index 9d36a302222..3649bd1a9ce 100644
--- a/gcc/testsuite/gcc.target/riscv/stack-check-cfa-2.c
+++ b/gcc/testsuite/gcc.target/riscv/stack-check-cfa-2.c
@@ -5,9 +5,9 @@
#define SIZE 80*1024 + 512
#include "stack-check-prologue.h"
-/* { dg-final { scan-assembler-times {\.cfi_def_cfa [0-9]+, 81920} 1 } } */
+/* { dg-final { scan-assembler-times {\.cfi_def_cfa [0-9]+, 82432} 1 } } */
/* { dg-final { scan-assembler-times {\.cfi_def_cfa_register 2} 1 } } */
-/* { dg-final { scan-assembler-times {\.cfi_def_cfa_offset 82432} 1 } } */
+/* { dg-final { scan-assembler-times {\.cfi_def_cfa_offset 82944} 1 } } */
/* { dg-final { scan-assembler-times {\.cfi_def_cfa_offset 0} 1 } } */
/* Checks that the CFA notes are correct for every sp adjustment. */
--
2.47.0