diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 781bcc8ca42e10524595cb6c90b61450a41f739e..6f4381fd6e959321d8d319fafdce4079c7b54e5f 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -27011,7 +27011,7 @@ cmse_nonsecure_entry_clear_before_return (void) continue; if (IN_RANGE (regno, IP_REGNUM, PC_REGNUM)) continue; - if (call_used_or_fixed_reg_p (regno) + if (!callee_saved_reg_p (regno) && (!IN_RANGE (regno, FIRST_VFP_REGNUM, LAST_VFP_REGNUM) || TARGET_HARD_FLOAT)) bitmap_set_bit (to_clear_bitmap, regno); diff --git a/gcc/testsuite/gcc.target/arm/pr95646.c b/gcc/testsuite/gcc.target/arm/pr95646.c new file mode 100644 index 0000000000000000000000000000000000000000..12d06a0c8c1ed7de1f8d4d15130432259e613a32 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr95646.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv8-m.base" } } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mcpu=*" } { "-mcpu=cortex-m23" } } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mfpu=*" } { } } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mfloat-abi=*" } { "-mfloat-abi=soft" } } */ +/* { dg-options "-mcpu=cortex-m23 -mcmse" } */ +/* { dg-additional-options "-Os" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +int __attribute__ ((cmse_nonsecure_entry)) +foo (void) +{ + return 1; +} +/* { { dg-final { scan-assembler-not "mov\tr9, r0" } } */ + +/* +** __acle_se_bar: +** mov (r[0-3]), r9 +** push {\1} +** ... +** pop {(r[0-3])} +** mov r9, \2 +** ... +** bxns lr +*/ +int __attribute__ ((cmse_nonsecure_entry)) +bar (void) +{ + asm ("": : : "r9"); + return 1; +}