diff options
Diffstat (limited to 'polly/lib/CodeGen/IslAst.cpp')
-rw-r--r-- | polly/lib/CodeGen/IslAst.cpp | 41 |
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); |