re PR target/84564 (error: unable to find a register to spill with -mforce-indirect...
authorJakub Jelinek <jakub@gcc.gnu.org>
Mon, 5 Mar 2018 16:24:43 +0000 (17:24 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 5 Mar 2018 16:24:43 +0000 (17:24 +0100)
PR target/84564
* config/i386/i386.c (ix86_function_ok_for_sibcall): Check for
regparm >= 3 with no arg reg available also for calls with
flag_force_indirect_call.  Pass decl to ix86_function_regparm.

* gcc.target/i386/pr84564.c: New test.

From-SVN: r258256

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr84564.c [new file with mode: 0644]

index ef9a8c95f712420c9e2802d02ca60114f666d205..1d1ef6e850eb1807bec7a27bf37551a9d8eb884e 100644 (file)
@@ -1,5 +1,10 @@
 2018-03-05  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/84564
+       * config/i386/i386.c (ix86_function_ok_for_sibcall): Check for
+       regparm >= 3 with no arg reg available also for calls with
+       flag_force_indirect_call.  Pass decl to ix86_function_regparm.
+
        PR target/84524
        * config/i386/sse.md (*<code><mode>3): Replace <mask_prefix3> with
        orig,vex.
index 9cdc96f63da219a4cd0aee74aa8abeaf541f8616..e352303ca2fce00599578f2e187a82c20e83b6a7 100644 (file)
@@ -6415,7 +6415,8 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
         function via GOT slot are indirect.  */
       if (!decl
          || (bind_global && flag_pic && !flag_plt)
-         || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl)))
+         || (TARGET_DLLIMPORT_DECL_ATTRIBUTES && DECL_DLLIMPORT_P (decl))
+         || flag_force_indirect_call)
        {
          /* Check if regparm >= 3 since arg_reg_available is set to
             false if regparm == 0.  If regparm is 1 or 2, there is
@@ -6424,7 +6425,7 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
             ??? The symbol indirect call doesn't need a call-clobbered
             register.  But we don't know if this is a symbol indirect
             call or not here.  */
-         if (ix86_function_regparm (type, NULL) >= 3
+         if (ix86_function_regparm (type, decl) >= 3
              && !cfun->machine->arg_reg_available)
            return false;
        }
index a1f72cb705b98e040e997e151654be59c6402b85..e80a72802eeda6a7f6bdfd9acb42ca8c1b8988e8 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/84564
+       * gcc.target/i386/pr84564.c: New test.
+
 2018-03-05  Marek Polacek  <polacek@redhat.com>
 
        PR c++/84707
 
        PR fortran/84141
        PR fortran/84155
-       * gfortran.dg/pr84155.f90 : New test.
+       * gfortran.dg/pr84155.f90: New test.
 
 2017-02-02  Uros Bizjak  <ubizjak@gmail.com>
 
 2018-01-31  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/84088
-       * gfortran.dg/pr84088.f90 : New test.
+       * gfortran.dg/pr84088.f90: New test.
 
 2018-01-31  Vladimir Makarov  <vmakarov@redhat.com>
 
diff --git a/gcc/testsuite/gcc.target/i386/pr84564.c b/gcc/testsuite/gcc.target/i386/pr84564.c
new file mode 100644 (file)
index 0000000..f311ebd
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR target/84564 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mforce-indirect-call" } */
+
+int a, b, c, d;
+int foo (void);
+
+static int
+bar (int x, int y, int z)
+{
+  while (a)
+    if (foo ())
+      bar (x, y, z);
+  return 0;
+}
+
+int
+baz (void)
+{
+  return bar (b, c, d);
+}