From 1f21b6f4adea6c5d82dc5fe2820b3848e81504a5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Dec 2008 17:52:16 +0100 Subject: [PATCH] re PR middle-end/38338 (__builtin_apply causes an ICE on x86) PR middle-end/38338 * builtins.c (expand_builtin_apply_args): Put before parm_birth_insn only if internal_arg_pointer is a non-virtual pseudo. * gcc.dg/pr38338.c: New test. From-SVN: r142480 --- gcc/ChangeLog | 6 ++++++ gcc/builtins.c | 10 ++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr38338.c | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr38338.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e42d80e9ecc..3882383678e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-12-05 Jakub Jelinek + + PR middle-end/38338 + * builtins.c (expand_builtin_apply_args): Put before parm_birth_insn + only if internal_arg_pointer is a non-virtual pseudo. + 2008-12-05 Joseph Myers * config/rs6000/rs6000.md (move_from_CR_gt_bit): Enable for diff --git a/gcc/builtins.c b/gcc/builtins.c index 444baa606d1..4d507cf867c 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1434,9 +1434,15 @@ expand_builtin_apply_args (void) /* Put the insns after the NOTE that starts the function. If this is inside a start_sequence, make the outer-level insn chain current, so the code is placed at the start of the - function. */ + function. If internal_arg_pointer is a non-virtual pseudo, + it needs to be placed after the function that initializes + that pseudo. */ push_topmost_sequence (); - emit_insn_before (seq, parm_birth_insn); + if (REG_P (crtl->args.internal_arg_pointer) + && REGNO (crtl->args.internal_arg_pointer) > LAST_VIRTUAL_REGISTER) + emit_insn_before (seq, parm_birth_insn); + else + emit_insn_before (seq, NEXT_INSN (entry_of_function ())); pop_topmost_sequence (); return temp; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d342035cc99..3853f975944 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-05 Jakub Jelinek + + PR middle-end/38338 + * gcc.dg/pr38338.c: New test. + 2008-12-05 Joseph Myers * gcc.target/powerpc/20081204-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr38338.c b/gcc/testsuite/gcc.dg/pr38338.c new file mode 100644 index 00000000000..e8fcc3c4504 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr38338.c @@ -0,0 +1,18 @@ +/* PR middle-end/38338 */ +/* { dg-options "-O0" } */ +/* { dg-options "-O0 -fPIC" { target fpic } } */ + +typedef void (*fnp) (void); + +static char +foo (char x) +{ + return x; +} + +static void * +bar (char x) +{ + void *args = __builtin_apply_args (); + return __builtin_apply ((fnp) foo, args, sizeof (void *)); +} -- 2.30.2