Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions flang/include/flang/Optimizer/Builder/IntrinsicCall.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ struct IntrinsicLibrary {
void genExecuteCommandLine(mlir::ArrayRef<fir::ExtendedValue> args);
fir::ExtendedValue genEtime(std::optional<mlir::Type>,
mlir::ArrayRef<fir::ExtendedValue> args);
void genEventQuery(llvm::ArrayRef<fir::ExtendedValue>);
mlir::Value genTimef(mlir::Type resultType, llvm::ArrayRef<mlir::Value> args);
mlir::Value genExponent(mlir::Type, llvm::ArrayRef<mlir::Value>);
fir::ExtendedValue genExtendsTypeOf(mlir::Type,
Expand Down
26 changes: 26 additions & 0 deletions flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,13 @@ def mif_DeallocCoarrayOp
// consistency semantics of surrounding accesses in the multi-image execution.
// For now we've modeled this by *deliberately* omitting mlir::MemoryEffects
// on these operations, to ensure analysis treats these ops conservatively.
//
// EVENT QUERY is not an image control statement, but it is an atomic
Comment thread
JDPailleux marked this conversation as resolved.
Resolved
// observation of the event variable (F23 16.9.82 p3), whose value other
// images may change at any time.
// Two queries therefore don't necessarily return the same value, and an
// unused query cannot be erased either, since it must still error-terminate
// when it fails without STAT. It follows the same modeling as above.
//===----------------------------------------------------------------------===//
def mif_EventPostOp : mif_Op<"event_post", [AttrSizedOperandSegments]> {
let summary = "Posts an event.";
Expand Down Expand Up @@ -644,4 +651,23 @@ def mif_EventWaitOp : mif_Op<"event_wait", [AttrSizedOperandSegments]> {
}];
}

def mif_EventQueryOp : mif_Op<"event_query", []> {
let summary = "Query the count of an event on the calling image.";
let description = [{
Argument: `event` shall be a noncoindexed variable of type EVENT_TYPE from the
intrinsic module ISO_FORTRAN_ENV.
Result: `count` shall be an integer scalar and indicate the current count
of EVENT.
}];

let arguments = (ins Arg<AnyRefOrBoxType>:$event,
Arg<Optional<AnyReferenceLike>>:$stat);
let results = (outs AnyInteger:$count);
let assemblyFormat = [{
$event
(`stat` $stat^ )?
attr-dict `:` functional-type(operands, results)
}];
}

#endif // FORTRAN_DIALECT_MIF_MIF_OPS
21 changes: 21 additions & 0 deletions flang/lib/Optimizer/Builder/IntrinsicCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,12 @@ static constexpr IntrinsicHandler handlers[]{
&I::genEtime,
{{{"values", asBox}, {"time", asBox}}},
/*isElemental=*/false},
{"event_query",
&I::genEventQuery,
{{{"event", asAddr},
{"count", asAddr},
{"stat", asAddr, handleDynamicOptional}}},
Comment thread
MattPD marked this conversation as resolved.
Resolved
/*isElemental=*/false},
{"execute_command_line",
&I::genExecuteCommandLine,
{{{"command", asBox},
Expand Down Expand Up @@ -4036,6 +4042,21 @@ IntrinsicLibrary::genEtime(std::optional<mlir::Type> resultType,
return {};
}

// EVENT_QUERY
void IntrinsicLibrary::genEventQuery(llvm::ArrayRef<fir::ExtendedValue> args) {
checkCoarrayEnabled(loc, options);
assert(args.size() == 3);
Comment thread
JDPailleux marked this conversation as resolved.
Resolved

mlir::Value eventVarPtr = fir::getBase(args[0]);
mlir::Value count = fir::getBase(args[1]);
mlir::Value stat = fir::getBase(args[2]);

mlir::Type countTy = fir::unwrapPassByRefType(count.getType());
mlir::Value res =
mif::EventQueryOp::create(builder, loc, countTy, eventVarPtr, stat);
fir::StoreOp::create(builder, loc, res, count);
Comment thread
JDPailleux marked this conversation as resolved.
Resolved
}

// EXIT
void IntrinsicLibrary::genExit(llvm::ArrayRef<fir::ExtendedValue> args) {
assert(args.size() == 1);
Expand Down
61 changes: 50 additions & 11 deletions flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1671,6 +1671,45 @@ struct MIFEventPostOpConversion
}
};

/// Convert mif.event_query operation to runtime call of 'prif_event_query'
struct MIFEventQueryOpConversion
: public mlir::OpRewritePattern<mif::EventQueryOp> {
using OpRewritePattern::OpRewritePattern;

mlir::LogicalResult
matchAndRewrite(mif::EventQueryOp 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::FunctionType ftype = mlir::FunctionType::get(
builder.getContext(),
/*inputs*/
{builder.getRefType(ptrTy), builder.getRefType(i64Ty),
getPRIFStatType(builder)},
/*results*/ {});
mlir::func::FuncOp funcOp =
builder.createFunction(loc, getPRIFProcName("event_query"), ftype);

mlir::Value count = builder.createTemporary(loc, i64Ty);
mlir::Value stat = genStatPRIF(builder, loc, op.getStat());

mlir::Value cptrEvent =
convertRefTypeToCPtrType(builder, loc, op.getEvent());
llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
builder, loc, ftype, cptrEvent, count, stat);
fir::CallOp::create(builder, loc, funcOp, args);

count = fir::LoadOp::create(builder, loc, count).getResult();
count = builder.createConvert(loc, op.getType(), count);
rewriter.replaceOp(op, count);
return mlir::success();
}
};

static void genCoarrayHandle(fir::FirOpBuilder &builder, mlir::ModuleOp mod,
fir::DeclareOp op) {
builder.setInsertionPointAfter(op);
Expand Down Expand Up @@ -1746,16 +1785,16 @@ void mif::populateMIFOpConversionPatterns(
mlir::RewritePatternSet &patterns) {
patterns.insert<MIFAllocCoarrayOpConversion>(patterns.getContext(), &dl,
&converter);
patterns.insert<MIFInitOpConversion, MIFThisImageOpConversion,
MIFNumImagesOpConversion, MIFSyncAllOpConversion,
MIFSyncImagesOpConversion, MIFSyncMemoryOpConversion,
MIFSyncTeamOpConversion, MIFCoBroadcastOpConversion,
MIFCoMaxOpConversion, MIFCoMinOpConversion,
MIFCoSumOpConversion, MIFFormTeamOpConversion,
MIFChangeTeamOpConversion, MIFGetTeamOpConversion,
MIFTeamNumberOpConversion, MIFDeallocCoarrayOpConversion,
MIFCoshapeOpConversion, MIFLcoboundOpConversion,
MIFUcoboundOpConversion, MIFImageIndexOpConversion,
MIFEventPostOpConversion, MIFEventWaitOpConversion>(
patterns.insert<
MIFInitOpConversion, MIFThisImageOpConversion, MIFNumImagesOpConversion,
MIFSyncAllOpConversion, MIFSyncImagesOpConversion,
MIFSyncMemoryOpConversion, MIFSyncTeamOpConversion,
MIFCoBroadcastOpConversion, MIFCoMaxOpConversion, MIFCoMinOpConversion,
MIFCoSumOpConversion, MIFFormTeamOpConversion, MIFChangeTeamOpConversion,
MIFGetTeamOpConversion, MIFTeamNumberOpConversion,
MIFDeallocCoarrayOpConversion, MIFCoshapeOpConversion,
MIFLcoboundOpConversion, MIFUcoboundOpConversion,
MIFImageIndexOpConversion, MIFEventPostOpConversion,
MIFEventWaitOpConversion, MIFEventQueryOpConversion>(
patterns.getContext());
}
Loading