Some of the musttail tests (eg musttail7.c) fail on arm-eabi because
check_effective_target_musttail pass, but the actual code in the test
is rejected.
The reason is that on arm-eabi with the default configuration, the
compiler targets armv4t for which TARGET_INTERWORK is true, making
arm_function_ok_for_sibcall reject a tail-call candidate if
TREE_ASM_WRITTEN (decl) is false.
For more recent architecture versions, TARGET_INTERWORK is false,
hence the problem was not seen on all arm configurations.
musttail7.c is in turn rejected because f2 is recursive, so
TREE_ASM_WRITTEN is false.
However, the same code used in check_effective_target_musttail is not
recursive and the function body for foo has TREE_ASM_WRITTEN == true.
The simplest fix is to remove the (empty) body for foo () in
check_effective_target_musttail. For consistency, do the same with
check_effective_target_tail_call.
gcc/testsuite/ChangeLog:
PR testsuite/116080
* lib/target-supports.exp (check_effective_target_tail_call):
Remove foo's body.
(check_effective_target_musttail): Likewise.
# most trivial type.
proc check_effective_target_tail_call { } {
return [check_no_messages_and_pattern tail_call ",SIBCALL" rtl-expand {
- __attribute__((__noipa__)) void foo (void) { }
+ __attribute__((__noipa__)) void foo (void);
__attribute__((__noipa__)) void bar (void) { foo(); }
} {-O2 -fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump.
}
# is supported at -O0.
proc check_effective_target_musttail { } {
return [check_no_messages_and_pattern musttail ",SIBCALL" rtl-expand {
- __attribute__((__noipa__)) void foo (void) { }
+ __attribute__((__noipa__)) void foo (void);
__attribute__((__noipa__)) void bar (void) { [[gnu::musttail]] return foo(); }
} {-fdump-rtl-expand-all}] ;# The "SIBCALL" note requires a detailed dump.
}