From 7476f0866c606870ed338f64269b840da3bcb1e4 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 7 Mar 2007 10:13:29 -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: r122669 --- gcc/ChangeLog | 6 ++++++ gcc/reg-stack.c | 12 +++++++++++- gcc/testsuite/gcc.target/i386/pr30848.c | 6 ++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr30848.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f61c9464b9..8712524b4fe 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-07 Paul Brook * config/arm/libunwind.S: Add .arch/.object_arch for armv4 builds. diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index e6802b1e8ef..8413ca3a399 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -815,9 +815,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 00000000000..2a92851516c --- /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" } */ +} -- 2.30.2