summaryrefslogtreecommitdiffstats
path: root/polly/lib/CodeGen/IslAst.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/CodeGen/IslAst.cpp')
-rw-r--r--polly/lib/CodeGen/IslAst.cpp41
1 files changed, 37 insertions, 4 deletions
diff --git a/polly/lib/CodeGen/IslAst.cpp b/polly/lib/CodeGen/IslAst.cpp
index 2e628ba00c7..71b43af8229 100644
--- a/polly/lib/CodeGen/IslAst.cpp
+++ b/polly/lib/CodeGen/IslAst.cpp
@@ -255,11 +255,13 @@ astBuildAfterFor(__isl_take isl_ast_node *Node, __isl_keep isl_ast_build *Build,
// tested for parallelism. Test them here to ensure we check all innermost
// loops for parallelism.
if (Payload->IsInnermost && BuildInfo->InParallelFor) {
- if (Payload->IsOutermostParallel)
+ if (Payload->IsOutermostParallel) {
Payload->IsInnermostParallel = true;
- else
- Payload->IsInnermostParallel =
- astScheduleDimIsParallel(Build, BuildInfo->Deps, Payload);
+ } else {
+ if (PollyVectorizerChoice == VECTORIZER_NONE)
+ Payload->IsInnermostParallel =
+ astScheduleDimIsParallel(Build, BuildInfo->Deps, Payload);
+ }
}
if (Payload->IsOutermostParallel)
BuildInfo->InParallelFor = false;
@@ -268,6 +270,31 @@ astBuildAfterFor(__isl_take isl_ast_node *Node, __isl_keep isl_ast_build *Build,
return Node;
}
+static isl_stat astBuildBeforeMark(__isl_keep isl_id *MarkId,
+ __isl_keep isl_ast_build *Build,
+ void *User) {
+ if (!MarkId)
+ return isl_stat_error;
+
+ AstBuildUserInfo *BuildInfo = (AstBuildUserInfo *)User;
+ if (!strcmp(isl_id_get_name(MarkId), "SIMD"))
+ BuildInfo->InParallelFor = true;
+
+ return isl_stat_ok;
+}
+
+static __isl_give isl_ast_node *
+astBuildAfterMark(__isl_take isl_ast_node *Node,
+ __isl_keep isl_ast_build *Build, void *User) {
+ assert(isl_ast_node_get_type(Node) == isl_ast_node_mark);
+ AstBuildUserInfo *BuildInfo = (AstBuildUserInfo *)User;
+ auto *Id = isl_ast_node_mark_get_id(Node);
+ if (!strcmp(isl_id_get_name(Id), "SIMD"))
+ BuildInfo->InParallelFor = false;
+ isl_id_free(Id);
+ return Node;
+}
+
static __isl_give isl_ast_node *AtEachDomain(__isl_take isl_ast_node *Node,
__isl_keep isl_ast_build *Build,
void *User) {
@@ -383,6 +410,12 @@ void IslAst::init(const Dependences &D) {
&BuildInfo);
Build =
isl_ast_build_set_after_each_for(Build, &astBuildAfterFor, &BuildInfo);
+
+ Build = isl_ast_build_set_before_each_mark(Build, &astBuildBeforeMark,
+ &BuildInfo);
+
+ Build = isl_ast_build_set_after_each_mark(Build, &astBuildAfterMark,
+ &BuildInfo);
}
buildRunCondition(Build);
OpenPOWER on IntegriCloud