re PR rtl-optimization/12215 (ICE in make_label_edge with -fnon-call-exceptions -fno-gcse -O2)

PR optimization/12215
	* cse.c (cse_set_around_loop): Emit the move at the beginning
	of the next basic block for trapping sets.

From-SVN: r72141
This commit is contained in:
Eric Botcazou 2003-10-06 09:18:01 +00:00
parent 8c03ca00a6
commit 9ebfd78bad
4 changed files with 57 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2003-10-06 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/12215
* cse.c (cse_set_around_loop): Emit the move at the beginning
of the next basic block for trapping sets.
2003-10-06 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/11637

View File

@ -6666,7 +6666,15 @@ cse_set_around_loop (rtx x, rtx insn, rtx loop_start)
abort ();
}
else
emit_insn_after (move, p);
{
if (control_flow_insn_p (p))
/* p can cause a control flow transfer so it
is the last insn of a basic block. We can't
therefore use emit_insn_after. */
emit_insn_before (move, next_nonnote_insn (p));
else
emit_insn_after (move, p);
}
}
break;
}

View File

@ -1,3 +1,7 @@
2003-10-06 Wolfgang Bangerth <bangerth@ticam.utexas.edu>
* g++.dg/opt/cfg2.C: New test.
2003-10-06 Eric Botcazou <ebotcazou@libertysurf.fr>
* g++.dg/opt/float1.C: New test.

View File

@ -0,0 +1,38 @@
// PR optimization/12215
// Origin: <nick@ilm.com>
// Reduced testcase by Wolfgang Bangerth <bangerth@ticam.utexas.edu>
// This used to fail because the CSE pass destroyed the CFG in presence
// of trapping loads, which led to the deletion of basic blocks.
// { dg-do compile }
// { dg-options "-O2 -fno-gcse -fnon-call-exceptions" }
struct B {
~B() throw() {}
};
struct X {
X(const char*, const B&);
~X() {}
};
bool m();
void f(int &i, float &arg0);
void g (const char **argv) {
float val;
int i = 1;
try {
while ( i < 1 )
{
X arg(argv[i], B());
if (m())
throw(0);
f(i, val);
}
} catch (...) {}
}