This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Dealing with basic blocks
- From: Richard Guenther <richard dot guenther at gmail dot com>
- To: "Paulo J. Matos" <pocmatos at gmail dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Tue, 14 Sep 2010 12:13:32 +0200
- Subject: Re: Dealing with basic blocks
- References: <yayaankpu99.fsf@alma.europe.root.pri>
On Tue, Sep 14, 2010 at 11:08 AM, Paulo J. Matos <pocmatos@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
>
>