mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 12:00:03 -05:00
Align ix86_{move_max,store_max} with vectorizer.
When none of mprefer-vector-width, avx256_optimal/avx128_optimal,
avx256_store_by_pieces/avx512_store_by_pieces is specified, GCC will
set ix86_{move_max,store_max} as max available vector length except
for AVX part.
if (TARGET_AVX512F_P (opts->x_ix86_isa_flags)
&& TARGET_EVEX512_P (opts->x_ix86_isa_flags2))
opts->x_ix86_move_max = PVW_AVX512;
else
opts->x_ix86_move_max = PVW_AVX128;
So for -mavx2, vectorizer will choose 256-bit for vectorization, but
128-bit is used for struct copy, there could be a potential STLF issue
due to this "misalign".
The patch fixes that.
gcc/ChangeLog:
* config/i386/i386-options.cc (ix86_option_override_internal):
set ix86_{move_max,store_max} to PVW_AVX256 when TARGET_AVX
instead of PVW_AVX128.
gcc/testsuite/ChangeLog:
* gcc.target/i386/pieces-memcpy-10.c: Add -mprefer-vector-width=128.
* gcc.target/i386/pieces-memcpy-6.c: Ditto.
* gcc.target/i386/pieces-memset-38.c: Ditto.
* gcc.target/i386/pieces-memset-40.c: Ditto.
* gcc.target/i386/pieces-memset-41.c: Ditto.
* gcc.target/i386/pieces-memset-42.c: Ditto.
* gcc.target/i386/pieces-memset-43.c: Ditto.
* gcc.target/i386/pieces-strcpy-2.c: Ditto.
* gcc.target/i386/pieces-memcpy-22.c: New test.
* gcc.target/i386/pieces-memset-51.c: New test.
* gcc.target/i386/pieces-strcpy-3.c: New test.
This commit is contained in:
@@ -3023,6 +3023,9 @@ ix86_option_override_internal (bool main_args_p,
|
||||
if (TARGET_AVX512F_P (opts->x_ix86_isa_flags)
|
||||
&& TARGET_EVEX512_P (opts->x_ix86_isa_flags2))
|
||||
opts->x_ix86_move_max = PVW_AVX512;
|
||||
/* Align with vectorizer to avoid potential STLF issue. */
|
||||
else if (TARGET_AVX_P (opts->x_ix86_isa_flags))
|
||||
opts->x_ix86_move_max = PVW_AVX256;
|
||||
else
|
||||
opts->x_ix86_move_max = PVW_AVX128;
|
||||
}
|
||||
@@ -3047,6 +3050,9 @@ ix86_option_override_internal (bool main_args_p,
|
||||
if (TARGET_AVX512F_P (opts->x_ix86_isa_flags)
|
||||
&& TARGET_EVEX512_P (opts->x_ix86_isa_flags2))
|
||||
opts->x_ix86_store_max = PVW_AVX512;
|
||||
/* Align with vectorizer to avoid potential STLF issue. */
|
||||
else if (TARGET_AVX_P (opts->x_ix86_isa_flags))
|
||||
opts->x_ix86_store_max = PVW_AVX256;
|
||||
else
|
||||
opts->x_ix86_store_max = PVW_AVX128;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=sandybridge" } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mprefer-vector-width=128 -mtune=sandybridge" } */
|
||||
|
||||
extern char *dst, *src;
|
||||
|
||||
|
||||
12
gcc/testsuite/gcc.target/i386/pieces-memcpy-22.c
Normal file
12
gcc/testsuite/gcc.target/i386/pieces-memcpy-22.c
Normal file
@@ -0,0 +1,12 @@
|
||||
/* { dg-do compile { target { ! ia32 } } } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=generic" } */
|
||||
|
||||
extern char *dst, *src;
|
||||
|
||||
void
|
||||
foo (void)
|
||||
{
|
||||
__builtin_memcpy (dst, src, 33);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\n\]*%ymm" 2 } } */
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target { ! ia32 } } } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=sandybridge" } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mprefer-vector-width=128 -mtune=sandybridge" } */
|
||||
|
||||
extern char *dst, *src;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mno-avx512f -mavx2 -mtune=sandybridge" } */
|
||||
/* { dg-options "-O2 -mno-avx512f -mavx2 -mprefer-vector-width=128 -mtune=sandybridge" } */
|
||||
|
||||
extern char *dst;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mno-avx512f -mavx2 -mtune=sandybridge" } */
|
||||
/* { dg-options "-O2 -mno-avx512f -mavx2 -mprefer-vector-width=128 -mtune=sandybridge" } */
|
||||
/* Cope with --enable-frame-pointer, Solaris/x86 -mstackrealign default. */
|
||||
/* { dg-additional-options "-fomit-frame-pointer -mno-stackrealign" } */
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=sandybridge -mno-stackrealign" } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mprefer-vector-width=128 -mtune=sandybridge -mno-stackrealign" } */
|
||||
/* Cope with --enable-frame-pointer. */
|
||||
/* { dg-additional-options "-fomit-frame-pointer" } */
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=sandybridge" } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mprefer-vector-width=128 -mtune=sandybridge" } */
|
||||
|
||||
extern char *dst;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=sandybridge" } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mprefer-vector-width=128 -mtune=sandybridge" } */
|
||||
|
||||
extern char *dst;
|
||||
|
||||
|
||||
12
gcc/testsuite/gcc.target/i386/pieces-memset-51.c
Normal file
12
gcc/testsuite/gcc.target/i386/pieces-memset-51.c
Normal file
@@ -0,0 +1,12 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=generic" } */
|
||||
|
||||
extern char *dst;
|
||||
|
||||
void
|
||||
foo (int x)
|
||||
{
|
||||
__builtin_memset (dst, x, 64);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\n\]*%ymm" 2 } } */
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target { ! ia32 } } } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=sandybridge" } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mprefer-vector-width=128 -mtune=sandybridge" } */
|
||||
|
||||
extern char *strcpy (char *, const char *);
|
||||
|
||||
|
||||
15
gcc/testsuite/gcc.target/i386/pieces-strcpy-3.c
Normal file
15
gcc/testsuite/gcc.target/i386/pieces-strcpy-3.c
Normal file
@@ -0,0 +1,15 @@
|
||||
/* { dg-do compile { target { ! ia32 } } } */
|
||||
/* { dg-options "-O2 -mno-avx2 -mavx -mtune=generic" } */
|
||||
|
||||
extern char *strcpy (char *, const char *);
|
||||
|
||||
void
|
||||
foo (char *s)
|
||||
{
|
||||
strcpy (s,
|
||||
"1234567890abcdef123456abcdef5678123456abcdef567abcdef678"
|
||||
"1234567");
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-times "vmovdqa\[ \\t\]+\[^\n\]*%ymm" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\n\]*%ymm" 2 } } */
|
||||
Reference in New Issue
Block a user