aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Optimizer/Builder/IntrinsicCall.cpp')
-rw-r--r--flang/lib/Optimizer/Builder/IntrinsicCall.cpp111
1 files changed, 39 insertions, 72 deletions
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index 0195178..29eedfb 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -25,7 +25,6 @@
#include "flang/Optimizer/Builder/Runtime/Allocatable.h"
#include "flang/Optimizer/Builder/Runtime/CUDA/Descriptor.h"
#include "flang/Optimizer/Builder/Runtime/Character.h"
-#include "flang/Optimizer/Builder/Runtime/Coarray.h"
#include "flang/Optimizer/Builder/Runtime/Command.h"
#include "flang/Optimizer/Builder/Runtime/Derived.h"
#include "flang/Optimizer/Builder/Runtime/Exceptions.h"
@@ -40,6 +39,7 @@
#include "flang/Optimizer/Builder/Todo.h"
#include "flang/Optimizer/Dialect/FIROps.h"
#include "flang/Optimizer/Dialect/FIROpsSupport.h"
+#include "flang/Optimizer/Dialect/MIF/MIFOps.h"
#include "flang/Optimizer/Dialect/Support/FIRContext.h"
#include "flang/Optimizer/HLFIR/HLFIROps.h"
#include "flang/Optimizer/Support/FatalError.h"
@@ -412,28 +412,28 @@ static constexpr IntrinsicHandler handlers[]{
{"co_broadcast",
&I::genCoBroadcast,
{{{"a", asBox},
- {"source_image", asAddr},
+ {"source_image", asValue},
{"stat", asAddr, handleDynamicOptional},
{"errmsg", asBox, handleDynamicOptional}}},
/*isElemental*/ false},
{"co_max",
&I::genCoMax,
{{{"a", asBox},
- {"result_image", asAddr, handleDynamicOptional},
+ {"result_image", asValue, handleDynamicOptional},
{"stat", asAddr, handleDynamicOptional},
{"errmsg", asBox, handleDynamicOptional}}},
/*isElemental*/ false},
{"co_min",
&I::genCoMin,
{{{"a", asBox},
- {"result_image", asAddr, handleDynamicOptional},
+ {"result_image", asValue, handleDynamicOptional},
{"stat", asAddr, handleDynamicOptional},
{"errmsg", asBox, handleDynamicOptional}}},
/*isElemental*/ false},
{"co_sum",
&I::genCoSum,
{{{"a", asBox},
- {"result_image", asAddr, handleDynamicOptional},
+ {"result_image", asValue, handleDynamicOptional},
{"stat", asAddr, handleDynamicOptional},
{"errmsg", asBox, handleDynamicOptional}}},
/*isElemental*/ false},
@@ -829,7 +829,7 @@ static constexpr IntrinsicHandler handlers[]{
{"null", &I::genNull, {{{"mold", asInquired}}}, /*isElemental=*/false},
{"num_images",
&I::genNumImages,
- {{{"team", asAddr}, {"team_number", asAddr}}},
+ {{{"team_number", asValue}, {"team", asBox}}},
/*isElemental*/ false},
{"pack",
&I::genPack,
@@ -3516,11 +3516,23 @@ static mlir::Value getAddrFromBox(fir::FirOpBuilder &builder,
return addr;
}
+static void clocDeviceArgRewrite(fir::ExtendedValue arg) {
+ // Special case for device address in c_loc.
+ if (auto emboxOp = mlir::dyn_cast_or_null<fir::EmboxOp>(
+ fir::getBase(arg).getDefiningOp()))
+ if (auto declareOp = mlir::dyn_cast_or_null<hlfir::DeclareOp>(
+ emboxOp.getMemref().getDefiningOp()))
+ if (declareOp.getDataAttr() &&
+ declareOp.getDataAttr() == cuf::DataAttribute::Device)
+ emboxOp.getMemrefMutable().assign(declareOp.getMemref());
+}
+
static fir::ExtendedValue
genCLocOrCFunLoc(fir::FirOpBuilder &builder, mlir::Location loc,
mlir::Type resultType, llvm::ArrayRef<fir::ExtendedValue> args,
bool isFunc = false, bool isDevLoc = false) {
assert(args.size() == 1);
+ clocDeviceArgRewrite(args[0]);
mlir::Value res = fir::AllocaOp::create(builder, loc, resultType);
mlir::Value resAddr;
if (isDevLoc)
@@ -3795,79 +3807,40 @@ mlir::Value IntrinsicLibrary::genCmplx(mlir::Type resultType,
void IntrinsicLibrary::genCoBroadcast(llvm::ArrayRef<fir::ExtendedValue> args) {
converter->checkCoarrayEnabled();
assert(args.size() == 4);
- mlir::Value sourceImage = fir::getBase(args[1]);
- mlir::Value status =
- isStaticallyAbsent(args[2])
- ? fir::AbsentOp::create(builder, loc,
- builder.getRefType(builder.getI32Type()))
- .getResult()
- : fir::getBase(args[2]);
- mlir::Value errmsg =
- isStaticallyAbsent(args[3])
- ? fir::AbsentOp::create(builder, loc, PRIF_ERRMSG_TYPE).getResult()
- : fir::getBase(args[3]);
- fir::runtime::genCoBroadcast(builder, loc, fir::getBase(args[0]), sourceImage,
- status, errmsg);
+ mif::CoBroadcastOp::create(builder, loc, fir::getBase(args[0]),
+ /*sourceImage*/ fir::getBase(args[1]),
+ /*status*/ fir::getBase(args[2]),
+ /*errmsg*/ fir::getBase(args[3]));
}
// CO_MAX
void IntrinsicLibrary::genCoMax(llvm::ArrayRef<fir::ExtendedValue> args) {
converter->checkCoarrayEnabled();
assert(args.size() == 4);
- mlir::Value refNone =
- fir::AbsentOp::create(builder, loc,
- builder.getRefType(builder.getI32Type()))
- .getResult();
- mlir::Value resultImage =
- isStaticallyAbsent(args[1]) ? refNone : fir::getBase(args[1]);
- mlir::Value status =
- isStaticallyAbsent(args[2]) ? refNone : fir::getBase(args[2]);
- mlir::Value errmsg =
- isStaticallyAbsent(args[3])
- ? fir::AbsentOp::create(builder, loc, PRIF_ERRMSG_TYPE).getResult()
- : fir::getBase(args[3]);
- fir::runtime::genCoMax(builder, loc, fir::getBase(args[0]), resultImage,
- status, errmsg);
+ mif::CoMaxOp::create(builder, loc, fir::getBase(args[0]),
+ /*resultImage*/ fir::getBase(args[1]),
+ /*status*/ fir::getBase(args[2]),
+ /*errmsg*/ fir::getBase(args[3]));
}
// CO_MIN
void IntrinsicLibrary::genCoMin(llvm::ArrayRef<fir::ExtendedValue> args) {
converter->checkCoarrayEnabled();
assert(args.size() == 4);
- mlir::Value refNone =
- fir::AbsentOp::create(builder, loc,
- builder.getRefType(builder.getI32Type()))
- .getResult();
- mlir::Value resultImage =
- isStaticallyAbsent(args[1]) ? refNone : fir::getBase(args[1]);
- mlir::Value status =
- isStaticallyAbsent(args[2]) ? refNone : fir::getBase(args[2]);
- mlir::Value errmsg =
- isStaticallyAbsent(args[3])
- ? fir::AbsentOp::create(builder, loc, PRIF_ERRMSG_TYPE).getResult()
- : fir::getBase(args[3]);
- fir::runtime::genCoMin(builder, loc, fir::getBase(args[0]), resultImage,
- status, errmsg);
+ mif::CoMinOp::create(builder, loc, fir::getBase(args[0]),
+ /*resultImage*/ fir::getBase(args[1]),
+ /*status*/ fir::getBase(args[2]),
+ /*errmsg*/ fir::getBase(args[3]));
}
// CO_SUM
void IntrinsicLibrary::genCoSum(llvm::ArrayRef<fir::ExtendedValue> args) {
converter->checkCoarrayEnabled();
assert(args.size() == 4);
- mlir::Value absentInt =
- fir::AbsentOp::create(builder, loc,
- builder.getRefType(builder.getI32Type()))
- .getResult();
- mlir::Value resultImage =
- isStaticallyAbsent(args[1]) ? absentInt : fir::getBase(args[1]);
- mlir::Value status =
- isStaticallyAbsent(args[2]) ? absentInt : fir::getBase(args[2]);
- mlir::Value errmsg =
- isStaticallyAbsent(args[3])
- ? fir::AbsentOp::create(builder, loc, PRIF_ERRMSG_TYPE).getResult()
- : fir::getBase(args[3]);
- fir::runtime::genCoSum(builder, loc, fir::getBase(args[0]), resultImage,
- status, errmsg);
+ mif::CoSumOp::create(builder, loc, fir::getBase(args[0]),
+ /*resultImage*/ fir::getBase(args[1]),
+ /*status*/ fir::getBase(args[2]),
+ /*errmsg*/ fir::getBase(args[3]));
}
// COMMAND_ARGUMENT_COUNT
@@ -7579,9 +7552,9 @@ IntrinsicLibrary::genNumImages(mlir::Type resultType,
assert(args.size() == 0 || args.size() == 1);
if (args.size())
- return fir::runtime::getNumImagesWithTeam(builder, loc,
- fir::getBase(args[0]));
- return fir::runtime::getNumImages(builder, loc);
+ return mif::NumImagesOp::create(builder, loc, fir::getBase(args[0]))
+ .getResult();
+ return mif::NumImagesOp::create(builder, loc).getResult();
}
// CLOCK, CLOCK64, GLOBALTIMER
@@ -8659,17 +8632,11 @@ IntrinsicLibrary::genThisImage(mlir::Type resultType,
converter->checkCoarrayEnabled();
assert(args.size() >= 1 && args.size() <= 3);
const bool coarrayIsAbsent = args.size() == 1;
- mlir::Value team =
- !isStaticallyAbsent(args, args.size() - 1)
- ? fir::getBase(args[args.size() - 1])
- : builder
- .create<fir::AbsentOp>(loc,
- fir::BoxType::get(builder.getNoneType()))
- .getResult();
+ mlir::Value team = fir::getBase(args[args.size() - 1]);
if (!coarrayIsAbsent)
TODO(loc, "this_image with coarray argument.");
- mlir::Value res = fir::runtime::getThisImage(builder, loc, team);
+ mlir::Value res = mif::ThisImageOp::create(builder, loc, team);
return builder.createConvert(loc, resultType, res);
}