aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/config/i386/i386.c6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr99100.c22
-rw-r--r--gcc/tree-vect-stmts.c4
3 files changed, 27 insertions, 5 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 48f9aa0..2fe182f 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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;
diff --git a/gcc/testsuite/gcc.target/i386/pr99100.c b/gcc/testsuite/gcc.target/i386/pr99100.c
new file mode 100644
index 0000000..a17fe28
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr99100.c
@@ -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]);
+}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 083f38b..85d3161 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -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;