Hello,
> I'm running into some troubles with an if-conversion pass that runs
> after reload, where we have to avoid lifting insns across a loop
> exit edge into a loop. ifcvt.c uses flow_loops_find to find loops
> and mark all loop exit edges:
>
> if ((! targetm.cannot_modify_jumps_p ())
> && (!flag_reorder_blocks_and_partition || !no_new_pseudos
> || !targetm.have_named_sections))
> {
> struct loops loops;
>
> flow_loops_find (&loops);
> mark_loop_exit_edges (&loops);
> flow_loops_free (&loops);
> free_dominance_info (CDI_DOMINATORS);
> }
>
> I was wondering why we would sometimes *not* mark exit edges, but then
> I remembered that for some reason flow_loops_find modifies the CFG,
> which may lead to problems that we have to work around here.
>
> But if we do not mark loop exit edges, we can sometimes end up doing
> unprofitable if-conversions!
>
> It seems to me that a function called "flow_loops_find" is supposed to
> do *just* analysis, and not transformations. Apparently it now first
> transforms all loops into some canonical form, but that is completely
> inappropriate and unnecessary for some users of this loops analysis.
>
> Is this something that could be easily fixed? E.g. can we make it
> that flow_loops_find only performs transformations if asked to (by
> adding a function argument for that)?
yes. However, you won't be able to use most of the functions for work
with loops then. mark_loop_exit_edges should work, though.
Zdenek