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