mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-25 23:21:42 +08:00
[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>
|
2018-12-07 Jeff Law <law@redhat.com>
|
||||||
|
|
||||||
PR middle-end/87813
|
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_fuse_string (const char*, struct tune_params*);
|
||||||
static void aarch64_parse_tune_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
|
static const struct aarch64_tuning_override_function
|
||||||
aarch64_tuning_override_functions[] =
|
aarch64_tuning_override_functions[] =
|
||||||
{
|
{
|
||||||
{ "fuse", aarch64_parse_fuse_string },
|
{ "fuse", aarch64_parse_fuse_string },
|
||||||
{ "tune", aarch64_parse_tune_string },
|
{ "tune", aarch64_parse_tune_string },
|
||||||
|
{ "sve_width", aarch64_parse_sve_width_string },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -10834,6 +10836,37 @@ aarch64_parse_tune_string (const char *tune_string,
|
|||||||
"tune=");
|
"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
|
/* 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
|
we understand. If it is, extract the option string and handoff to
|
||||||
the appropriate function. */
|
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>
|
2018-12-07 Jeff Law <law@redhat.com>
|
||||||
|
|
||||||
PR middle-end/87813
|
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…
x
Reference in New Issue
Block a user