From ea2c0888e225aae218283e0bdc819f04f8f543bc Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 7 Mar 2007 11:18:22 -0800 Subject: [PATCH] re PR target/30848 (ICE with invalid constraint in asm statement) PR target/30848 * reg-stack.c (emit_swap_insn): If a malformed asm was seen, silently fix up the stack in the case of a missing register. From-SVN: r122672 --- gcc/ChangeLog | 16 +++++++++++----- gcc/reg-stack.c | 12 +++++++++++- gcc/testsuite/gcc.target/i386/pr30848.c | 6 ++++++ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr30848.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5eea36bd4225..eeec8c278d09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-03-07 Richard Henderson + + PR target/30848 + * reg-stack.c (emit_swap_insn): If a malformed asm was seen, + silently fix up the stack in the case of a missing register. + 2007-03-06 David Daney * doc/install.texi (mips-*-*): Change recommended binutils @@ -391,11 +397,11 @@ 2007-01-29 Josh Conner - PR middle-end/29683 - * calls.c (compute_argument_addresses): Set stack and stack_slot - for partial args, too. - (store_one_arg): Use locate.size.constant for the size when - generating a save_area. + PR middle-end/29683 + * calls.c (compute_argument_addresses): Set stack and stack_slot + for partial args, too. + (store_one_arg): Use locate.size.constant for the size when + generating a save_area. 2007-01-28 Ralf Wildenhues diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index fc742bdce608..2a05612decdd 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -816,9 +816,19 @@ emit_swap_insn (rtx insn, stack regstack, rtx reg) hard_regno = get_hard_regnum (regstack, reg); - gcc_assert (hard_regno >= FIRST_STACK_REG); if (hard_regno == FIRST_STACK_REG) return; + if (hard_regno == -1) + { + /* Something failed if the register wasn't on the stack. If we had + malformed asms, we zapped the instruction itself, but that didn't + produce the same pattern of register sets as before. To prevent + further failure, adjust REGSTACK to include REG at TOP. */ + gcc_assert (any_malformed_asm); + regstack->reg[++regstack->top] = REGNO (reg); + return; + } + gcc_assert (hard_regno >= FIRST_STACK_REG); other_reg = regstack->top - (hard_regno - FIRST_STACK_REG); diff --git a/gcc/testsuite/gcc.target/i386/pr30848.c b/gcc/testsuite/gcc.target/i386/pr30848.c new file mode 100644 index 000000000000..2a92851516c6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr30848.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +void foo(double d) +{ + __asm__ ("" : "=u" (d)); /* { dg-error "output regs" } */ +}