On Wed, 2022-05-25 at 10:36 +0200, Richard Biener via Gcc-patches
wrote:
> This patch adds support to unswitch loops with switch statements
> based on invariant index. It furthermore reworks the cost model
> to allow an overall budget of statements to be created per original
> loop by all unswitching opportunities in the loop. Compared to
> the original all unswitching opportunities in a loop are
> pre-evaluated before the first transform which will allow future
> changes to select the most profitable candidates first.
>
> To efficiently support switch statements the pass now uses
> ranger to simplify switch statements and conditions in loop
> copies based on ranges extracted from the recorded set of
> predicates unswitched.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed to trunk.
>
> Richard.
>
[...snip...]
> diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-10.c
> b/gcc/testsuite/gcc.dg/loop-unswitch-10.c
> new file mode 100644
> index 00000000000..5e4f16e2935
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/loop-unswitch-10.c
> @@ -0,0 +1,56 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-
> optimized" } */
> +
> +int
> +__attribute__((noipa))
> +foo(double *a, double *b, double *c, double *d, double *r, int size,
> int order)
> +{
> + for (int i = 0; i < size; i++)
> + {
> + double tmp, tmp2;
> +
> + switch(order)
> + {
> + case 0:
> + tmp = -8 * a[i];
> + tmp2 = 2 * b[i];
> + break;
> + case 1:
> + tmp = 3 * a[i] - 2 * b[i];
> + tmp2 = 5 * b[i] - 2 * c[i];
> + break;
> + case 2:
> + tmp = 9 * a[i] + 2 * b[i] + c[i];
> + tmp2 = 4 * b[i] + 2 * c[i] + 8 * d[i];
> + break;
> + case 3:
> + tmp = 3 * a[i] + 2 * b[i] - c[i];
> + tmp2 = b[i] - 2 * c[i] + 8 * d[i];
> + break;
> + defaut:
> + __builtin_unreachable ();
I'm guessing "defaut:" here is a typo for "default:" i.e. it's an
unused label named "defaut", when presumably you meant to have an
unreachable default case. Does this affect the loop unswitching logic?
I wonder if we warn for this (or if we can/should?)
Looking at the patch, it seems to also be present in:
gcc/testsuite/gcc.dg/loop-unswitch-11.c
gcc/testsuite/gcc.dg/loop-unswitch-14.c
but I might have missed some.
Dave