Hi,
We would like to know if there is some way to find the true and false
branches of a conditional jump in RTL. In the tree CFG, we have two
edge flags for that, EDGE_{TRUE,FALSE}_VALUE, but those flags have no
meaning for the RTL CFG. So our question is, is there some other way
to tell what edge will be taken in a conditional jump if the condition
is true?
It seems that some passes assume a canonical form of IF-THEN-ELSE even
on RTL. From ifcvt.c:find_if_header:
/* The THEN edge is canonically the one that falls through. */
if (then_edge->flags & EDGE_FALLTHRU)
;
else if (else_edge->flags & EDGE_FALLTHRU)
{
edge e = else_edge;
else_edge = then_edge;
then_edge = e;
}
else
/* Otherwise this must be a multiway branch of some sort. */
return NULL;
On the other hand, in cfgexpand.c:expand_gimple_cond_expr we have,
false_edge->flags |= EDGE_FALLTHRU;
and loop-unswitch.c assumes that the BRANCH_EDGE is the true_edge:
true_edge = BRANCH_EDGE (unswitch_on_alt);
false_edge = FALLTHRU_EDGE (unswitch_on);
So which is it? Is BRANCH_EDGE always taken if the condition is true,
or FALLTHRU_EDGE, or do you have to look at the condition to know?
Who knows an answer? :-)
Gr.
Steven