[PATCH] Loop unswitching: support gswitch statements.

Martin Liška mliska@suse.cz
Tue Nov 23 16:36:10 GMT 2021


On 11/23/21 16:20, Martin Liška wrote:
> Sure, so for e.g. case 1 ... 5 we would need to create a new unswitch_predicate
> with 1 <= index && index <= 5 tree predicate (and the corresponding irange range).
> Later once we unswitch on it, we should use a special unreachable_flag that will
> be used for marking of dead edges (similarly how we fold gconds to boolean_{false/true}_node.
> Does it make sense?

I have thought about it more and it's not enough. What we really want is having a irange
for *each edge* (2 for gconds and multiple for gswitchs). Once we select a unswitch_predicate,
then we need to fold_range in true/false loop all these iranges. Doing that we can handle situations like:

if (index < 1)
    do_something1

if (index > 2)
    do_something2

switch (index)
    case 1 ... 2:
      do_something;
...

as seen the once we unswitch on 'index < 1' and 'index > 2', then the first case will be taken in the false_edge
of 'index > 2' loop unswitching.

Martin


More information about the Gcc-patches mailing list