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