Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
16 changes: 8 additions & 8 deletions flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def mif_NumImagesOp : mif_Op<"num_images", [AttrSizedOperandSegments]> {
}];

let arguments = (ins Optional<AnyInteger>:$team_number,
Optional<AnyRefOrBoxType>:$team);
Optional<AnyReferenceLike>:$team);
let results = (outs I32:$res);

let builders = [OpBuilder<(ins CArg<"mlir::Value", "{}">:$teamArg)>];
Expand Down Expand Up @@ -108,7 +108,7 @@ def mif_ThisImageOp : mif_Op<"this_image", [AttrSizedOperandSegments]> {
}];

let arguments = (ins Optional<AnyType>:$coarray, Optional<AnyInteger>:$dim,
Optional<AnyRefOrBoxType>:$team);
Optional<AnyReferenceLike>:$team);
let results = (outs AnyType:$res);

let builders = [OpBuilder<(ins "mlir::Value":$coarray, "mlir::Value":$dim,
Expand Down Expand Up @@ -151,7 +151,7 @@ def mif_ImageIndexOp : mif_Op<"image_index", [AttrSizedOperandSegments]> {
}];

let arguments = (ins AnyType:$coarray, fir_BoxType:$sub,
Optional<AnyRefOrBoxType>:$team, Optional<AnyInteger>:$team_number);
Optional<AnyReferenceLike>:$team, Optional<AnyInteger>:$team_number);
let builders = [OpBuilder<(ins "mlir::Value":$coarray, "mlir::Value":$sub,
"mlir::Value":$team)>];

Expand Down Expand Up @@ -292,7 +292,7 @@ def mif_SyncMemoryOp : mif_Op<"sync_memory", [AttrSizedOperandSegments]> {
def mif_SyncTeamOp : mif_Op<"sync_team", [AttrSizedOperandSegments]> {
let summary = "Performs a synchronization of the team, identified by `team`";

let arguments = (ins AnyRefOrBoxType:$team, Optional<AnyReferenceLike>:$stat,
let arguments = (ins AnyReferenceLike:$team, Optional<AnyReferenceLike>:$stat,
Optional<AnyRefOrBoxType>:$errmsg);
let assemblyFormat = [{
$team (`stat` $stat^ )?
Expand Down Expand Up @@ -418,7 +418,7 @@ def mif_FormTeamOp : mif_Op<"form_team", [AttrSizedOperandSegments]> {
}];

let arguments = (ins AnyIntegerType:$team_number,
Arg<fir_BoxType, "", [MemWrite]>:$team_var,
Arg<AnyReferenceLike, "", [MemWrite]>:$team_var,
Optional<AnyIntegerType>:$new_index,
Arg<Optional<AnyReferenceLike>, "", [MemWrite]>:$stat,
Arg<Optional<AnyRefOrBoxType>, "", [MemWrite]>:$errmsg);
Expand Down Expand Up @@ -471,7 +471,7 @@ def mif_ChangeTeamOp : region_Op<"change_team", [AttrSizedOperandSegments]> {
}
}];

let arguments = (ins AnyRefOrBoxType:$team,
let arguments = (ins AnyReferenceLike:$team,
Arg<Optional<AnyReferenceLike>, "", [MemWrite]>:$stat,
Arg<Optional<AnyRefOrBoxType>, "", [MemWrite]>:$errmsg);

Expand Down Expand Up @@ -511,7 +511,7 @@ def mif_GetTeamOp : mif_Op<"get_team", []> {
}];

let arguments = (ins Optional<AnyIntegerType>:$level);
let results = (outs fir_BoxType:$team);
let results = (outs AnyType:$team);

let assemblyFormat = [{
(`level` $level^ )?
Expand All @@ -527,7 +527,7 @@ def mif_TeamNumberOp : mif_Op<"team_number", []> {
If `team` is absent, the team specified is the current team.
}];

let arguments = (ins Optional<AnyRefOrBoxType>:$team);
let arguments = (ins Optional<AnyReferenceLike>:$team);
let results = (outs I64);

let assemblyFormat = [{
Expand Down
6 changes: 3 additions & 3 deletions flang/lib/Lower/MultiImageFortran.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ void Fortran::lower::genSyncTeamStatement(
std::get<Fortran::parser::TeamValue>(stmt.t);
const SomeExpr *teamExpr = Fortran::semantics::GetExpr(teamValue);
mlir::Value team =
fir::getBase(converter.genExprBox(loc, *teamExpr, stmtCtx));
fir::getBase(converter.genExprAddr(loc, *teamExpr, stmtCtx));

// Handle STAT and ERRMSG values
const std::list<Fortran::parser::StatOrErrmsg> &statOrErrList =
Expand Down Expand Up @@ -163,7 +163,7 @@ Fortran::lower::genChangeTeamStmt(Fortran::lower::AbstractConverter &converter,
// Handle TEAM-VALUE
const auto *teamExpr =
Fortran::semantics::GetExpr(std::get<Fortran::parser::TeamValue>(stmt.t));
team = fir::getBase(converter.genExprBox(loc, *teamExpr, stmtCtx));
team = fir::getBase(converter.genExprAddr(loc, *teamExpr, stmtCtx));

return mif::ChangeTeamOp::create(builder, loc, team, statAddr, errMsgAddr);
}
Expand Down Expand Up @@ -253,7 +253,7 @@ void Fortran::lower::genFormTeamStatement(
// Handle TEAM-VARIABLE
const auto *teamExpr = Fortran::semantics::GetExpr(
std::get<Fortran::parser::TeamVariable>(stmt.t));
team = fir::getBase(converter.genExprBox(loc, *teamExpr, stmtCtx));
team = fir::getBase(converter.genExprAddr(loc, *teamExpr, stmtCtx));

mif::FormTeamOp::create(builder, loc, teamNumber, team, newIndex, statAddr,
errMsgAddr);
Expand Down
11 changes: 7 additions & 4 deletions flang/lib/Optimizer/Builder/IntrinsicCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,7 @@ static constexpr IntrinsicHandler handlers[]{
{"null", &I::genNull, {{{"mold", asInquired}}}, /*isElemental=*/false},
{"num_images",
&I::genNumImages,
{{{"team_number", asValue}, {"team", asBox}}},
{{{"team_number", asValue}, {"team", asAddr}}},
/*isElemental*/ false},
{"pack",
&I::genPack,
Expand Down Expand Up @@ -830,13 +830,13 @@ static constexpr IntrinsicHandler handlers[]{
{"tanpi", &I::genTanpi},
{"team_number",
&I::genTeamNumber,
{{{"team", asBox, handleDynamicOptional}}},
{{{"team", asAddr, handleDynamicOptional}}},
/*isElemental=*/false},
{"this_image",
&I::genThisImage,
{{{"coarray", asBox},
{"dim", asValue},
{"team", asBox, handleDynamicOptional}}},
{"team", asAddr, handleDynamicOptional}}},
/*isElemental=*/false},
{"time", &I::genTime, {}, /*isElemental=*/false},
{"timef", &I::genTimef, {}, /*isElemental=*/false},
Expand Down Expand Up @@ -4275,7 +4275,7 @@ mlir::Value IntrinsicLibrary::genGetTeam(mlir::Type resultType,
llvm::ArrayRef<mlir::Value> args) {
checkCoarrayEnabled(loc, options);
assert(args.size() == 1);
return mif::GetTeamOp::create(builder, loc, fir::BoxType::get(resultType),
return mif::GetTeamOp::create(builder, loc, builder.getRefType(resultType),
/*level*/ args[0]);
}

Expand Down Expand Up @@ -8355,6 +8355,9 @@ IntrinsicLibrary::genThisImage(mlir::Type resultType,
const bool dimIsAbsent = args.size() < 3;
mlir::Value team = fir::getBase(args[args.size() - 1]);

if (team)
team = fir::BoxAddrOp::create(builder, loc, team);

if (!coarrayIsAbsent && dimIsAbsent) {
mlir::Type eleTy = hlfir::getFortranElementType(resultType);
mlir::Type thisImageResultTy = fir::BoxType::get(
Expand Down
46 changes: 21 additions & 25 deletions flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -472,12 +472,11 @@ struct MIFThisImageOpConversion
mlir::Type i64Ty = builder.getI64Type();
mlir::Type i32Ty = builder.getI32Type();
mlir::Type boxTy = fir::BoxType::get(rewriter.getNoneType());
mlir::Type refTy = builder.getRefType(rewriter.getNoneType());

mlir::Value teamArg = op.getTeam();
if (!op.getTeam())
teamArg = fir::AbsentOp::create(builder, loc, boxTy);
else
teamArg = builder.createBox(loc, teamArg);
teamArg = fir::AbsentOp::create(builder, loc, refTy);

if (op.getCoarray()) {
llvm::SmallVector<mlir::Value> args;
Expand All @@ -494,7 +493,7 @@ struct MIFThisImageOpConversion
ftype = mlir::FunctionType::get(builder.getContext(),
/*inputs*/
{boxTy, builder.getRefType(i32Ty),
boxTy, builder.getRefType(i64Ty)},
refTy, builder.getRefType(i64Ty)},
/*results*/ {});
funcOp = builder.createFunction(
loc, getPRIFProcName("this_image_with_dim"), ftype);
Expand All @@ -510,7 +509,7 @@ struct MIFThisImageOpConversion
result = builder.createBox(loc, builder.createTemporary(loc, resTy));
ftype = mlir::FunctionType::get(
builder.getContext(),
/*inputs*/ {boxTy, boxTy, fir::BoxType::get(resTy)},
/*inputs*/ {boxTy, refTy, fir::BoxType::get(resTy)},
/*results*/ {});
funcOp = builder.createFunction(
loc, getPRIFProcName("this_image_with_coarray"), ftype);
Expand All @@ -529,7 +528,7 @@ struct MIFThisImageOpConversion
mlir::Value result = builder.createTemporary(loc, i32Ty);
mlir::FunctionType ftype = mlir::FunctionType::get(
builder.getContext(),
/*inputs*/ {boxTy, builder.getRefType(i32Ty)}, /*results*/ {});
/*inputs*/ {refTy, builder.getRefType(i32Ty)}, /*results*/ {});
mlir::func::FuncOp funcOp = builder.createFunction(
loc, getPRIFProcName("this_image_no_coarray"), ftype);

Expand Down Expand Up @@ -557,7 +556,7 @@ struct MIFNumImagesOpConversion

mlir::Type i32Ty = builder.getI32Type();
mlir::Type i64Ty = builder.getI64Type();
mlir::Type boxTy = fir::BoxType::get(rewriter.getNoneType());
mlir::Type refTy = builder.getRefType(rewriter.getNoneType());
mlir::Value result = builder.createTemporary(loc, i32Ty);

mlir::func::FuncOp funcOp;
Expand All @@ -574,7 +573,7 @@ struct MIFNumImagesOpConversion
mlir::FunctionType ftype =
mlir::FunctionType::get(builder.getContext(),
/*inputs*/
{boxTy, builder.getRefType(i32Ty)},
{refTy, builder.getRefType(i32Ty)},
/*results*/ {});
funcOp = builder.createFunction(
loc, getPRIFProcName("num_images_with_team"), ftype);
Expand Down Expand Up @@ -722,11 +721,11 @@ struct MIFSyncTeamOpConversion
fir::FirOpBuilder builder(rewriter, mod);
mlir::Location loc = op.getLoc();

mlir::Type boxTy = fir::BoxType::get(builder.getNoneType());
mlir::Type refTy = builder.getRefType(builder.getNoneType());
mlir::Type errmsgTy = getPRIFErrmsgType(builder);
mlir::FunctionType ftype = mlir::FunctionType::get(
builder.getContext(),
/*inputs*/ {boxTy, getPRIFStatType(builder), errmsgTy, errmsgTy},
/*inputs*/ {refTy, getPRIFStatType(builder), errmsgTy, errmsgTy},
/*results*/ {});
mlir::func::FuncOp funcOp =
builder.createFunction(loc, getPRIFProcName("sync_team"), ftype);
Expand Down Expand Up @@ -882,11 +881,11 @@ struct MIFFormTeamOpConversion
fir::FirOpBuilder builder(rewriter, mod);
mlir::Location loc = op.getLoc();
mlir::Type errmsgTy = getPRIFErrmsgType(builder);
mlir::Type boxTy = fir::BoxType::get(builder.getNoneType());
mlir::Type refTy = builder.getRefType(builder.getNoneType());
mlir::FunctionType ftype = mlir::FunctionType::get(
builder.getContext(),
/*inputs*/
{builder.getRefType(builder.getI64Type()), boxTy,
{builder.getRefType(builder.getI64Type()), refTy,
builder.getRefType(builder.getI32Type()), getPRIFStatType(builder),
errmsgTy, errmsgTy},
/*results*/ {});
Expand Down Expand Up @@ -960,10 +959,10 @@ struct MIFChangeTeamOpConversion

mlir::Location loc = op.getLoc();
mlir::Type errmsgTy = getPRIFErrmsgType(builder);
mlir::Type boxTy = fir::BoxType::get(builder.getNoneType());
mlir::Type refTy = builder.getRefType(builder.getNoneType());
mlir::FunctionType ftype = mlir::FunctionType::get(
builder.getContext(),
/*inputs*/ {boxTy, getPRIFStatType(builder), errmsgTy, errmsgTy},
/*inputs*/ {refTy, getPRIFStatType(builder), errmsgTy, errmsgTy},
/*results*/ {});
mlir::func::FuncOp funcOp =
builder.createFunction(loc, getPRIFProcName("change_team"), ftype);
Expand Down Expand Up @@ -1019,11 +1018,11 @@ struct MIFGetTeamOpConversion : public mlir::OpRewritePattern<mif::GetTeamOp> {
fir::FirOpBuilder builder(rewriter, mod);
mlir::Location loc = op.getLoc();

mlir::Type boxTy = fir::BoxType::get(builder.getNoneType());
mlir::Type refTy = builder.getRefType(builder.getNoneType());
mlir::Type lvlTy = builder.getRefType(builder.getI32Type());
mlir::FunctionType ftype =
mlir::FunctionType::get(builder.getContext(),
/*inputs*/ {lvlTy, boxTy},
/*inputs*/ {lvlTy, refTy},
/*results*/ {});
mlir::func::FuncOp funcOp =
builder.createFunction(loc, getPRIFProcName("get_team"), ftype);
Expand All @@ -1042,13 +1041,12 @@ struct MIFGetTeamOpConversion : public mlir::OpRewritePattern<mif::GetTeamOp> {
mlir::Type resultType = op.getResult().getType();
mlir::Type baseTy = fir::unwrapRefType(resultType);
mlir::Value team = builder.createTemporary(loc, baseTy);
fir::EmboxOp box = fir::EmboxOp::create(builder, loc, resultType, team);

llvm::SmallVector<mlir::Value> args =
fir::runtime::createArguments(builder, loc, ftype, level, box);
fir::runtime::createArguments(builder, loc, ftype, level, team);
fir::CallOp::create(builder, loc, funcOp, args);

rewriter.replaceOp(op, box);
rewriter.replaceOp(op, team);
return mlir::success();
}
};
Expand All @@ -1065,17 +1063,17 @@ struct MIFTeamNumberOpConversion
fir::FirOpBuilder builder(rewriter, mod);
mlir::Location loc = op.getLoc();
mlir::Type i64Ty = builder.getI64Type();
mlir::Type boxTy = fir::BoxType::get(builder.getNoneType());
mlir::Type refTy = builder.getRefType(builder.getNoneType());
mlir::FunctionType ftype =
mlir::FunctionType::get(builder.getContext(),
/*inputs*/ {boxTy, builder.getRefType(i64Ty)},
/*inputs*/ {refTy, builder.getRefType(i64Ty)},
/*results*/ {});
mlir::func::FuncOp funcOp =
builder.createFunction(loc, getPRIFProcName("team_number"), ftype);

mlir::Value team = op.getTeam();
if (!team)
team = fir::AbsentOp::create(builder, loc, boxTy);
team = fir::AbsentOp::create(builder, loc, refTy);

mlir::Value result = builder.createTemporary(loc, i64Ty);
llvm::SmallVector<mlir::Value> args =
Expand Down Expand Up @@ -1336,14 +1334,12 @@ struct MIFImageIndexOpConversion
std::string imageIndexName =
op.getTeamNumber() ? getPRIFProcName("image_index_with_team_number")
: getPRIFProcName("image_index_with_team");
mlir::Type teamTy = boxTy;
mlir::Type teamTy = builder.getRefType(builder.getNoneType());
if (op.getTeamNumber()) {
teamTy = builder.getRefType(i64Ty);
mlir::Value t = builder.createConvert(loc, i64Ty, team);
team = builder.createTemporary(loc, i64Ty);
fir::StoreOp::create(builder, loc, t, team);
} else {
team = builder.createBox(loc, team);
}
mlir::FunctionType ftype = mlir::FunctionType::get(
builder.getContext(),
Expand Down
Loading
Loading