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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@266881 138bc75d-0d04-0410-961f-82ee72b054a4
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2512ba..e75e785 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/final.c b/gcc/final.c
index f707d2f..4233181 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -4659,7 +4659,11 @@
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 a317d87..03f4051 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.target/i386/pr85593.c b/gcc/testsuite/gcc.target/i386/pr85593.c
new file mode 100644
index 0000000..092f9cb
--- /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;
+}