From: Jakub Jelinek Date: Thu, 6 Dec 2018 23:41:04 +0000 (+0100) Subject: re PR target/85593 (GCC on ARM allocates R3 for local variable when calling naked... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=820037ecf679ce5cadb5c91e07cfad2d6d57cf0c;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2512ba68cb..e75e7856358 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2018-12-07 Jakub Jelinek + 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 diff --git a/gcc/final.c b/gcc/final.c index f707d2fc0bc..423318129dd 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -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 (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a317d8798eb..03f405101df 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2018-12-07 Jakub Jelinek + PR target/85593 + * gcc.target/i386/pr85593.c: New test. + PR rtl-optimization/85770 * gcc.target/i386/pr85770.c: Require int128 effective target. diff --git a/gcc/testsuite/gcc.target/i386/pr85593.c b/gcc/testsuite/gcc.target/i386/pr85593.c new file mode 100644 index 00000000000..092f9cbe680 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr85593.c @@ -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; +}