From mboxrd@z Thu Jan 1 00:00:00 1970 From: hjl@lucon.org (H.J. Lu) To: law@cygnus.com Cc: gafton@redhat.com, egcs@cygnus.com, coxs@dg-rtp.dg.com, crux@ohara.Informatik.RWTH-Aachen.DE Subject: reg-stack.c problem Date: Mon, 20 Apr 1998 13:06:00 -0000 Message-id: References: <17624.893055503@hurl.cygnus.com> X-SW-Source: 1998-04/msg00815.html > > Basically convert_regs () calls change_stack () with INSN to emit > > some insn after INSN. But some insn has been added after INSN so > > that change_stack () will emit some insn at the wrong place. As the > > result, the floating point is broken on x86. > This is an extremely confusing explanation, primarily because you > use "insn"/INSN to refer to three different things. > > Basically is sounds like you have > > insn 1 > insn 2 > > > It sounds like we thought we wanted to insert after insn 1, but > because of other reg-stack actions we really wanted to insert > after insn 2. > > > This patch seems to fix it. Could someone please take a look? Given > > the bugs we have seen in egcs 1.0.2, I suggest egcs 1.0.3 be made. > I must confess I don't undersatnd reg-stack all that well. Assuming > your analysis and explanation are correct, then I think your change > is OK, though possibly incomplete. > > In particular I worry that we need to pass "new" instead of "insn" > to the call to emit_pop_insn near the end of convert_regs. I think > the call to goto_block_pat in convert_regs is OK. You may be right. > > I also worry that there may be cases were we need to insert after > insn 1 instead of after insn 2. But I don't know reg-stack well > enough to know if that can actually happen. I don't think that should happen. > > You might ask Bernd Schmidt or Stan Cox to look at the change and > comment. > > I'm going to go ahead and hesitantly install the change, but further > comments from folks that understand this code would be greatly > appreciated. > How does this patch against egcs 1.0 in CVS sound? Thanks. -- H.J. Lu (hjl@gnu.org) -- Mon Apr 20 08:02:56 1998 H.J. Lu (hjl@gnu.org) (convert_regs): Abort if the last newly created insn is a JUMP insn. Call goto_block_pat (), emit_pop_insn () and straighten_stack () with NEW instead of INSN. --- reg-stack.c.1 Sat Apr 18 18:23:12 1998 +++ reg-stack.c Mon Apr 20 08:01:58 1998 @@ -3108,6 +3108,9 @@ convert_regs () } while (insn != block_end[block]); + if (new != insn && GET_CODE (new) == JUMP_INSN) + abort (); + /* Something failed if the stack life doesn't match. */ GO_IF_HARD_REG_EQUAL (regstack.reg_set, block_out_reg_set[block], win); @@ -3121,8 +3124,8 @@ convert_regs () jump target if the target block's stack order hasn't been set yet. */ - if (GET_CODE (insn) == JUMP_INSN) - goto_block_pat (insn, ®stack, PATTERN (insn)); + if (GET_CODE (new) == JUMP_INSN) + goto_block_pat (new, ®stack, PATTERN (insn)); /* Likewise handle the case where we fall into the next block. */ @@ -3151,11 +3154,11 @@ convert_regs () for (reg = regstack.top; reg >= 0; reg--) if (regstack.reg[reg] < value_reg_low || regstack.reg[reg] > value_reg_high) - insn = emit_pop_insn (insn, ®stack, + insn = emit_pop_insn (new, ®stack, FP_MODE_REG (regstack.reg[reg], DFmode), emit_insn_after); } - straighten_stack (insn, ®stack); + straighten_stack (new, ®stack); } /* Check expression PAT, which is in INSN, for label references. if