[PATCH] Make switchconv smarter.

Martin Liška mliska@suse.cz
Mon Dec 21 10:20:43 GMT 2020


On 12/18/20 2:19 PM, Martin Liška wrote:
> The patch covers 2 cases mentioned in the PR.

I've got a discussion with Jakub on IRC about the patch and he sees
2 more optimizations:

1) using VRP information (from ranger) - I'm leaving that to him, or I can return
to it in the next stage 1

2) considering 'return;' (in non-void function) for other cases that default
and __builtin_unreachable for other case than the default one

Let's consider:

unsigned
f1(unsigned x) {
   switch (x) {
     case 0:
       return 10;
     case 1:
       __builtin_unreachable ();
     case 2:
       return;
     case 4:
       return;
     case 10:
       return 23;
     case 13:
       return;
   }

   return 2222;
}

2a) that can be possible, but to be honest I don't see many cases where it can help:
     - one can see the warning that is quite obvious:

/home/marxin/Programming/testcases/s.c:9:7: warning: ‘return’ with no value, in function returning non-void
     9 |       return;
       |       ^~~~~~
/home/marxin/Programming/testcases/s.c:2:1: note: declared here
     2 | f1(unsigned x) {
       | ^~

     - we can leverage the information and return any value; there's so work that needs to be done
       in contains_linear_function_p where we need to skip the "random" values and the CFG checking
       code must be adjusted to ignore such cases

2b) the __builtin_unreachable in 'case 1' is removed by unreachable block removal and we can't see it:

   switch (x_2(D)) <default: <L6> [INV], case 0: <L10> [INV], case 2: <L9> [INV], case 4: <L9> [INV], case 10: <L4> [INV], case 13: <L9> [INV]>

Overall, I tend to leave to the next stage1. The pass needs some bigger refactoring and I don't feel
familiar enough to modify it now.

Thanks for understanding,
Martin


More information about the Gcc-patches mailing list