re PR target/85593 (GCC on ARM allocates R3 for local variable when calling naked function with O2 optimizations enabled)
PR target/85593 * final.c (rest_of_handle_final): Don't call collect_fn_hard_reg_usage for functions with naked attribute. * gcc.target/i386/pr85593.c: New test. From-SVN: r266881
This commit is contained in:
parent
1e41b18448
commit
820037ecf6
4 changed files with 42 additions and 1 deletions
|
@ -1,5 +1,9 @@
|
|||
2018-12-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/85593
|
||||
* final.c (rest_of_handle_final): Don't call collect_fn_hard_reg_usage
|
||||
for functions with naked attribute.
|
||||
|
||||
PR c/88367
|
||||
* tree-vrp.c (extract_range_from_binary_expr): For POINTER_PLUS_EXPR
|
||||
with -fno-delete-null-pointer-checks, set_nonnull only if the pointer
|
||||
|
|
|
@ -4659,7 +4659,11 @@ rest_of_handle_final (void)
|
|||
final_start_function_1 (&first, asm_out_file, &seen, optimize);
|
||||
final_1 (first, asm_out_file, seen, optimize);
|
||||
if (flag_ipa_ra
|
||||
&& !lookup_attribute ("noipa", DECL_ATTRIBUTES (current_function_decl)))
|
||||
&& !lookup_attribute ("noipa", DECL_ATTRIBUTES (current_function_decl))
|
||||
/* Functions with naked attributes are supported only with basic asm
|
||||
statements in the body, thus for supported use cases the information
|
||||
on clobbered registers is not available. */
|
||||
&& !lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl)))
|
||||
collect_fn_hard_reg_usage ();
|
||||
final_end_function ();
|
||||
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2018-12-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/85593
|
||||
* gcc.target/i386/pr85593.c: New test.
|
||||
|
||||
PR rtl-optimization/85770
|
||||
* gcc.target/i386/pr85770.c: Require int128 effective target.
|
||||
|
||||
|
|
30
gcc/testsuite/gcc.target/i386/pr85593.c
Normal file
30
gcc/testsuite/gcc.target/i386/pr85593.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* PR target/85593 */
|
||||
/* { dg-do run { target { { i?86-*-linux* x86_64-*-linux* } && lp64 } } } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
__attribute__((naked)) void
|
||||
bar (void)
|
||||
{
|
||||
asm ("xorl %eax, %eax\n\t"
|
||||
"xorl %edx, %edx\n\t"
|
||||
"xorl %ecx, %ecx\n\t"
|
||||
"xorl %esi, %esi\n\t"
|
||||
"xorl %edi, %edi\n\t"
|
||||
"xorl %r8d, %r8d\n\t"
|
||||
"xorl %r9d, %r9d\n\t"
|
||||
"xorl %r10d, %r10d\n\t"
|
||||
"xorl %r11d, %r11d\n\t"
|
||||
"ret");
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
int a = 42;
|
||||
asm ("" : "+r" (a));
|
||||
bar ();
|
||||
asm ("" : "+r" (a));
|
||||
if (a != 42)
|
||||
__builtin_abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue