[flang-commits] [flang] [flang] Simplify hlfir.sum total reductions. (PR #119482)
Slava Zakharin via flang-commits
flang-commits at lists.llvm.org
Wed Dec 11 08:28:16 PST 2024
================
@@ -141,42 +155,32 @@ class SumAsElementalConversion : public mlir::OpRewritePattern<hlfir::SumOp> {
static_cast<bool>(sum.getFastmath() &
mlir::arith::FastMathFlags::reassoc);
- // If the mask is present and is a scalar, then we'd better load its value
- // outside of the reduction loop making the loop unswitching easier.
- // Maybe it is worth hoisting it from the elemental operation as well.
- mlir::Value isPresentPred, maskValue;
- if (mask) {
- if (mlir::isa<fir::BaseBoxType>(mask.getType())) {
- // MASK represented by a box might be dynamically optional,
- // so we have to check for its presence before accessing it.
- isPresentPred =
- builder.create<fir::IsPresentOp>(loc, builder.getI1Type(), mask);
- }
-
- if (hlfir::Entity{mask}.isScalar())
- maskValue = genMaskValue(loc, builder, mask, isPresentPred, {});
- }
+ llvm::SmallVector<mlir::Value> extents;
+ if (isTotalReduction)
+ extents = arrayExtents;
+ else
+ extents.push_back(
+ builder.createConvert(loc, builder.getIndexType(), dimExtent));
// NOTE: the outer elemental operation may be lowered into
// omp.workshare.loop_wrapper/omp.loop_nest later, so the reduction
// loop may appear disjoint from the workshare loop nest.
- // Moreover, the inner loop is not strictly nested (due to the reduction
- // starting value initialization), and the above omp dialect operations
- // cannot produce results.
- // It is unclear what we should do about it yet.
- auto doLoop = builder.create<fir::DoLoopOp>(
- loc, one, ub, one, isUnordered, /*finalCountValue=*/false,
- mlir::ValueRange{initValue});
-
- // Address the input array using the reduction loop's IV
- // for the DIM dimension.
- mlir::Value iv = doLoop.getInductionVar();
- llvm::SmallVector<mlir::Value> indices{inputIndices};
- indices.insert(indices.begin() + dimVal - 1, iv);
-
- mlir::OpBuilder::InsertionGuard guard(builder);
- builder.setInsertionPointToStart(doLoop.getBody());
- mlir::Value reductionValue = doLoop.getRegionIterArgs()[0];
+ bool emitWorkshareLoop =
+ isTotalReduction ? flangomp::shouldUseWorkshareLowering(sum) : false;
----------------
vzakhari wrote:
Thank you, Tom! Yes, this won't work without a reduction clause. I will change the code and put a TODO note about this.
https://github.com/llvm/llvm-project/pull/119482
More information about the flang-commits
mailing list