diff mbox series

[committed] openmp: Fix up vectorization simd call badness computation [PR99100]

Message ID 20210216080301.GA4107426@tucnak
State New
Headers show
Series [committed] openmp: Fix up vectorization simd call badness computation [PR99100] | expand

Commit Message

Jakub Jelinek Feb. 16, 2021, 8:03 a.m. UTC
Hi!

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.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

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.



	Jakub
diff mbox series

Patch

--- gcc/tree-vect-stmts.c.jj	2021-02-11 17:19:52.371826169 +0100
+++ gcc/tree-vect-stmts.c	2021-02-15 10:32:27.434790444 +0100
@@ -3914,9 +3914,9 @@  vectorizable_simd_clone_call (vec_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;
--- gcc/config/i386/i386.c.jj	2021-02-09 12:28:14.092323006 +0100
+++ gcc/config/i386/i386.c	2021-02-15 10:33:17.550216579 +0100
@@ -22657,15 +22657,15 @@  ix86_simd_clone_usable (struct cgraph_no
 	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;
--- gcc/testsuite/gcc.target/i386/pr99100.c.jj	2021-02-15 10:36:54.879727962 +0100
+++ gcc/testsuite/gcc.target/i386/pr99100.c	2021-02-15 10:36:27.185045092 +0100
@@ -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]);
+}