]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* omp-low.c (lower_rec_input_clauses): For if (0) or simdlen (1) set
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 May 2019 21:42:46 +0000 (21:42 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 May 2019 21:42:46 +0000 (21:42 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@271270 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/omp-expand.c
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/simd8.c [new file with mode: 0644]

index 9c69c02116fbea26f7dbf990797dd7fcf835af70..ddcd7e258cc57d3248b9ffaaba936b4aae18ecf9 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2019-05-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/89021
index 89a3a3232671954418ee5b2892891fb6ad2f0bb7..74159734fc8074026b900830034c796cde617019 100644 (file)
@@ -4664,10 +4664,15 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
   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 *region, struct omp_for_data *fd)
       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 *region, struct omp_for_data *fd)
          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;
index 874781ac5b5135242fa492fb365cf75ac225ed77..3a3d09c3b346e58186a68519b1b12b3025261deb 100644 (file)
@@ -3811,6 +3811,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
              || 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;
        }
index 8eb8b253a78b4d1a22b730a4b1ed9768e8d1934d..709f8b73f327bd12aec1271ce291e6fb54b61c4c 100644 (file)
@@ -1,3 +1,7 @@
+2019-05-15  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-c++-common/gomp/simd8.c: New test.
+
 2019-05-15  Marek Polacek  <polacek@redhat.com>
 
        CWG 2096 - constraints on literal unions.
diff --git a/gcc/testsuite/c-c++-common/gomp/simd8.c b/gcc/testsuite/c-c++-common/gomp/simd8.c
new file mode 100644 (file)
index 0000000..11f7411
--- /dev/null
@@ -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;
+}