[llvm-commits] [PATCH][polly] isl: Detect openmp parallel loops
Sebastian Pop
spop at codeaurora.org
Thu Dec 13 08:27:00 PST 2012
Tobias Grosser wrote:
> On 12/13/2012 08:15 AM, Sebastian Pop wrote:
> >Tobias Grosser wrote:
> >>>On 12/13/2012 07:05 AM, Sebastian Pop wrote:
> >>>
> >>>> > }
> >>>> >@@ -126,6 +131,7 @@ static struct AstNodeUserInfo *allocateAstNodeUserInfo() {
> >>>> > struct AstNodeUserInfo *NodeInfo;
> >>>> > NodeInfo = (struct AstNodeUserInfo *) malloc(sizeof(struct AstNodeUserInfo));
> >>>> > NodeInfo->IsOutermostParallel = 0;
> >>>> >+ NodeInfo->IsInnermostParallel = 0;
> >>>> > return NodeInfo;
> >>>> > }
> >>>> >
> >>>> >@@ -223,6 +229,38 @@ static __isl_give isl_id *astBuildBeforeFor(__isl_keep isl_ast_build *Build,
> >>>> > return Id;
> >>>> > }
> >>>> >
> >>>> >+// Returns 0 when Node contains loops, otherwise returns -1.
> >>>> >+static int hasLoops(__isl_take isl_ast_node *Node, void *User) {
> >>>You should use 'bool' here.
> >Nop, ISL documents the interface for isl_ast_node_list_foreach: it should be
> >exactly what I have here, returns 0 on success and -1 on fail.
> >
> >>>Could you call it containsLoops?
> >I will change this name.
> >
> >>>Why are you passing around 'User'?
> >>>As far as I can see, it is never used.
> >>>
> >I don't need User: ISL says it needs it: here is the relevant part of the manual
> >
> > int isl_set_list_foreach(__isl_keep isl_set_list *list,
> > int (*fn)(__isl_take isl_set *el, void *user),
> > void *user);
>
> OK.
>
> You may want to add a comment to the top of the containsLoops
> function to point this out. Alternatively, you can move the
> containsLoops() function to the C++ style interface and write a
> one-line wrapper function that can be used as callback.
I think I also like the wrapper way as well. I will also add the comment to
explain why the search function returns these unusual values.
>
> >>>> >+ if (!Node)
> >>>> >+ return -1;
> >>>> >+
> >>>> >+ switch (isl_ast_node_get_type(Node)) {
> >>>> >+ case isl_ast_node_for:
> >>>> >+ isl_ast_node_free(Node);
> >>>> >+ return 0;
> >>>> >+ case isl_ast_node_block: {
> >>>> >+ isl_ast_node_list *List = isl_ast_node_block_get_children(Node);
> >>>> >+ int Res = isl_ast_node_list_foreach(List, &hasLoops, NULL);
> >>>> >+ isl_ast_node_list_free(List);
> >>>> >+ isl_ast_node_free(Node);
> >>>> >+ return Res;
> >>>> >+ }
> >>>> >+ case isl_ast_node_if: {
> >>>> >+ int Res = -1;
> >>>> >+ if (0 == hasLoops(isl_ast_node_if_get_then(Node), NULL) ||
> >>>
> >>>Why do you compare to '0'. You should return a boolean in hasLoops
> >>>and just rely on its value.
> >No, because hasLoops is a recursive function relying on the ISL way to traverse
> >lists of isl_ast_nodes.
> >
> >>>
> >>>Also, Instead of the '||' you may decide to just return if the first
> >>>part of the if-condition is false.
> >>>
> >And that would make the code longer, as I have to free Node before returning.
>
> I have no strong opinion about this. Go whatever way you prefer.
I will keep the ||
>
> >>>> >@@ -50,6 +50,6 @@ ret:
> >>>> > ; memory accesses, that would happen if n >= 1024.
> >>>> > ;
> >>>> > ; CHECK: for (int c1 = 0; c1 < n; c1 += 1)
> >>>> >-; CHECK: #pragma omp parallel for
> >>>> >+; CHECK: #pragma vector for
> >>>> > ; CHECK: for (int c3 = 0; c3 < n; c3 += 1)
> >>>> > ; CHECK: Stmt_loop_body(c1, c3);
> >>>
> >>>
> >>>It may make sense to have another option. Or, if possible, to allow
> >>>optional parameters such as:
> >>>
> >>>-polly-ast-detect-parallelism=Outermost|Innermost|Both|None
> >>>
> >I prefer doing that in a separate patch.
>
> As the current patch does not reduce the OpenMP test coverage, this
> is fine with me.
>
> Except the minor comments above, the attached patch looks good.
> Tobi
Ok, let me address the wrapper issue and I will then commit the patch.
Thanks for your review,
Sebastian
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
More information about the llvm-commits
mailing list