mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-15 15:11:15 +08:00
openmp: Fix up vectorization simd call badness computation [PR99100]
As mentioned in the PR, ix86_simd_clone_usable didn't make it more desirable to use 'e' mangled AVX512F entrypoints over 'd' mangled ones (AVX2) with the same simdlen. This patch fixes that. I have tweaked the generic code too to make more room for these target specific badness factors. 2021-02-16 Jakub Jelinek <jakub@redhat.com> PR target/99100 * tree-vect-stmts.c (vectorizable_simd_clone_call): For num_calls != 1 multiply by 4096 and for inbranch by 8192. * config/i386/i386.c (ix86_simd_clone_usable): For TARGET_AVX512F, return 3, 2 or 1 for mangle letters 'b', 'c' or 'd'. * gcc.target/i386/pr99100.c: New test.
This commit is contained in:
parent
0b5c58c2dc
commit
1531f39268
@ -22657,15 +22657,15 @@ ix86_simd_clone_usable (struct cgraph_node *node)
|
||||
return -1;
|
||||
if (!TARGET_AVX)
|
||||
return 0;
|
||||
return TARGET_AVX2 ? 2 : 1;
|
||||
return TARGET_AVX512F ? 3 : TARGET_AVX2 ? 2 : 1;
|
||||
case 'c':
|
||||
if (!TARGET_AVX)
|
||||
return -1;
|
||||
return TARGET_AVX2 ? 1 : 0;
|
||||
return TARGET_AVX512F ? 2 : TARGET_AVX2 ? 1 : 0;
|
||||
case 'd':
|
||||
if (!TARGET_AVX2)
|
||||
return -1;
|
||||
return 0;
|
||||
return TARGET_AVX512F ? 1 : 0;
|
||||
case 'e':
|
||||
if (!TARGET_AVX512F)
|
||||
return -1;
|
||||
|
22
gcc/testsuite/gcc.target/i386/pr99100.c
Normal file
22
gcc/testsuite/gcc.target/i386/pr99100.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* PR target/99100 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-Ofast -mavx512f -fopenmp-simd -mprefer-vector-width=512" } */
|
||||
/* { dg-final { scan-assembler "_ZGVeN8v_myfunc" } } */
|
||||
/* { dg-final { scan-assembler "_ZGVeN8v_sin" } } */
|
||||
|
||||
#pragma omp declare simd notinbranch
|
||||
double sin (double x);
|
||||
#pragma omp declare simd simdlen(8) notinbranch
|
||||
__attribute__((const)) double myfunc (double x);
|
||||
|
||||
#define N 1024
|
||||
__attribute__((__aligned__ (256))) double a[N], b[N], c[N];
|
||||
|
||||
void
|
||||
foo ()
|
||||
{
|
||||
for (int i = 0; i < N; i++)
|
||||
a[i] = myfunc (b[i]);
|
||||
for (int i = 0; i < N; i++)
|
||||
c[i] = sin (b[i]);
|
||||
}
|
@ -3914,9 +3914,9 @@ vectorizable_simd_clone_call (vec_info *vinfo, stmt_vec_info stmt_info,
|
||||
|| n->simdclone->nargs != nargs)
|
||||
continue;
|
||||
if (num_calls != 1)
|
||||
this_badness += exact_log2 (num_calls) * 1024;
|
||||
this_badness += exact_log2 (num_calls) * 4096;
|
||||
if (n->simdclone->inbranch)
|
||||
this_badness += 2048;
|
||||
this_badness += 8192;
|
||||
int target_badness = targetm.simd_clone.usable (n);
|
||||
if (target_badness < 0)
|
||||
continue;
|
||||
|
Loading…
x
Reference in New Issue
Block a user