re PR rtl-optimization/53011 (ice in verify_loop_structure: bad sizes)
2012-04-17 Richard Guenther <rguenther@suse.de> 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
This commit is contained in:
parent
d51e8a2df2
commit
efa26eaae3
|
@ -1,3 +1,9 @@
|
|||
2012-04-17 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
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 <bernds@codesourcery.com>
|
||||
|
||||
* sel-sched.c (sel_global_init): Revert previous change.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2012-04-17 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/53011
|
||||
* g++.dg/torture/pr53011.C: New testcase.
|
||||
|
||||
2012-04-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/38543
|
||||
|
|
|
@ -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<class T, bool> struct WvTraits_Helper {
|
||||
static void release(T *obj) {
|
||||
delete obj;
|
||||
}
|
||||
};
|
||||
template<class From> struct WvTraits {
|
||||
static void release(From *obj) {
|
||||
WvTraits_Helper<From, 0>::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<class T> 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<T*>(next->data) : 0;
|
||||
|
||||
if (tail) tail = after;
|
||||
next->unlink();
|
||||
WvTraits<T>::release(obj);
|
||||
}
|
||||
};
|
||||
typedef WvList<WvString>WvStringListBase;
|
||||
class WvStringList : WvStringListBase {};
|
||||
class WvSubProc {
|
||||
WvStringList last_args, env;
|
||||
};
|
||||
void addroute(WvIPNet& dest, WvStringParm table) {
|
||||
if (dest.is_default() || (table != "default")) WvSubProc checkProc;
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue