From efa26eaae377bf2a5ce9b02b84f3963a0166e280 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 17 Apr 2012 13:42:48 +0000 Subject: [PATCH] re PR rtl-optimization/53011 (ice in verify_loop_structure: bad sizes) 2012-04-17 Richard Guenther PR middle-end/53011 * tree-eh.c (cleanup_empty_eh_merge_phis): Properly discard loops when redirecting an entry or latch edge. * g++.dg/torture/pr53011.C: New testcase. From-SVN: r186529 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/g++.dg/torture/pr53011.C | 66 ++++++++++++++++++++++++++ gcc/tree-eh.c | 15 ++++++ 4 files changed, 92 insertions(+) create mode 100644 gcc/testsuite/g++.dg/torture/pr53011.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7de0e0bdcf5..e09d6724b6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-04-17 Richard Guenther + + PR middle-end/53011 + * tree-eh.c (cleanup_empty_eh_merge_phis): Properly discard + loops when redirecting an entry or latch edge. + 2012-04-17 Bernd Schmidt * sel-sched.c (sel_global_init): Revert previous change. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0b6fcf50317..e1862c65b8f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-04-17 Richard Guenther + + PR middle-end/53011 + * g++.dg/torture/pr53011.C: New testcase. + 2012-04-16 Jason Merrill PR c++/38543 diff --git a/gcc/testsuite/g++.dg/torture/pr53011.C b/gcc/testsuite/g++.dg/torture/pr53011.C new file mode 100644 index 00000000000..2cd8a60332d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr53011.C @@ -0,0 +1,66 @@ +// { dg-do compile } + +extern "C" class WvFastString; +typedef WvFastString& WvStringParm; +struct WvFastString { + ~WvFastString(); + operator char* () {} +}; +class WvString : WvFastString {}; +class WvAddr {}; +class WvIPAddr : WvAddr {}; +struct WvIPNet : WvIPAddr { + bool is_default() {} +}; +template struct WvTraits_Helper { + static void release(T *obj) { + delete obj; + } +}; +template struct WvTraits { + static void release(From *obj) { + WvTraits_Helper::release(obj); + } +}; +struct WvLink { + void *data; + WvLink *next; + bool autofree; + WvLink(bool, int) : autofree() {} + bool get_autofree() {} + + void unlink() { + delete this; + } +}; +struct WvListBase { + WvLink head, *tail; + WvListBase() : head(0, 0) {} +}; +template struct WvList : WvListBase { + ~WvList() { + zap(); + } + + void zap(bool destroy = 1) { + while (head.next) unlink_after(&head, destroy); + } + + void unlink_after(WvLink *after, bool destroy) { + WvLink *next = 0; + T *obj = (destroy && next->get_autofree()) ? + static_cast(next->data) : 0; + + if (tail) tail = after; + next->unlink(); + WvTraits::release(obj); + } +}; +typedef WvListWvStringListBase; +class WvStringList : WvStringListBase {}; +class WvSubProc { + WvStringList last_args, env; +}; +void addroute(WvIPNet& dest, WvStringParm table) { + if (dest.is_default() || (table != "default")) WvSubProc checkProc; +} diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index ba188d85a77..0241a5f1bc4 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -3916,6 +3916,21 @@ cleanup_empty_eh_merge_phis (basic_block new_bb, basic_block old_bb, for (ei = ei_start (old_bb->preds); (e = ei_safe_edge (ei)); ) if (e->flags & EDGE_EH) { + /* ??? CFG manipluation routines do not try to update loop + form on edge redirection. Do so manually here for now. */ + /* If we redirect a loop entry or latch edge that will either create + a multiple entry loop or rotate the loop. If the loops merge + we may have created a loop with multiple latches. + All of this isn't easily fixed thus cancel the affected loop + and mark the other loop as possibly having multiple latches. */ + if (current_loops + && e->dest == e->dest->loop_father->header) + { + e->dest->loop_father->header = NULL; + e->dest->loop_father->latch = NULL; + new_bb->loop_father->latch = NULL; + loops_state_set (LOOPS_NEED_FIXUP|LOOPS_MAY_HAVE_MULTIPLE_LATCHES); + } redirect_eh_edge_1 (e, new_bb, change_region); redirect_edge_succ (e, new_bb); flush_pending_stmts (e);