From 06048e41659fb0b5d929779fa378edd2ee0ae24f Mon Sep 17 00:00:00 2001 From: Jean-Didier Pailleux Date: Thu, 21 Aug 2025 13:26:44 +0200 Subject: [PATCH 1/6] [flang][Lower] Add Lowering for CO_{BROADCAST, MAX, MIN, MAX} to PRIF --- .../flang/Optimizer/Builder/IntrinsicCall.h | 4 + .../flang/Optimizer/Builder/Runtime/Coarray.h | 22 ++++ flang/lib/Optimizer/Builder/IntrinsicCall.cpp | 108 ++++++++++++++++ .../lib/Optimizer/Builder/Runtime/Coarray.cpp | 81 ++++++++++++ flang/test/Lower/Coarray/co_broadcast.f90 | 92 +++++++++++++ flang/test/Lower/Coarray/co_max.f90 | 112 ++++++++++++++++ flang/test/Lower/Coarray/co_min.f90 | 112 ++++++++++++++++ flang/test/Lower/Coarray/co_sum.f90 | 122 ++++++++++++++++++ 8 files changed, 653 insertions(+) create mode 100644 flang/test/Lower/Coarray/co_broadcast.f90 create mode 100644 flang/test/Lower/Coarray/co_max.f90 create mode 100644 flang/test/Lower/Coarray/co_min.f90 create mode 100644 flang/test/Lower/Coarray/co_sum.f90 diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h index 88c3ada3ff64f..84ed16c088e00 100644 --- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h +++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h @@ -225,6 +225,10 @@ struct IntrinsicLibrary { fir::ExtendedValue genCharacterCompare(mlir::Type, llvm::ArrayRef); mlir::Value genCmplx(mlir::Type, llvm::ArrayRef); + void genCoBroadcast(llvm::ArrayRef); + void genCoMax(llvm::ArrayRef); + void genCoMin(llvm::ArrayRef); + void genCoSum(llvm::ArrayRef); mlir::Value genConjg(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genCount(mlir::Type, llvm::ArrayRef); void genCpuTime(llvm::ArrayRef); diff --git a/flang/include/flang/Optimizer/Builder/Runtime/Coarray.h b/flang/include/flang/Optimizer/Builder/Runtime/Coarray.h index 23bb378c30838..10ed503a485a3 100644 --- a/flang/include/flang/Optimizer/Builder/Runtime/Coarray.h +++ b/flang/include/flang/Optimizer/Builder/Runtime/Coarray.h @@ -34,6 +34,11 @@ namespace fir::runtime { return fir::NameUniquer::doProcedure({"prif"}, {}, oss.str()); \ }() +#define PRIF_STAT_TYPE builder.getRefType(builder.getI32Type()) +#define PRIF_ERRMSG_TYPE \ + fir::BoxType::get(fir::CharacterType::get(builder.getContext(), 1, \ + fir::CharacterType::unknownLen())) + /// Generate Call to runtime prif_init mlir::Value genInitCoarray(fir::FirOpBuilder &builder, mlir::Location loc); @@ -49,5 +54,22 @@ mlir::Value getNumImagesWithTeam(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value getThisImage(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value team = {}); +/// Generate call to runtime subroutine prif_co_broadcast +void genCoBroadcast(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value A, mlir::Value sourceImage, mlir::Value stat, + mlir::Value errmsg); + +/// Generate call to runtime subroutine prif_co_max and prif_co_max_character +void genCoMax(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value A, + mlir::Value resultImage, mlir::Value stat, mlir::Value errmsg); + +/// Generate call to runtime subroutine prif_co_min or prif_co_min_character +void genCoMin(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value A, + mlir::Value resultImage, mlir::Value stat, mlir::Value errmsg); + +/// Generate call to runtime subroutine prif_co_sum +void genCoSum(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value A, + mlir::Value resultImage, mlir::Value stat, mlir::Value errmsg); + } // namespace fir::runtime #endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_COARRAY_H diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 8aacdb1815e3b..d5b4b77f8cb98 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -397,6 +397,34 @@ static constexpr IntrinsicHandler handlers[]{ {"cmplx", &I::genCmplx, {{{"x", asValue}, {"y", asValue, handleDynamicOptional}}}}, + {"co_broadcast", + &I::genCoBroadcast, + {{{"a", asBox}, + {"source_image", asAddr, handleDynamicOptional}, + {"stat", asAddr, handleDynamicOptional}, + {"errmsg", asBox, handleDynamicOptional}}}, + /*isElemental*/ false}, + {"co_max", + &I::genCoMax, + {{{"a", asBox}, + {"result_image", asAddr, handleDynamicOptional}, + {"stat", asAddr, handleDynamicOptional}, + {"errmsg", asBox, handleDynamicOptional}}}, + /*isElemental*/ false}, + {"co_min", + &I::genCoMin, + {{{"a", asBox}, + {"result_image", asAddr, handleDynamicOptional}, + {"stat", asAddr, handleDynamicOptional}, + {"errmsg", asBox, handleDynamicOptional}}}, + /*isElemental*/ false}, + {"co_sum", + &I::genCoSum, + {{{"a", asBox}, + {"result_image", asAddr, handleDynamicOptional}, + {"stat", asAddr, handleDynamicOptional}, + {"errmsg", asBox, handleDynamicOptional}}}, + /*isElemental*/ false}, {"command_argument_count", &I::genCommandArgumentCount}, {"conjg", &I::genConjg}, {"cosd", &I::genCosd}, @@ -3649,6 +3677,86 @@ mlir::Value IntrinsicLibrary::genCmplx(mlir::Type resultType, imag); } +// CO_BROADCAST +void IntrinsicLibrary::genCoBroadcast(llvm::ArrayRef args) { + checkCoarrayEnabled(); + assert(args.size() == 4); + mlir::Value refNone = + builder + .create(loc, builder.getRefType(builder.getI32Type())) + .getResult(); + mlir::Value sourceImage = + 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]) + ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + : fir::getBase(args[3]); + fir::runtime::genCoBroadcast(builder, loc, fir::getBase(args[0]), sourceImage, + status, errmsg); +} + +// CO_MAX +void IntrinsicLibrary::genCoMax(llvm::ArrayRef args) { + checkCoarrayEnabled(); + assert(args.size() == 4); + mlir::Value refNone = + builder + .create(loc, builder.getRefType(builder.getI32Type())) + .getResult(); + mlir::Value remoteImage = + 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]) + ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + : fir::getBase(args[3]); + fir::runtime::genCoMax(builder, loc, fir::getBase(args[0]), remoteImage, + status, errmsg); +} + +// CO_MIN +void IntrinsicLibrary::genCoMin(llvm::ArrayRef args) { + checkCoarrayEnabled(); + assert(args.size() == 4); + mlir::Value refNone = + builder + .create(loc, builder.getRefType(builder.getI32Type())) + .getResult(); + mlir::Value remoteImage = + 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]) + ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + : fir::getBase(args[3]); + fir::runtime::genCoMin(builder, loc, fir::getBase(args[0]), remoteImage, + status, errmsg); +} + +// CO_SUM +void IntrinsicLibrary::genCoSum(llvm::ArrayRef args) { + checkCoarrayEnabled(); + assert(args.size() == 4); + mlir::Value absentInt = + builder + .create(loc, builder.getRefType(builder.getI32Type())) + .getResult(); + mlir::Value remoteImage = + 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]) + ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + : fir::getBase(args[3]); + fir::runtime::genCoSum(builder, loc, fir::getBase(args[0]), remoteImage, + status, errmsg); +} + // COMMAND_ARGUMENT_COUNT fir::ExtendedValue IntrinsicLibrary::genCommandArgumentCount( mlir::Type resultType, llvm::ArrayRef args) { diff --git a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp index fb72fc2089e23..ca3052d9206a5 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp @@ -14,6 +14,24 @@ using namespace Fortran::runtime; using namespace Fortran::semantics; +// Most PRIF functions take `errmsg` and `errmsg_alloc` as two optional +// arguments of intent (out). One is allocatable, the other is not. +// It is the responsibility of the compiler to ensure that the appropriate +// optional argument is passed, and at most one must be provided in a given +// call. +// Depending on the type of `errmsg`, this function will return the pair +// corresponding to (`errmsg`, `errmsg_alloc`). +static std::pair +genErrmsgPRIF(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value errmsg) { + bool isAllocatableErrmsg = fir::isAllocatableType(errmsg.getType()); + + mlir::Value absent = builder.create(loc, PRIF_ERRMSG_TYPE); + mlir::Value errMsg = isAllocatableErrmsg ? absent : errmsg; + mlir::Value errMsgAlloc = isAllocatableErrmsg ? errmsg : absent; + return {errMsg, errMsgAlloc}; +} + /// Generate Call to runtime prif_init mlir::Value fir::runtime::genInitCoarray(fir::FirOpBuilder &builder, mlir::Location loc) { @@ -84,3 +102,66 @@ mlir::Value fir::runtime::getThisImage(fir::FirOpBuilder &builder, builder.create(loc, funcOp, args); return builder.create(loc, result); } + +/// Generate call to collective subroutines except co_reduce +/// A must be lowered as a box +void genCollectiveSubroutine(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value A, mlir::Value sourceImage, + mlir::Value stat, mlir::Value errmsg, + std::string coName) { + mlir::Type boxTy = fir::BoxType::get(builder.getNoneType()); + mlir::FunctionType ftype = + PRIF_FUNCTYPE(boxTy, builder.getRefType(builder.getI32Type()), + PRIF_STAT_TYPE, PRIF_ERRMSG_TYPE, PRIF_ERRMSG_TYPE); + mlir::func::FuncOp funcOp = builder.createFunction(loc, coName, ftype); + + auto [errmsgArg, errmsgAllocArg] = genErrmsgPRIF(builder, loc, errmsg); + llvm::SmallVector args = fir::runtime::createArguments( + builder, loc, ftype, A, sourceImage, stat, errmsgArg, errmsgAllocArg); + builder.create(loc, funcOp, args); +} + +/// Generate call to runtime subroutine prif_co_broadcast +void fir::runtime::genCoBroadcast(fir::FirOpBuilder &builder, + mlir::Location loc, mlir::Value A, + mlir::Value sourceImage, mlir::Value stat, + mlir::Value errmsg) { + genCollectiveSubroutine(builder, loc, A, sourceImage, stat, errmsg, + PRIFNAME_SUB("co_broadcast")); +} + +/// Generate call to runtime subroutine prif_co_max or prif_co_max_character +void fir::runtime::genCoMax(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value A, mlir::Value resultImage, + mlir::Value stat, mlir::Value errmsg) { + mlir::Type argTy = + fir::unwrapSequenceType(fir::unwrapPassByRefType(A.getType())); + if (mlir::isa(argTy)) + genCollectiveSubroutine(builder, loc, A, resultImage, stat, errmsg, + PRIFNAME_SUB("co_max_character")); + else + genCollectiveSubroutine(builder, loc, A, resultImage, stat, errmsg, + PRIFNAME_SUB("co_max")); +} + +/// Generate call to runtime subroutine prif_co_min or prif_co_min_character +void fir::runtime::genCoMin(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value A, mlir::Value resultImage, + mlir::Value stat, mlir::Value errmsg) { + mlir::Type argTy = + fir::unwrapSequenceType(fir::unwrapPassByRefType(A.getType())); + if (mlir::isa(argTy)) + genCollectiveSubroutine(builder, loc, A, resultImage, stat, errmsg, + PRIFNAME_SUB("co_min_character")); + else + genCollectiveSubroutine(builder, loc, A, resultImage, stat, errmsg, + PRIFNAME_SUB("co_min")); +} + +/// Generate call to runtime subroutine prif_co_sum +void fir::runtime::genCoSum(fir::FirOpBuilder &builder, mlir::Location loc, + mlir::Value A, mlir::Value resultImage, + mlir::Value stat, mlir::Value errmsg) { + genCollectiveSubroutine(builder, loc, A, resultImage, stat, errmsg, + PRIFNAME_SUB("co_sum")); +} diff --git a/flang/test/Lower/Coarray/co_broadcast.f90 b/flang/test/Lower/Coarray/co_broadcast.f90 new file mode 100644 index 0000000000000..be7fdcb99252c --- /dev/null +++ b/flang/test/Lower/Coarray/co_broadcast.f90 @@ -0,0 +1,92 @@ +! RUN: %flang_fc1 -emit-hlfir -fcoarray %s -o - | FileCheck %s + +program test_co_broadcast + integer :: i, array_i(2), status + real :: r, array_r(2) + double precision :: d, array_d(2) + complex :: c, array_c(2) + character(len=1) :: message + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_I:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(i, source_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_C:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS:.*]], %[[V2]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(c, source_image=1, stat=status) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_D:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(d, source_image=1, stat=status, errmsg=message) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_R:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(r, source_image=1, stat=status, errmsg=message) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_I:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(array_i, source_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(array_c, source_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_D:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V2]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(array_d, source_image=1, stat=status) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_broadcast(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_broadcast(array_r, source_image=1, stat= status, errmsg=message) + +end program diff --git a/flang/test/Lower/Coarray/co_max.f90 b/flang/test/Lower/Coarray/co_max.f90 new file mode 100644 index 0000000000000..56d863389d02b --- /dev/null +++ b/flang/test/Lower/Coarray/co_max.f90 @@ -0,0 +1,112 @@ +! RUN: %flang_fc1 -emit-hlfir -fcoarray %s -o - | FileCheck %s + +program test_co_max + integer :: i, array_i(2), status + real :: r, array_r(2) + double precision :: d, array_d(2) + character(len=1) :: c, array_c(2), message + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_I:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(i) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_C:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max_character(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(c) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_D:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(d) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_R:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(r) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_I]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(i, result_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_D]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS:.*]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(d, result_image=1, stat=status, errmsg=message) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_R]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(r, result_image=1, stat=status, errmsg=message) + + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_I:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(array_i) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max_character(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(array_c, result_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_D:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V2]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(array_d, result_image=1, stat=status) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_max(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_max(array_r, result_image=1, stat= status, errmsg=message) + +end program diff --git a/flang/test/Lower/Coarray/co_min.f90 b/flang/test/Lower/Coarray/co_min.f90 new file mode 100644 index 0000000000000..dde878bb14dbf --- /dev/null +++ b/flang/test/Lower/Coarray/co_min.f90 @@ -0,0 +1,112 @@ +! RUN: %flang_fc1 -emit-hlfir -fcoarray %s -o - | FileCheck %s + +program test_co_min + integer :: i, array_i(2), status + real :: r, array_r(2) + double precision :: d, array_d(2) + character(len=1) :: c, array_c(2), message + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_I:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(i) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_C:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min_character(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(c) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_D:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(d) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_R:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(r) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_I]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(i, result_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_D]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS:.*]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(d, result_image=1, stat=status, errmsg=message) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_R]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(r, result_image=1, stat=status, errmsg=message) + + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_I:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(array_i) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min_character(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(array_c, result_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_D:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V2]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(array_d, result_image=1, stat=status) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_min(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_min(array_r, result_image=1, stat= status, errmsg=message) + +end program diff --git a/flang/test/Lower/Coarray/co_sum.f90 b/flang/test/Lower/Coarray/co_sum.f90 new file mode 100644 index 0000000000000..2932b54c60a8d --- /dev/null +++ b/flang/test/Lower/Coarray/co_sum.f90 @@ -0,0 +1,122 @@ +! RUN: %flang_fc1 -emit-hlfir -fcoarray %s -o - | FileCheck %s + +program test_co_sum + integer :: i, array_i(2), status + real :: r, array_r(2) + double precision :: d, array_d(2) + complex :: c, array_c(2) + character(len=1) :: message + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_I:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(i) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_C:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(c) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_D:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(d) + + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_R:.*]]#0 : (!fir.ref) -> !fir.box + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(r) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_I]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(i, result_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_C]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS:.*]], %[[V2]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(c, result_image=1, stat=status) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_D]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE:.*]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(d, result_image=1, stat=status, errmsg=message) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[V1:.*]] = fir.embox %[[VAR_R]]#0 : (!fir.ref) -> !fir.box + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(r, result_image=1, stat=status, errmsg=message) + + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_I:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V5]], %[[V2]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(array_i) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.ref + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.absent !fir.box> + ! CHECK: %[[V5:.*]] = fir.convert %[[V1]] : (!fir.box>>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V5]], %[[IMAGE_RESULT]], %[[V2]], %[[V3]], %[[V4]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(array_c, result_image=1) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_D:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.absent !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V2]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(array_d, result_image=1, stat=status) + + ! CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32 + ! CHECK: %[[SHAPE_2:.*]] = fir.shape %[[C2_2:.*]] : (index) -> !fir.shape<1> + ! CHECK: %[[V1:.*]] = fir.embox %[[ARRAY_C:.*]]#0(%[[SHAPE_2]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> + ! CHECK: fir.store %[[C1_i32]] to %[[IMAGE_RESULT:.*]] : !fir.ref + ! CHECK: %[[V2:.*]] = fir.embox %[[MESSAGE]]#0 : (!fir.ref>) -> !fir.box> + ! CHECK: %[[V3:.*]] = fir.absent !fir.box> + ! CHECK: %[[V4:.*]] = fir.convert %[[V1]] : (!fir.box>) -> !fir.box + ! CHECK: %[[V5:.*]] = fir.convert %[[V2]] : (!fir.box>) -> !fir.box> + ! CHECK: fir.call @_QMprifPprif_co_sum(%[[V4]], %[[IMAGE_RESULT]], %[[STATUS]], %[[V5]], %[[V3]]) fastmath : (!fir.box, !fir.ref, !fir.ref, !fir.box>, !fir.box>) -> () + call co_sum(array_r, result_image=1, stat= status, errmsg=message) + +end program From 00e4745fe12778079bd55e008da95fc55034f434 Mon Sep 17 00:00:00 2001 From: Jean-Didier PAILLEUX Date: Fri, 22 Aug 2025 14:31:42 +0200 Subject: [PATCH 2/6] Update flang/lib/Optimizer/Builder/Runtime/Coarray.cpp Co-authored-by: Dan Bonachea --- flang/lib/Optimizer/Builder/Runtime/Coarray.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp index ca3052d9206a5..dbeb54fd76599 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp @@ -106,7 +106,7 @@ mlir::Value fir::runtime::getThisImage(fir::FirOpBuilder &builder, /// Generate call to collective subroutines except co_reduce /// A must be lowered as a box void genCollectiveSubroutine(fir::FirOpBuilder &builder, mlir::Location loc, - mlir::Value A, mlir::Value sourceImage, + mlir::Value A, mlir::Value rootImage, mlir::Value stat, mlir::Value errmsg, std::string coName) { mlir::Type boxTy = fir::BoxType::get(builder.getNoneType()); @@ -117,7 +117,7 @@ void genCollectiveSubroutine(fir::FirOpBuilder &builder, mlir::Location loc, auto [errmsgArg, errmsgAllocArg] = genErrmsgPRIF(builder, loc, errmsg); llvm::SmallVector args = fir::runtime::createArguments( - builder, loc, ftype, A, sourceImage, stat, errmsgArg, errmsgAllocArg); + builder, loc, ftype, A, rootImage, stat, errmsgArg, errmsgAllocArg); builder.create(loc, funcOp, args); } From 4b84dad96c5785413378d93b0e4794a091c4fb5a Mon Sep 17 00:00:00 2001 From: Jean-Didier PAILLEUX Date: Fri, 22 Aug 2025 14:38:29 +0200 Subject: [PATCH 3/6] Update flang/lib/Optimizer/Builder/IntrinsicCall.cpp Co-authored-by: Dan Bonachea --- flang/lib/Optimizer/Builder/IntrinsicCall.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index d5b4b77f8cb98..cd39a01ff03a9 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -3705,7 +3705,7 @@ void IntrinsicLibrary::genCoMax(llvm::ArrayRef args) { builder .create(loc, builder.getRefType(builder.getI32Type())) .getResult(); - mlir::Value remoteImage = + mlir::Value resultImage = isStaticallyAbsent(args[1]) ? refNone : fir::getBase(args[1]); mlir::Value status = isStaticallyAbsent(args[2]) ? refNone : fir::getBase(args[2]); @@ -3713,7 +3713,7 @@ void IntrinsicLibrary::genCoMax(llvm::ArrayRef args) { isStaticallyAbsent(args[3]) ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() : fir::getBase(args[3]); - fir::runtime::genCoMax(builder, loc, fir::getBase(args[0]), remoteImage, + fir::runtime::genCoMax(builder, loc, fir::getBase(args[0]), resultImage, status, errmsg); } @@ -3725,7 +3725,7 @@ void IntrinsicLibrary::genCoMin(llvm::ArrayRef args) { builder .create(loc, builder.getRefType(builder.getI32Type())) .getResult(); - mlir::Value remoteImage = + mlir::Value resultImage = isStaticallyAbsent(args[1]) ? refNone : fir::getBase(args[1]); mlir::Value status = isStaticallyAbsent(args[2]) ? refNone : fir::getBase(args[2]); @@ -3733,7 +3733,7 @@ void IntrinsicLibrary::genCoMin(llvm::ArrayRef args) { isStaticallyAbsent(args[3]) ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() : fir::getBase(args[3]); - fir::runtime::genCoMin(builder, loc, fir::getBase(args[0]), remoteImage, + fir::runtime::genCoMin(builder, loc, fir::getBase(args[0]), resultImage, status, errmsg); } @@ -3745,7 +3745,7 @@ void IntrinsicLibrary::genCoSum(llvm::ArrayRef args) { builder .create(loc, builder.getRefType(builder.getI32Type())) .getResult(); - mlir::Value remoteImage = + mlir::Value resultImage = isStaticallyAbsent(args[1]) ? absentInt : fir::getBase(args[1]); mlir::Value status = isStaticallyAbsent(args[2]) ? absentInt : fir::getBase(args[2]); @@ -3753,7 +3753,7 @@ void IntrinsicLibrary::genCoSum(llvm::ArrayRef args) { isStaticallyAbsent(args[3]) ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() : fir::getBase(args[3]); - fir::runtime::genCoSum(builder, loc, fir::getBase(args[0]), remoteImage, + fir::runtime::genCoSum(builder, loc, fir::getBase(args[0]), resultImage, status, errmsg); } From b1fc2cdda83d2e0464eaf47ef13e8cc0dd2e71f7 Mon Sep 17 00:00:00 2001 From: Jean-Didier Pailleux Date: Fri, 22 Aug 2025 14:43:27 +0200 Subject: [PATCH 4/6] Update CO_BROADCAST and fix alphabetical order --- .../flang/Optimizer/Builder/IntrinsicCall.h | 8 ++++---- flang/lib/Optimizer/Builder/IntrinsicCall.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h index 84ed16c088e00..1cdc72d3bfd4f 100644 --- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h +++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h @@ -225,10 +225,6 @@ struct IntrinsicLibrary { fir::ExtendedValue genCharacterCompare(mlir::Type, llvm::ArrayRef); mlir::Value genCmplx(mlir::Type, llvm::ArrayRef); - void genCoBroadcast(llvm::ArrayRef); - void genCoMax(llvm::ArrayRef); - void genCoMin(llvm::ArrayRef); - void genCoSum(llvm::ArrayRef); mlir::Value genConjg(mlir::Type, llvm::ArrayRef); fir::ExtendedValue genCount(mlir::Type, llvm::ArrayRef); void genCpuTime(llvm::ArrayRef); @@ -250,6 +246,10 @@ struct IntrinsicLibrary { template fir::ExtendedValue genCPtrCompare(mlir::Type, llvm::ArrayRef); + void genCoBroadcast(llvm::ArrayRef); + void genCoMax(llvm::ArrayRef); + void genCoMin(llvm::ArrayRef); + void genCoSum(llvm::ArrayRef); mlir::Value genCosd(mlir::Type, llvm::ArrayRef); mlir::Value genCospi(mlir::Type, llvm::ArrayRef); void genDateAndTime(llvm::ArrayRef); diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index cd39a01ff03a9..8e6d3c311ff87 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -400,7 +400,7 @@ static constexpr IntrinsicHandler handlers[]{ {"co_broadcast", &I::genCoBroadcast, {{{"a", asBox}, - {"source_image", asAddr, handleDynamicOptional}, + {"source_image", asAddr}, {"stat", asAddr, handleDynamicOptional}, {"errmsg", asBox, handleDynamicOptional}}}, /*isElemental*/ false}, @@ -3681,14 +3681,14 @@ mlir::Value IntrinsicLibrary::genCmplx(mlir::Type resultType, void IntrinsicLibrary::genCoBroadcast(llvm::ArrayRef args) { checkCoarrayEnabled(); assert(args.size() == 4); - mlir::Value refNone = - builder - .create(loc, builder.getRefType(builder.getI32Type())) - .getResult(); - mlir::Value sourceImage = - isStaticallyAbsent(args[1]) ? refNone : fir::getBase(args[1]); + mlir::Value sourceImage = fir::getBase(args[1]); mlir::Value status = - isStaticallyAbsent(args[2]) ? refNone : fir::getBase(args[2]); + isStaticallyAbsent(args[2]) + ? builder + .create(loc, + builder.getRefType(builder.getI32Type())) + .getResult() + : fir::getBase(args[2]); mlir::Value errmsg = isStaticallyAbsent(args[3]) ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() From 9978426b4b598aa5713d1bd6eddf536061582976 Mon Sep 17 00:00:00 2001 From: Jean-Didier Pailleux Date: Sun, 24 Aug 2025 20:57:22 +0200 Subject: [PATCH 5/6] Update builder.create into fir::CallOp::create --- flang/lib/Optimizer/Builder/Runtime/Coarray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp index dbeb54fd76599..36130e984ca6f 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp @@ -118,7 +118,7 @@ void genCollectiveSubroutine(fir::FirOpBuilder &builder, mlir::Location loc, auto [errmsgArg, errmsgAllocArg] = genErrmsgPRIF(builder, loc, errmsg); llvm::SmallVector args = fir::runtime::createArguments( builder, loc, ftype, A, rootImage, stat, errmsgArg, errmsgAllocArg); - builder.create(loc, funcOp, args); + fir::CallOp::create(builder, loc, funcOp, args); } /// Generate call to runtime subroutine prif_co_broadcast From ce295bd84bc8f78b0a339a5bd3cab7cc6e6d7756 Mon Sep 17 00:00:00 2001 From: Jean-Didier Pailleux Date: Mon, 8 Sep 2025 09:54:20 +0200 Subject: [PATCH 6/6] [flang] Update builder.create to T::create --- flang/lib/Optimizer/Builder/IntrinsicCall.cpp | 25 +++++++++---------- .../lib/Optimizer/Builder/Runtime/Coarray.cpp | 20 +++++++-------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 8e6d3c311ff87..d31b99e926bf6 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -3684,14 +3684,13 @@ void IntrinsicLibrary::genCoBroadcast(llvm::ArrayRef args) { mlir::Value sourceImage = fir::getBase(args[1]); mlir::Value status = isStaticallyAbsent(args[2]) - ? builder - .create(loc, - builder.getRefType(builder.getI32Type())) + ? fir::AbsentOp::create(builder, loc, + builder.getRefType(builder.getI32Type())) .getResult() : fir::getBase(args[2]); mlir::Value errmsg = isStaticallyAbsent(args[3]) - ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + ? 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); @@ -3702,8 +3701,8 @@ void IntrinsicLibrary::genCoMax(llvm::ArrayRef args) { checkCoarrayEnabled(); assert(args.size() == 4); mlir::Value refNone = - builder - .create(loc, builder.getRefType(builder.getI32Type())) + fir::AbsentOp::create(builder, loc, + builder.getRefType(builder.getI32Type())) .getResult(); mlir::Value resultImage = isStaticallyAbsent(args[1]) ? refNone : fir::getBase(args[1]); @@ -3711,7 +3710,7 @@ void IntrinsicLibrary::genCoMax(llvm::ArrayRef args) { isStaticallyAbsent(args[2]) ? refNone : fir::getBase(args[2]); mlir::Value errmsg = isStaticallyAbsent(args[3]) - ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + ? 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); @@ -3722,8 +3721,8 @@ void IntrinsicLibrary::genCoMin(llvm::ArrayRef args) { checkCoarrayEnabled(); assert(args.size() == 4); mlir::Value refNone = - builder - .create(loc, builder.getRefType(builder.getI32Type())) + fir::AbsentOp::create(builder, loc, + builder.getRefType(builder.getI32Type())) .getResult(); mlir::Value resultImage = isStaticallyAbsent(args[1]) ? refNone : fir::getBase(args[1]); @@ -3731,7 +3730,7 @@ void IntrinsicLibrary::genCoMin(llvm::ArrayRef args) { isStaticallyAbsent(args[2]) ? refNone : fir::getBase(args[2]); mlir::Value errmsg = isStaticallyAbsent(args[3]) - ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + ? 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); @@ -3742,8 +3741,8 @@ void IntrinsicLibrary::genCoSum(llvm::ArrayRef args) { checkCoarrayEnabled(); assert(args.size() == 4); mlir::Value absentInt = - builder - .create(loc, builder.getRefType(builder.getI32Type())) + fir::AbsentOp::create(builder, loc, + builder.getRefType(builder.getI32Type())) .getResult(); mlir::Value resultImage = isStaticallyAbsent(args[1]) ? absentInt : fir::getBase(args[1]); @@ -3751,7 +3750,7 @@ void IntrinsicLibrary::genCoSum(llvm::ArrayRef args) { isStaticallyAbsent(args[2]) ? absentInt : fir::getBase(args[2]); mlir::Value errmsg = isStaticallyAbsent(args[3]) - ? builder.create(loc, PRIF_ERRMSG_TYPE).getResult() + ? 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); diff --git a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp index 36130e984ca6f..9a893d61122ac 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Coarray.cpp @@ -26,7 +26,7 @@ genErrmsgPRIF(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value errmsg) { bool isAllocatableErrmsg = fir::isAllocatableType(errmsg.getType()); - mlir::Value absent = builder.create(loc, PRIF_ERRMSG_TYPE); + mlir::Value absent = fir::AbsentOp::create(builder, loc, PRIF_ERRMSG_TYPE); mlir::Value errMsg = isAllocatableErrmsg ? absent : errmsg; mlir::Value errMsgAlloc = isAllocatableErrmsg ? errmsg : absent; return {errMsg, errMsgAlloc}; @@ -42,8 +42,8 @@ mlir::Value fir::runtime::genInitCoarray(fir::FirOpBuilder &builder, builder.createFunction(loc, PRIFNAME_SUB("init"), ftype); llvm::SmallVector args = fir::runtime::createArguments(builder, loc, ftype, result); - builder.create(loc, funcOp, args); - return builder.create(loc, result); + fir::CallOp::create(builder, loc, funcOp, args); + return fir::LoadOp::create(builder, loc, result); } /// Generate Call to runtime prif_num_images @@ -56,8 +56,8 @@ mlir::Value fir::runtime::getNumImages(fir::FirOpBuilder &builder, builder.createFunction(loc, PRIFNAME_SUB("num_images"), ftype); llvm::SmallVector args = fir::runtime::createArguments(builder, loc, ftype, result); - builder.create(loc, funcOp, args); - return builder.create(loc, result); + fir::CallOp::create(builder, loc, funcOp, args); + return fir::LoadOp::create(builder, loc, result); } /// Generate Call to runtime prif_num_images_with_{team|team_number} @@ -81,8 +81,8 @@ mlir::Value fir::runtime::getNumImagesWithTeam(fir::FirOpBuilder &builder, team = builder.createBox(loc, team); llvm::SmallVector args = fir::runtime::createArguments(builder, loc, ftype, team, result); - builder.create(loc, funcOp, args); - return builder.create(loc, result); + fir::CallOp::create(builder, loc, funcOp, args); + return fir::LoadOp::create(builder, loc, result); } /// Generate Call to runtime prif_this_image_no_coarray @@ -96,11 +96,11 @@ mlir::Value fir::runtime::getThisImage(fir::FirOpBuilder &builder, mlir::Value result = builder.createTemporary(loc, builder.getI32Type()); mlir::Value teamArg = - !team ? builder.create(loc, boxTy) : team; + !team ? fir::AbsentOp::create(builder, loc, boxTy) : team; llvm::SmallVector args = fir::runtime::createArguments(builder, loc, ftype, teamArg, result); - builder.create(loc, funcOp, args); - return builder.create(loc, result); + fir::CallOp::create(builder, loc, funcOp, args); + return fir::LoadOp::create(builder, loc, result); } /// Generate call to collective subroutines except co_reduce