================ @@ -0,0 +1,399 @@ +//===- LowerWorkshare.cpp - special cases for bufferization -------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// Lower omp workshare construct. +//===----------------------------------------------------------------------===// + +#include <flang/Optimizer/Builder/FIRBuilder.h> +#include <flang/Optimizer/Dialect/FIROps.h> +#include <flang/Optimizer/Dialect/FIRType.h> +#include <flang/Optimizer/HLFIR/HLFIROps.h> +#include <flang/Optimizer/OpenMP/Passes.h> +#include <llvm/ADT/BreadthFirstIterator.h> +#include <llvm/ADT/STLExtras.h> +#include <llvm/ADT/SmallVectorExtras.h> +#include <llvm/ADT/iterator_range.h> +#include <llvm/Support/ErrorHandling.h> +#include <mlir/Dialect/Arith/IR/Arith.h> +#include <mlir/Dialect/LLVMIR/LLVMTypes.h> +#include <mlir/Dialect/OpenMP/OpenMPClauseOperands.h> +#include <mlir/Dialect/OpenMP/OpenMPDialect.h> +#include <mlir/Dialect/SCF/IR/SCF.h> +#include <mlir/IR/BuiltinOps.h> +#include <mlir/IR/IRMapping.h> +#include <mlir/IR/OpDefinition.h> +#include <mlir/IR/PatternMatch.h> +#include <mlir/IR/Visitors.h> +#include <mlir/Interfaces/SideEffectInterfaces.h> +#include <mlir/Support/LLVM.h> +#include <mlir/Transforms/GreedyPatternRewriteDriver.h> + +#include <variant> + +namespace flangomp { +#define GEN_PASS_DEF_LOWERWORKSHARE +#include "flang/Optimizer/OpenMP/Passes.h.inc" +} // namespace flangomp + +#define DEBUG_TYPE "lower-workshare" + +using namespace mlir; + +namespace flangomp { +bool shouldUseWorkshareLowering(Operation *op) { + // TODO this is insufficient, as we could have + // omp.parallel { + // omp.workshare { + // omp.parallel { + // hlfir.elemental {} + // + // Then this hlfir.elemental shall _not_ use the lowering for workshare + // + // Standard says: + // For a parallel construct, the construct is a unit of work with respect to + // the workshare construct. The statements contained in the parallel + // construct are executed by a new thread team. + // + // TODO similarly for single, critical, etc. Need to think through the + // patterns and implement this function. + // + return op->getParentOfType<omp::WorkshareOp>(); +} +} // namespace flangomp + +namespace { + +struct SingleRegion { + Block::iterator begin, end; +}; + +static bool mustParallelizeOp(Operation *op) { + // TODO as in shouldUseWorkshareLowering we be careful not to pick up + // workshare_loop_wrapper in nested omp.parallel ops + // + // e.g. + // + // omp.parallel { + // omp.workshare { + // omp.parallel { + // omp.workshare { + // omp.workshare_loop_wrapper {} + return op + ->walk( + [](omp::WorkshareLoopWrapperOp) { return WalkResult::interrupt(); }) + .wasInterrupted(); +} + +static bool isSafeToParallelize(Operation *op) { + return isa<hlfir::DeclareOp>(op) || isa<fir::DeclareOp>(op) || + isMemoryEffectFree(op); +} + +static mlir::func::FuncOp createCopyFunc(mlir::Location loc, mlir::Type varType, ---------------- tblah wrote:
Could this re-use `createCopyFunc` from `ClauseProcessor.cpp`? It would be good to only implement copyprivate in one place. If not, please could you document the difference between workshare copyprivate and the implementation of the copyprivate clause. https://github.com/llvm/llvm-project/pull/101446 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits