Commit 8c03ca00 by Eric Botcazou Committed by Eric Botcazou

re PR rtl-optimization/11637 (g++ invalid assembly with -fnon-call-exceptions)

2003-10-06  Eric Botcazou  <ebotcazou@libertysurf.fr>

	PR optimization/11637
	* combine.c (adjust_for_new_dest): New function to adjust the
	notes and LOG_LINKS when the dest of an insn has changed.
	(try_combine): Use it when deleting the first insn of a two-insn
	parallel or splitting a two-load parallel.

From-SVN: r72138
parent 0cb733bf
2003-10-06 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/11637
* combine.c (adjust_for_new_dest): New function to adjust the
notes and LOG_LINKS when the dest of an insn has changed.
(try_combine): Use it when deleting the first insn of a two-insn
parallel or splitting a two-load parallel.
2003-10-06 Richard Sandiford <rsandifo@redhat.com> 2003-10-06 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.c (mips_classify_constant): Only allow UNSPECs * config/mips/mips.c (mips_classify_constant): Only allow UNSPECs
...@@ -77,7 +85,6 @@ ...@@ -77,7 +85,6 @@
* config/mn10300/mn10300.md: Likewise. * config/mn10300/mn10300.md: Likewise.
* config/sh/sh.h: Likewise. * config/sh/sh.h: Likewise.
>>>>>>> 2.1294
2003-10-05 Richard Henderson <rth@redhat.com> 2003-10-05 Richard Henderson <rth@redhat.com>
* tree-inline.c (remap_type): New. * tree-inline.c (remap_type): New.
......
...@@ -1438,6 +1438,33 @@ cant_combine_insn_p (rtx insn) ...@@ -1438,6 +1438,33 @@ cant_combine_insn_p (rtx insn)
return 0; return 0;
} }
/* Adjust INSN after we made a change to its destination.
Changing the destination can invalidate notes that say something about
the results of the insn and a LOG_LINK pointing to the insn. */
static void
adjust_for_new_dest (rtx insn)
{
rtx *loc;
/* For notes, be conservative and simply remove them. */
loc = &REG_NOTES (insn);
while (*loc)
{
enum reg_note kind = REG_NOTE_KIND (*loc);
if (kind == REG_EQUAL || kind == REG_EQUIV)
*loc = XEXP (*loc, 1);
else
loc = &XEXP (*loc, 1);
}
/* The new insn will have a destination that was previously the destination
of an insn just above it. Call distribute_links to make a LOG_LINK from
the next use of that destination. */
distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
}
/* Try to combine the insns I1 and I2 into I3. /* Try to combine the insns I1 and I2 into I3.
Here I1 and I2 appear earlier than I3. Here I1 and I2 appear earlier than I3.
I1 can be zero; then we combine just I2 into I3. I1 can be zero; then we combine just I2 into I3.
...@@ -2057,6 +2084,14 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p) ...@@ -2057,6 +2084,14 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
{ {
newpat = XVECEXP (newpat, 0, 1); newpat = XVECEXP (newpat, 0, 1);
insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
if (insn_code_number >= 0)
{
/* If we will be able to accept this, we have made a change to the
destination of I3. This requires us to do a few adjustments. */
PATTERN (i3) = newpat;
adjust_for_new_dest (i3);
}
} }
/* If we were combining three insns and the result is a simple SET /* If we were combining three insns and the result is a simple SET
...@@ -2327,16 +2362,9 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p) ...@@ -2327,16 +2362,9 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
rtx link; rtx link;
/* If we will be able to accept this, we have made a change to the /* If we will be able to accept this, we have made a change to the
destination of I3. This can invalidate a LOG_LINKS pointing destination of I3. This requires us to do a few adjustments. */
to I3. No other part of combine.c makes such a transformation.
The new I3 will have a destination that was previously the
destination of I1 or I2 and which was used in i2 or I3. Call
distribute_links to make a LOG_LINK from the next use of
that destination. */
PATTERN (i3) = newpat; PATTERN (i3) = newpat;
distribute_links (gen_rtx_INSN_LIST (VOIDmode, i3, NULL_RTX)); adjust_for_new_dest (i3);
/* I3 now uses what used to be its destination and which is /* I3 now uses what used to be its destination and which is
now I2's destination. That means we need a LOG_LINK from now I2's destination. That means we need a LOG_LINK from
...@@ -12909,8 +12937,8 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2) ...@@ -12909,8 +12937,8 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2)
} }
/* Similarly to above, distribute the LOG_LINKS that used to be present on /* Similarly to above, distribute the LOG_LINKS that used to be present on
I3, I2, and I1 to new locations. This is also called in one case to I3, I2, and I1 to new locations. This is also called to add a link
add a link pointing at I3 when I3's destination is changed. */ pointing at I3 when I3's destination is changed. */
static void static void
distribute_links (rtx links) distribute_links (rtx links)
......
2003-10-06 Eric Botcazou <ebotcazou@libertysurf.fr>
* g++.dg/opt/float1.C: New test.
2003-10-04 Eric Botcazou <ebotcazou@libertysurf.fr> 2003-10-04 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/c90-array-lval-6.c: New test. * gcc.dg/c90-array-lval-6.c: New test.
......
// PR optimization/11637
// Origin: <nick@ilm.com>
// This used to fail to assemble on x86 because a decimal
// floating point litteral was emitted, which originated
// from a bogus REG_EQUAL note not removed by the combiner.
// { dg-do assemble }
// { dg-options "-O2 -fnon-call-exceptions" }
void f(long int seed);
void g(float &o)
{
float a = 0.05f;
float b = 1.0 - a;
float c = 1.0 + a;
f(0);
o = a;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment