[committed] Small OpenMP simd if and simdlen clause tweak

Message ID 20190515214512.GO19695@tucnak
State New
Headers show
Series
  • [committed] Small OpenMP simd if and simdlen clause tweak
Related show

Commit Message

Jakub Jelinek May 15, 2019, 9:45 p.m.
Hi!

If simdlen clause is specified, it is the preferred number of concurrent
simd lanes in the loop, though if if clause is specified and evaluates to
false, the preferred number of simd lanes is 1 (i.e. no vectorization).

This patch handles just the easy part, when simdlen argument is 1 or when
if clause has constant argument which is false.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk,
queued for eventual backport to 9.2.

2019-05-15  Jakub Jelinek  <jakub@redhat.com>

	* omp-low.c (lower_rec_input_clauses): For if (0) or simdlen (1) set
	max_vf to 1.
	* omp-expand.c (expand_omp_simd): For if (0) or simdlen (1) clear
	safelen_int and set loop->dont_vectorize.

	* c-c++-common/gomp/simd8.c: New test.


	Jakub

Patch

--- gcc/omp-low.c.jj	2019-03-28 23:32:44.813393829 +0100
+++ gcc/omp-low.c	2019-05-15 14:56:19.564136934 +0200
@@ -3811,6 +3811,14 @@  lower_rec_input_clauses (tree clauses, g
 	      || is_variable_sized (OMP_CLAUSE_DECL (c)))
 	    sctx.max_vf = 1;
 	  break;
+	case OMP_CLAUSE_IF:
+	  if (integer_zerop (OMP_CLAUSE_IF_EXPR (c)))
+	    sctx.max_vf = 1;
+	  break;
+        case OMP_CLAUSE_SIMDLEN:
+	  if (integer_onep (OMP_CLAUSE_SIMDLEN_EXPR (c)))
+	    sctx.max_vf = 1;
+	  break;
 	default:
 	  continue;
 	}
--- gcc/omp-expand.c.jj	2019-03-07 20:45:39.170938327 +0100
+++ gcc/omp-expand.c	2019-05-15 14:55:22.493079461 +0200
@@ -4664,10 +4664,15 @@  expand_omp_simd (struct omp_region *regi
   tree *counts = NULL;
   int i;
   int safelen_int = INT_MAX;
+  bool dont_vectorize = false;
   tree safelen = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
 				  OMP_CLAUSE_SAFELEN);
   tree simduid = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
 				  OMP_CLAUSE__SIMDUID_);
+  tree ifc = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
+			      OMP_CLAUSE_IF);
+  tree simdlen = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
+				  OMP_CLAUSE_SIMDLEN);
   tree n1, n2;
 
   if (safelen)
@@ -4681,6 +4686,12 @@  expand_omp_simd (struct omp_region *regi
       if (safelen_int == 1)
 	safelen_int = 0;
     }
+  if ((ifc && integer_zerop (OMP_CLAUSE_IF_EXPR (ifc)))
+      || (simdlen && integer_onep (OMP_CLAUSE_SIMDLEN_EXPR (simdlen))))
+    {
+      safelen_int = 0;
+      dont_vectorize = true;
+    }
   type = TREE_TYPE (fd->loop.v);
   entry_bb = region->entry;
   cont_bb = region->cont;
@@ -4965,6 +4976,8 @@  expand_omp_simd (struct omp_region *regi
 	  loop->force_vectorize = true;
 	  cfun->has_force_vectorize_loops = true;
 	}
+      else if (dont_vectorize)
+	loop->dont_vectorize = true;
     }
   else if (simduid)
     cfun->has_simduid_loops = true;
--- gcc/testsuite/c-c++-common/gomp/simd8.c.jj	2019-05-15 14:24:44.656430757 +0200
+++ gcc/testsuite/c-c++-common/gomp/simd8.c	2019-05-15 15:44:08.161617663 +0200
@@ -0,0 +1,37 @@ 
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O3 -fdump-tree-vect-details" } */
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops in function" 4 "vect" } } */
+
+int a[1024];
+
+void
+foo (void)
+{
+  #pragma omp simd if (0)
+  for (int i = 0; i < 1024; ++i)
+    a[i] = a[i] + 1;
+}
+
+void
+bar (void)
+{
+  #pragma omp simd if (0) safelen (256) simdlen (8)
+  for (int i = 0; i < 512; ++i)
+    a[i] = a[i] + 1;
+}
+
+void
+baz (void)
+{
+  #pragma omp simd safelen (256) simdlen (1)
+  for (int i = 0; i < 512; ++i)
+    a[i] = a[i] + 1;
+}
+
+void
+qux (void)
+{
+  #pragma omp simd simdlen (1) if (1)
+  for (int i = 0; i < 512; ++i)
+    a[i] = a[i] + 1;
+}