[flang-commits] [flang] [llvm] [flang][MIF] Adding lowering for EVENT POST/WAIT statements (PR #210283)
Dan Bonachea via flang-commits
flang-commits at lists.llvm.org
Sun Oct 11 11:39:11 PDT 2026
================
@@ -1407,6 +1552,118 @@ struct MIFImageIndexOpConversion
}
};
+/// Convert mif.event_wait operation to runtime call of 'prif_event_wait*'
+struct MIFEventWaitOpConversion
+ : public mlir::OpRewritePattern<mif::EventWaitOp> {
+ using OpRewritePattern::OpRewritePattern;
+
+ mlir::LogicalResult
+ matchAndRewrite(mif::EventWaitOp op,
+ mlir::PatternRewriter &rewriter) const override {
+ auto mod = op->template getParentOfType<mlir::ModuleOp>();
+ fir::FirOpBuilder builder(rewriter, mod);
+ mlir::Location loc = op.getLoc();
+
+ mlir::Type ptrTy = getBuiltinCptrType(builder, loc);
+ mlir::Type i64Ty = builder.getI64Type();
+ mlir::Type errmsgTy = getPRIFErrmsgType(builder);
+ mlir::FunctionType ftype = mlir::FunctionType::get(
+ builder.getContext(),
+ /*inputs*/
+ {builder.getRefType(ptrTy), builder.getRefType(i64Ty),
+ getPRIFStatType(builder), errmsgTy, errmsgTy},
+ /*results*/ {});
+ mlir::func::FuncOp funcOp =
+ builder.createFunction(loc, getPRIFProcName("event_wait"), ftype);
+
+ mlir::Value untilCount;
+ if (!op.getUntilCount())
+ untilCount =
+ fir::AbsentOp::create(builder, loc, builder.getRefType(i64Ty));
+ else {
+ untilCount = builder.createTemporary(loc, i64Ty);
+ mlir::Value u = builder.createConvert(loc, i64Ty, op.getUntilCount());
+ fir::StoreOp::create(builder, loc, u, untilCount);
+ }
+
+ mlir::Value stat = op.getStat();
+ if (!stat)
+ stat = fir::AbsentOp::create(builder, loc, getPRIFStatType(builder));
+ auto [errmsgArg, errmsgAllocArg] =
+ genErrmsgPRIF(builder, loc, op.getErrmsg());
+
+ mlir::Value cptrEvent =
+ convertRefTypeToCPtrType(builder, loc, op.getEvent());
+ llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
+ builder, loc, ftype, cptrEvent, untilCount, stat, errmsgArg,
+ errmsgAllocArg);
+ fir::CallOp callOp = fir::CallOp::create(builder, loc, funcOp, args);
+ rewriter.replaceOp(op, callOp);
+ return mlir::success();
+ }
+};
+
+/// Convert mif.event_post operation to runtime call of 'prif_event_post'
+struct MIFEventPostOpConversion
+ : public mlir::OpRewritePattern<mif::EventPostOp> {
+ using OpRewritePattern::OpRewritePattern;
+
+ mlir::LogicalResult
+ matchAndRewrite(mif::EventPostOp op,
+ mlir::PatternRewriter &rewriter) const override {
+ auto mod = op->template getParentOfType<mlir::ModuleOp>();
+ fir::FirOpBuilder builder(rewriter, mod);
+ mlir::Location loc = op.getLoc();
+
+ mlir::Type ptrTy = builder.getRefType(builder.getNoneType());
+ mlir::Type i32Ty = builder.getI32Type();
+ mlir::Type i64Ty = builder.getI64Type();
+ mlir::Type errmsgTy = getPRIFErrmsgType(builder);
+ mlir::Type statTy = getPRIFStatType(builder);
+ mlir::Type eventType = fir::unwrapRefType(op.getEvent().getType());
+ mlir::FunctionType ftype;
+ mlir::func::FuncOp funcOp;
+ llvm::SmallVector<mlir::Value> args;
+
+ mlir::Value stat = op.getStat();
+ if (!stat)
+ stat = fir::AbsentOp::create(builder, loc, getPRIFStatType(builder));
+ auto [errmsgArg, errmsgAllocArg] =
+ genErrmsgPRIF(builder, loc, op.getErrmsg());
+
+ bool isCoarray = false;
+ if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(eventType))
+ isCoarray = boxTy.isCoarray();
+
+ if (isCoarray) {
+ ftype = mlir::FunctionType::get(builder.getContext(),
+ /*inputs*/
+ {builder.getRefType(i32Ty), ptrTy,
+ builder.getRefType(i64Ty), statTy,
+ errmsgTy, errmsgTy},
+ /*results*/ {});
+ funcOp =
+ builder.createFunction(loc, getPRIFProcName("event_post"), ftype);
+
+ mlir::Value offset = builder.createTemporary(loc, i64Ty);
+ mlir::Value offset_val =
+ computeOffsetInBytes(builder, loc, op.getEvent());
+ fir::StoreOp::create(builder, loc, offset_val, offset);
+ mlir::Value coarrayHandle = getCoarrayHandle(builder, loc, op.getEvent());
----------------
bonachea wrote:
We currently don't handle coarray dummy argument association or `CHANGE TEAM` coarray association, which are arguably as or more important than these cases. Of course silently emitting incorrect code is undesirable behavior.
As such I'd be inclined to also prohibit these cases for now with a TODO, unless these have a simple fix within the scope of this PR. Specifically, prohibit `ASSOCIATE` on coarray _selector_ and prohibit `SELECT TYPE` with an _associate-name_ and a coarray _selector_ .
https://github.com/llvm/llvm-project/pull/210283
More information about the flang-commits
mailing list