From: Claudiu Zissulescu Date: Mon, 18 Jul 2022 11:32:41 +0000 (+0300) Subject: arc: Fix interrupt's epilogue. X-Git-Tag: basepoints/gcc-14~5478 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9c8349ee1a35dac61b84bbae115ee6a1eeb6ddbd;p=thirdparty%2Fgcc.git arc: Fix interrupt's epilogue. The stack pointer adjustment in interrupt epilogue is happening after restoring the ZOL registers which is wrong. Fixing this. gcc/ * config/arc/arc.cc (arc_expand_epilogue): Adjust the frame pointer first when in interrupts. gcc/testsuite/ * gcc.target/arc/interrupt-13.c: New file. Signed-off-by: Claudiu Zissulescu --- diff --git a/gcc/config/arc/arc.cc b/gcc/config/arc/arc.cc index fbc17e684a0..77730c88e55 100644 --- a/gcc/config/arc/arc.cc +++ b/gcc/config/arc/arc.cc @@ -3965,7 +3965,7 @@ arc_expand_epilogue (int sibcall_p) if (size) emit_insn (gen_blockage ()); - if (ARC_INTERRUPT_P (fn_type) && restore_fp) + if (ARC_INTERRUPT_P (fn_type)) { /* We need to restore FP before any SP operation in an interrupt. */ diff --git a/gcc/testsuite/gcc.target/arc/interrupt-13.c b/gcc/testsuite/gcc.target/arc/interrupt-13.c new file mode 100644 index 00000000000..0ed8451c512 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/interrupt-13.c @@ -0,0 +1,15 @@ +/* { dg-options "-O2" } */ + +extern int foo (int *); + +void __attribute__((interrupt("ilink"))) +irq (void) +{ + struct { + int x0; + int x1; + } a = {1 ,2}; + foo ((int *)&a); +} + +/* { dg-final { scan-assembler "add_s\\s+sp,sp,8.*pop_s\\s+r0" } } */