On Tue, Sep 14, 2010 at 11:08 AM, Paulo J. Matos <pocma...@gmail.com> wrote: > > Hello all, > > I am moving basic blocks around and currently the cfg is getting very, > very awkward. My guess is that I am doing something I shouldn't [as > usual]. > > For each SWITCH_EXPR I found on the code I generate a CFG which I have > to replace with the SWITCH_EXPR. The switch is always the last statement > on a basic block, so what I am doing is removing all the edges of the > current bb: > > VEC_truncate (edge, bsi.bb->succs, 0);
You need to use remove_edge, don't mess with internal data structures directly. > Create a single edge from the current bb to the initial bb of the > generated cfg: > > make_edge(bsi.bb, new, EDGE_FALLTHRU); > > And finally remove the switch_expr we are pointing to: > > bsi_remove(&bsi, true); > > Is this the correct way to do it? I am quite concerned as to whether I > am removing all the edges from the basic block correctly and if I can > simply had a fallthru edge to the new cfg (given that after removing the > switch_expr, the original basic block will end on a statement that would > normally not require the basic block to end). Yes, that will work. Richard. > Cheers, > > -- > PMatos > >