[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