------- Additional Comments From kazu at cs dot umass dot edu 2005-01-23 20:39
-------
IMHO, we need to call rewrite_ssa_into_ssa after fixing CFG.
Consider:
int c, d;
int
bar (int a)
{
void *p;
int b;
if (a!=0)
{
b = 3;
p = &&L0;
}
else
{
b = 5;
p = &&L1;
}
goto *p;
L0:
c = b;
return 1;
L1:
d = b;
return 0;
}
Here is the corresponding SSA form.
<bb 0>:
if (a_4 != 0) goto <L2>; else goto <L7>;
<L7>:;
# p_2 = PHI <&L0(0), &L1(1)>;
# b_1 = PHI <3(0), 5(1)>;
<L2>:;
goto p_2;
L0:;
c = b_1;
goto <bb 5> (<L5>);
L1:;
d = b_1;
# D.1130_3 = PHI <1(3), 0(4)>;
<L5>:;
return D.1130_3;
Then the problem becomes pretty much the same as jump threading.
Note that <L2> has two incoming edges, one from <bb 0> and the other from
<L7>. We are basically trying to thread each incoming edge through <L2>.
Then we need to duplicate PHI nodes at <L2> and rewrite b_1 into SSA.
CCing Jeff as I think this PR fits very naturally to the jump threading
algogorithm in DOM.
--
What |Removed |Added
----------------------------------------------------------------------------
CC| |law at redhat dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18133