On Wed, 2013-04-24 at 14:31 -0600, Jeff Law wrote:
> On 04/24/2013 11:38 AM, Steve Ellcey wrote:
> Just do duplicate_block (B, NULL, NULL)
>
> Then I'd remove the switch statement and the outgoing edges from B'
> except the edge B'->C.
>
> Then I'd fixup the PHIs in C. That's update_destination_phis.
>
>
> Then you need to wire up A->B'. If B' has PHIs, then you'll have to fix
> those as well as any PHIs in C. Note that PHIs in B just lost an
> argument, but that'll be handled automatically when you redirect the
> edge from A->B to A->B'.
>
> I think that's the proper sequencing (and I certainly had to read the
> code, it's been a long time since I looked at it in this level of detail)
I am still having trouble with this and with figuring out how to
straighten out my PHI nodes. I have decided to try a slightly different
tack and see if I could create a routine that would do a generic basic
block copy, handling all the needed bookkeeping internally and fixing
all the PHI nodes after the copy. I am trying to create a slow but
dependable and easy to use function and would consider completely
regenerating all the PHI information if that was the easiest thing to
do. Here is what I have so far:
/* Copy the basic block that is the destination block of orig_edge, then
modify/replace the edge in orig_edge->src basic block with a new edge
that goes to the new block. Fix up any PHI nodes that may need to be
updated. Remove the dominance info since it may have been messed up. */
edge
duplicate_succ_block (edge orig_edge)
{
edge new_edge;
basic_block orig_block, new_block;
initialize_original_copy_tables ();
orig_block = orig_edge->dest;
fprintf(stderr, "Duplicating block %d\n", orig_block->index);
new_block = duplicate_block (orig_block, NULL, NULL);
update_destination_phis (orig_block, new_block);
new_edge = redirect_edge_and_branch (orig_edge, new_block);
remove_phi_args (orig_edge);
free_dominance_info (CDI_DOMINATORS);
free_original_copy_tables ();
return new_edge;
}
When I use this to copy a block I get a failure from verify_ssa.
The block I am trying to copy (based on my original example) is:
<bb 8>:
# s_1 = PHI <s_6(D)(2), s_8(7)>
# t_3 = PHI <0(2), t_2(7)>
# c_4 = PHI <c_7(2), c_9(7)>
if (c_4 != 0)
goto <bb 3>;
else
goto <bb 9>;
There are two edges leading here (from block 2 and block 7) and I want
to change the 2->8 edge to be a 2->8_prime edge where 8_prime is my new
basic block. That obviously affects the PHI nodes in both block 8 and
the new 8_prime block. I don't think any other PHI's are affected in
this case, but obviously, I would like my routine to work on any block I
want to copy even if it does affect PHI nodes in successor blocks.
Steve Ellcey
[email protected]