[AArch64][2/2] Add sve_width -moverride tunable
On top of the previous patch that implements TARGET_ESTIMATED_POLY_VALUE and adds an sve_width tuning field to the CPU structs, this patch implements an -moverride knob to adjust this sve_width field to allow for experimentation. Again, reminder that this only has an effect when compiling for VLA-SVE that is, without msve-vector-bits=<foo>. This just adjusts tuning heuristics in the compiler,, like profitability thresholds for vectorised versioned loops, and others. It can be used, for example like -moverride=sve_width=256 to set the sve_width tuning field to 256. Widths outside of the accepted SVE widths [128 - 2048] are rejected as you'd expect. * config/aarch64/aarch64.c (aarch64_tuning_override_functions): Add sve_width entry. (aarch64_parse_sve_width_string): Define. * gcc.target/aarch64/sve/override_sve_width_1.c: New test. From-SVN: r266898
This commit is contained in:
parent
c844c4028f
commit
886f092f59
@ -1,3 +1,9 @@
|
||||
2018-12-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* config/aarch64/aarch64.c (aarch64_tuning_override_functions): Add
|
||||
sve_width entry.
|
||||
(aarch64_parse_sve_width_string): Define.
|
||||
|
||||
2018-12-07 Jeff Law <law@redhat.com>
|
||||
|
||||
PR middle-end/87813
|
||||
|
@ -1086,12 +1086,14 @@ struct aarch64_tuning_override_function
|
||||
|
||||
static void aarch64_parse_fuse_string (const char*, struct tune_params*);
|
||||
static void aarch64_parse_tune_string (const char*, struct tune_params*);
|
||||
static void aarch64_parse_sve_width_string (const char*, struct tune_params*);
|
||||
|
||||
static const struct aarch64_tuning_override_function
|
||||
aarch64_tuning_override_functions[] =
|
||||
{
|
||||
{ "fuse", aarch64_parse_fuse_string },
|
||||
{ "tune", aarch64_parse_tune_string },
|
||||
{ "sve_width", aarch64_parse_sve_width_string },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
@ -10834,6 +10836,37 @@ aarch64_parse_tune_string (const char *tune_string,
|
||||
"tune=");
|
||||
}
|
||||
|
||||
/* Parse the sve_width tuning moverride string in TUNE_STRING.
|
||||
Accept the valid SVE vector widths allowed by
|
||||
aarch64_sve_vector_bits_enum and use it to override sve_width
|
||||
in TUNE. */
|
||||
|
||||
static void
|
||||
aarch64_parse_sve_width_string (const char *tune_string,
|
||||
struct tune_params *tune)
|
||||
{
|
||||
int width = -1;
|
||||
|
||||
int n = sscanf (tune_string, "%d", &width);
|
||||
if (n == EOF)
|
||||
{
|
||||
error ("invalid format for sve_width");
|
||||
return;
|
||||
}
|
||||
switch (width)
|
||||
{
|
||||
case SVE_128:
|
||||
case SVE_256:
|
||||
case SVE_512:
|
||||
case SVE_1024:
|
||||
case SVE_2048:
|
||||
break;
|
||||
default:
|
||||
error ("invalid sve_width value: %d", width);
|
||||
}
|
||||
tune->sve_width = (enum aarch64_sve_vector_bits_enum) width;
|
||||
}
|
||||
|
||||
/* Parse TOKEN, which has length LENGTH to see if it is a tuning option
|
||||
we understand. If it is, extract the option string and handoff to
|
||||
the appropriate function. */
|
||||
|
@ -1,3 +1,7 @@
|
||||
2018-12-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* gcc.target/aarch64/sve/override_sve_width_1.c: New test.
|
||||
|
||||
2018-12-07 Jeff Law <law@redhat.com>
|
||||
|
||||
PR middle-end/87813
|
||||
|
@ -0,0 +1,9 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O3 -moverride=sve_width=512" } */
|
||||
|
||||
void __attribute__((noinline, noclone))
|
||||
vadd (int *dst, int *op1, int *op2, int count)
|
||||
{
|
||||
for (int i = 0; i < count; ++i)
|
||||
dst[i] = op1[i] + op2[i];
|
||||
}
|
Loading…
Reference in New Issue
Block a user