From 9ebfd78bad3cde0cb92ae3261314546fce5e949e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 6 Oct 2003 09:18:01 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/cse.c | 10 ++++++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/opt/cfg2.C | 38 +++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/cfg2.C 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 (...) {} +} -- 2.30.2