From: Eric Botcazou Date: Mon, 6 Oct 2003 09:18:01 +0000 (+0000) Subject: re PR rtl-optimization/12215 (ICE in make_label_edge with -fnon-call-exceptions ... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9ebfd78bad3cde0cb92ae3261314546fce5e949e;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e56e27f813..a0112d2ca75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-10-06 Eric Botcazou + + 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 PR optimization/11637 diff --git a/gcc/cse.c b/gcc/cse.c index a4847a857b3..30355df5f79 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0264d7a5012..48761b7cb2c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-10-06 Wolfgang Bangerth + + * g++.dg/opt/cfg2.C: New test. + 2003-10-06 Eric Botcazou * g++.dg/opt/float1.C: New test. diff --git a/gcc/testsuite/g++.dg/opt/cfg2.C b/gcc/testsuite/g++.dg/opt/cfg2.C new file mode 100644 index 00000000000..229f4bc3a52 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cfg2.C @@ -0,0 +1,38 @@ +// PR optimization/12215 +// Origin: +// Reduced testcase by Wolfgang Bangerth + +// 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 (...) {} +}