diff options
| author | mingmingl <mingmingl@google.com> | 2025-02-04 11:11:14 -0800 |
|---|---|---|
| committer | mingmingl <mingmingl@google.com> | 2025-02-04 11:11:14 -0800 |
| commit | e91747a92d27ecf799427bf563f9f64f7c4d2447 (patch) | |
| tree | 7aa5a8a9170deec293e152bdf2be804399dcd612 /flang/lib/Lower/OpenMP/DataSharingProcessor.cpp | |
| parent | 3a8d9337d816aef41c3ca1484be8b933a71a3c46 (diff) | |
| parent | 53d6e59b594639417cdbfcfa2d18cea64acb4009 (diff) | |
Merge branch 'main' into users/mingmingl-llvm/spr/sdpglobalvariableusers/mingmingl-llvm/spr/sdpglobalvariable
Diffstat (limited to 'flang/lib/Lower/OpenMP/DataSharingProcessor.cpp')
| -rw-r--r-- | flang/lib/Lower/OpenMP/DataSharingProcessor.cpp | 152 |
1 files changed, 79 insertions, 73 deletions
diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp index 36a8efd43f8c..55f543ca3817 100644 --- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp +++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp @@ -207,6 +207,9 @@ void DataSharingProcessor::collectSymbolsForPrivatization() { } } + // TODO For common blocks, add the underlying objects within the block. Doing + // so, we won't need to explicitely handle block objects (or forget to do + // so). for (auto *sym : explicitlyPrivatizedSymbols) allPrivatizedSymbols.insert(sym); } @@ -235,82 +238,85 @@ void DataSharingProcessor::insertLastPrivateCompare(mlir::Operation *op) { if (auto wrapper = mlir::dyn_cast<mlir::omp::LoopWrapperInterface>(op)) loopOp = mlir::cast<mlir::omp::LoopNestOp>(wrapper.getWrappedLoop()); - bool cmpCreated = false; mlir::OpBuilder::InsertionGuard guard(firOpBuilder); - for (const omp::Clause &clause : clauses) { - if (clause.id != llvm::omp::OMPC_lastprivate) - continue; - if (mlir::isa<mlir::omp::WsloopOp>(op) || - mlir::isa<mlir::omp::SimdOp>(op)) { - // Update the original variable just before exiting the worksharing - // loop. Conversion as follows: - // - // omp.wsloop / omp.simd { omp.wsloop / omp.simd { - // omp.loop_nest { omp.loop_nest { - // ... ... - // store ===> store - // omp.yield %v = arith.addi %iv, %step - // } %cmp = %step < 0 ? %v < %ub : %v > %ub - // } fir.if %cmp { - // fir.store %v to %loopIV - // ^%lpv_update_blk: - // } - // omp.yield - // } - // } - - // Only generate the compare once in presence of multiple LastPrivate - // clauses. - if (cmpCreated) - continue; - cmpCreated = true; - - mlir::Location loc = loopOp.getLoc(); - mlir::Operation *lastOper = loopOp.getRegion().back().getTerminator(); - firOpBuilder.setInsertionPoint(lastOper); - - mlir::Value cmpOp; - llvm::SmallVector<mlir::Value> vs; - vs.reserve(loopOp.getIVs().size()); - for (auto [iv, ub, step] : - llvm::zip_equal(loopOp.getIVs(), loopOp.getLoopUpperBounds(), - loopOp.getLoopSteps())) { - // v = iv + step - // cmp = step < 0 ? v < ub : v > ub - mlir::Value v = firOpBuilder.create<mlir::arith::AddIOp>(loc, iv, step); - vs.push_back(v); - mlir::Value zero = - firOpBuilder.createIntegerConstant(loc, step.getType(), 0); - mlir::Value negativeStep = firOpBuilder.create<mlir::arith::CmpIOp>( - loc, mlir::arith::CmpIPredicate::slt, step, zero); - mlir::Value vLT = firOpBuilder.create<mlir::arith::CmpIOp>( - loc, mlir::arith::CmpIPredicate::slt, v, ub); - mlir::Value vGT = firOpBuilder.create<mlir::arith::CmpIOp>( - loc, mlir::arith::CmpIPredicate::sgt, v, ub); - mlir::Value icmpOp = firOpBuilder.create<mlir::arith::SelectOp>( - loc, negativeStep, vLT, vGT); - - if (cmpOp) { - cmpOp = firOpBuilder.create<mlir::arith::AndIOp>(loc, cmpOp, icmpOp); - } else { - cmpOp = icmpOp; - } - } + bool hasLastPrivate = [&]() { + for (const semantics::Symbol *sym : allPrivatizedSymbols) { + if (const auto *commonDet = + sym->detailsIf<semantics::CommonBlockDetails>()) { + for (const auto &mem : commonDet->objects()) + if (mem->test(semantics::Symbol::Flag::OmpLastPrivate)) + return true; + } else if (sym->test(semantics::Symbol::Flag::OmpLastPrivate)) + return true; + } - auto ifOp = firOpBuilder.create<fir::IfOp>(loc, cmpOp, /*else*/ false); - firOpBuilder.setInsertionPointToStart(&ifOp.getThenRegion().front()); - for (auto [v, loopIV] : llvm::zip_equal(vs, loopIVs)) { - assert(loopIV && "loopIV was not set"); - firOpBuilder.createStoreWithConvert(loc, v, loopIV); - } - lastPrivIP = firOpBuilder.saveInsertionPoint(); - } else if (mlir::isa<mlir::omp::SectionsOp>(op)) { - // Already handled by genOMP() - } else { - TODO(converter.getCurrentLocation(), - "lastprivate clause in constructs other than " - "simd/worksharing-loop"); + return false; + }(); + + if (!hasLastPrivate) + return; + + if (mlir::isa<mlir::omp::WsloopOp>(op) || mlir::isa<mlir::omp::SimdOp>(op)) { + // Update the original variable just before exiting the worksharing + // loop. Conversion as follows: + // + // omp.wsloop / omp.simd { omp.wsloop / omp.simd { + // omp.loop_nest { omp.loop_nest { + // ... ... + // store ===> store + // omp.yield %v = arith.addi %iv, %step + // } %cmp = %step < 0 ? %v < %ub : %v > %ub + // } fir.if %cmp { + // fir.store %v to %loopIV + // ^%lpv_update_blk: + // } + // omp.yield + // } + // } + mlir::Location loc = loopOp.getLoc(); + mlir::Operation *lastOper = loopOp.getRegion().back().getTerminator(); + firOpBuilder.setInsertionPoint(lastOper); + + mlir::Value cmpOp; + llvm::SmallVector<mlir::Value> vs; + vs.reserve(loopOp.getIVs().size()); + for (auto [iv, ub, step] : + llvm::zip_equal(loopOp.getIVs(), loopOp.getLoopUpperBounds(), + loopOp.getLoopSteps())) { + // v = iv + step + // cmp = step < 0 ? v < ub : v > ub + mlir::Value v = firOpBuilder.create<mlir::arith::AddIOp>(loc, iv, step); + vs.push_back(v); + mlir::Value zero = + firOpBuilder.createIntegerConstant(loc, step.getType(), 0); + mlir::Value negativeStep = firOpBuilder.create<mlir::arith::CmpIOp>( + loc, mlir::arith::CmpIPredicate::slt, step, zero); + mlir::Value vLT = firOpBuilder.create<mlir::arith::CmpIOp>( + loc, mlir::arith::CmpIPredicate::slt, v, ub); + mlir::Value vGT = firOpBuilder.create<mlir::arith::CmpIOp>( + loc, mlir::arith::CmpIPredicate::sgt, v, ub); + mlir::Value icmpOp = firOpBuilder.create<mlir::arith::SelectOp>( + loc, negativeStep, vLT, vGT); + + if (cmpOp) + cmpOp = firOpBuilder.create<mlir::arith::AndIOp>(loc, cmpOp, icmpOp); + else + cmpOp = icmpOp; } + + auto ifOp = firOpBuilder.create<fir::IfOp>(loc, cmpOp, /*else*/ false); + firOpBuilder.setInsertionPointToStart(&ifOp.getThenRegion().front()); + for (auto [v, loopIV] : llvm::zip_equal(vs, loopIVs)) { + assert(loopIV && "loopIV was not set"); + firOpBuilder.createStoreWithConvert(loc, v, loopIV); + } + lastPrivIP = firOpBuilder.saveInsertionPoint(); + } else if (mlir::isa<mlir::omp::SectionsOp>(op)) { + // Already handled by genOMP() + } else { + TODO(converter.getCurrentLocation(), + "lastprivate clause in constructs other than " + "simd/worksharing-loop"); } } |
