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;
+}