skatrak wrote:

> I am debating introducing a new operation workshare_loop_container which 
> exists only to "contain" a omp.loop_nest between lowering an elemental to 
> lowering the omp.workshare it is contained in.
> 
> so we would have this state:
> 
> ```
> omp.workshare {
>   omp.workshare_loop_container {
>     omp.loop_nest {}
>   }
> }
> ```
> 
> ```
> omp.workshare {
>   omp.wsloop {
>     omp.loop_nest {}
>   }
> }
> ```
> 
> Which may have come from a different lowering/codegen and we are not sure 
> what the semantics of that code would be.
> 
> This new operation can later be reused for the `workdistribute` lowering as 
> well.

I've been thinking about it and I believe we could actually use `omp.wsloop` 
rather than creating a new loop wrapper just for this. The reason is that, 
according to the spec, "the only OpenMP constructs that may be closely nested 
inside a `workshare` construct are the `atomic`, `critical` and `parallel` 
constructs" (5.2 spec, page 246). So there's no other way we could end up with 
an `omp.wsloop` nested directly inside of `omp.workshare` other than to 
represent these elementals.

The only difference is that perhaps we could enforce tighter restrictions to 
the `omp.wsloop` MLIR verifier if it's nested inside `omp.workshare` (e.g. it's 
not composite, it doesn't have any clause specified, etc).

https://github.com/llvm/llvm-project/pull/101445
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to