diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-03-05 17:24:43 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-03-05 17:24:43 +0100 |
commit | 537400180d36469bf97daeb28d23161fe9ed022a (patch) | |
tree | 4d83d3726e4fba22de7c4e2671152fd8e8eb1ebb | |
parent | a2460abb82e2fd3c45edf5e9f4ff61151ef8d815 (diff) | |
download | gcc-537400180d36469bf97daeb28d23161fe9ed022a.zip gcc-537400180d36469bf97daeb28d23161fe9ed022a.tar.gz gcc-537400180d36469bf97daeb28d23161fe9ed022a.tar.bz2 |
re PR target/84564 (error: unable to find a register to spill with -mforce-indirect-call)
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr84564.c | 21 |
4 files changed, 36 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ef9a8c9..1d1ef6e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 9cdc96f..e352303 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1f72cb..e80a728 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 @@ -4234,7 +4239,7 @@ 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> @@ -4493,7 +4498,7 @@ 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 index 0000000..f311ebd --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr84564.c @@ -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); +} |