/* Hooks for cfg representation specific functions.
- Copyright (C) 2003 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004 Free Software Foundation, Inc.
Contributed by Sebastian Pop <s.pop@laposte.net>
This file is part of GCC.
edge e;
char *s_indent;
- s_indent = (char *) alloca ((size_t) indent + 1);
- memset ((void *) s_indent, ' ', (size_t) indent);
+ s_indent = alloca ((size_t) indent + 1);
+ memset (s_indent, ' ', (size_t) indent);
s_indent[indent] = '\0';
fprintf (outf, ";;%s basic block %d, loop depth %d, count ",
return split_block (bb, NULL);
}
-/* Moves block BB immediatelly after block AFTER. Returns false if the
+/* Moves block BB immediately after block AFTER. Returns false if the
movement was impossible. */
bool
basic_block ret;
gcov_type count = e->count;
int freq = EDGE_FREQUENCY (e);
+ edge f;
if (!cfg_hooks->split_edge)
internal_error ("%s does not support split_edge.", cfg_hooks->name);
set_immediate_dominator (CDI_DOMINATORS, ret, ret->pred->src);
if (dom_computed[CDI_DOMINATORS] >= DOM_NO_FAST_QUERY)
- set_immediate_dominator (CDI_DOMINATORS, ret->succ->dest,
- recount_dominator (CDI_DOMINATORS,
- ret->succ->dest));
+ {
+ /* There are two cases:
+
+ If the immediate dominator of e->dest is not e->src, it
+ remains unchanged.
+
+ If immediate dominator of e->dest is e->src, it may become
+ ret, provided that all other predecessors of e->dest are
+ dominated by e->dest. */
+
+ if (get_immediate_dominator (CDI_DOMINATORS, ret->succ->dest)
+ == ret->pred->src)
+ {
+ for (f = ret->succ->dest->pred; f; f = f->pred_next)
+ {
+ if (f == ret->succ)
+ continue;
+
+ if (!dominated_by_p (CDI_DOMINATORS, f->src,
+ ret->succ->dest))
+ break;
+ }
+
+ if (!f)
+ set_immediate_dominator (CDI_DOMINATORS, ret->succ->dest, ret);
+ }
+ };
return ret;
}
if ((s = b->succ) != NULL
&& ! (s->flags & EDGE_COMPLEX)
&& s->succ_next == NULL
- && s->dest == c)
+ && s->dest == c
+ && !find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX))
tidy_fallthru_edge (s);
}
}