Commit fed2a43c by Jakub Jelinek Committed by Jakub Jelinek

omp-low.c (lower_rec_input_clauses): For if (0) or simdlen (1) set max_vf to 1.

	* 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.

From-SVN: r271270
parent c42b72a7
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> 2019-05-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89021 PR target/89021
......
...@@ -4664,10 +4664,15 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd) ...@@ -4664,10 +4664,15 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
tree *counts = NULL; tree *counts = NULL;
int i; int i;
int safelen_int = INT_MAX; int safelen_int = INT_MAX;
bool dont_vectorize = false;
tree safelen = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), tree safelen = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
OMP_CLAUSE_SAFELEN); OMP_CLAUSE_SAFELEN);
tree simduid = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt), tree simduid = omp_find_clause (gimple_omp_for_clauses (fd->for_stmt),
OMP_CLAUSE__SIMDUID_); 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; tree n1, n2;
if (safelen) if (safelen)
...@@ -4681,6 +4686,12 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd) ...@@ -4681,6 +4686,12 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
if (safelen_int == 1) if (safelen_int == 1)
safelen_int = 0; 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); type = TREE_TYPE (fd->loop.v);
entry_bb = region->entry; entry_bb = region->entry;
cont_bb = region->cont; cont_bb = region->cont;
...@@ -4965,6 +4976,8 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd) ...@@ -4965,6 +4976,8 @@ expand_omp_simd (struct omp_region *region, struct omp_for_data *fd)
loop->force_vectorize = true; loop->force_vectorize = true;
cfun->has_force_vectorize_loops = true; cfun->has_force_vectorize_loops = true;
} }
else if (dont_vectorize)
loop->dont_vectorize = true;
} }
else if (simduid) else if (simduid)
cfun->has_simduid_loops = true; cfun->has_simduid_loops = true;
......
...@@ -3811,6 +3811,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist, ...@@ -3811,6 +3811,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
|| is_variable_sized (OMP_CLAUSE_DECL (c))) || is_variable_sized (OMP_CLAUSE_DECL (c)))
sctx.max_vf = 1; sctx.max_vf = 1;
break; 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: default:
continue; continue;
} }
......
2019-05-15 Jakub Jelinek <jakub@redhat.com>
* c-c++-common/gomp/simd8.c: New test.
2019-05-15 Marek Polacek <polacek@redhat.com> 2019-05-15 Marek Polacek <polacek@redhat.com>
CWG 2096 - constraints on literal unions. CWG 2096 - constraints on literal unions.
......
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment