================ @@ -335,49 +336,129 @@ static void parallelizeRegion(Region &sourceRegion, Region &targetRegion, for (auto [i, opOrSingle] : llvm::enumerate(regions)) { bool isLast = i + 1 == regions.size(); if (std::holds_alternative<SingleRegion>(opOrSingle)) { - OpBuilder singleBuilder(sourceRegion.getContext()); - Block *singleBlock = new Block(); - singleBuilder.setInsertionPointToStart(singleBlock); - OpBuilder allocaBuilder(sourceRegion.getContext()); Block *allocaBlock = new Block(); allocaBuilder.setInsertionPointToStart(allocaBlock); - OpBuilder parallelBuilder(sourceRegion.getContext()); - Block *parallelBlock = new Block(); - parallelBuilder.setInsertionPointToStart(parallelBlock); - - auto [allParallelized, copyprivateVars] = - moveToSingle(std::get<SingleRegion>(opOrSingle), allocaBuilder, - singleBuilder, parallelBuilder); - if (allParallelized) { - // The single region was not required as all operations were safe to - // parallelize - assert(copyprivateVars.empty()); - assert(allocaBlock->empty()); - delete singleBlock; + it = block.begin(); + while (&*it != terminator) + if (isa<hlfir::SumOp>(it)) + break; + else + it++; + + if (auto sumOp = dyn_cast<hlfir::SumOp>(it)) { + /// Implementation: + /// Intrinsic function `SUM` operations + /// -- + /// x = sum(array) + /// + /// is converted to + /// + /// !$omp parallel do + /// do i = 1, size(array) + /// x = x + array(i) ---------------- tblah wrote:
I don't think this will work. `x` will be simultaneously updated from all of the threads - overwriting each-other. It is a classic race condition. I think you need to add a reduction clause to the wsloop operation reducing `x` with `+`. https://github.com/llvm/llvm-project/pull/113082 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits