On Wed, Aug 7, 2024 at 9:33 PM Andi Kleen <[email protected]> wrote:
>
> > > + /* Create chain of switch tests for each case. */
> > > + tree switch_cond = NULL_TREE;
> > > + tree index = gimple_switch_index (sw);
> > > + for (unsigned i = 1; i < gimple_switch_num_labels (sw); i++)
> > > + {
> > > + tree label = gimple_switch_label (sw, i);
> > > + tree case_cond;
> > > + /* This currently cannot happen because tree-cfg lowers
> > > range
> > > + switches with a single destination to COND. */
> >
> > But it should also lower non-range switches with a single destination ...?
> > See convert_single_case_switch. You say
> >
> > switch (i)
> > {
> > case 1:
> > case 5 ... 7:
> > return 42;
> > default:
> > return 0;
> > }
> >
> > doesn't hit here with a CASE_HIGH for the 5 ... 7 CASE_LABEL?
>
> Yes it can actually happen. I'll correct the comment/description
> and add a test case.
>
> But your comment made me realize there is a major bug.
>
> if_convertible_switch_p also needs to check that that the labels don't fall
> through, so the the flow graph is diamond shape. Need some easy way to
> verify that.
Do we verify this for if()s? That is,
if (i)
{
...
goto fallthru;
}
else
{
fallthru:
...
}
For ifs we seem to add the predicate to both edges even in the degenerate case.
>
> -Andi