diff --git a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h index 99161c57fbe288c..809d5b8d569dc94 100644 --- a/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h +++ b/flang/include/flang/Optimizer/Builder/Runtime/RTBuilder.h @@ -53,10 +53,10 @@ namespace fir::runtime { using TypeBuilderFunc = mlir::Type (*)(mlir::MLIRContext *); using FuncTypeBuilderFunc = mlir::FunctionType (*)(mlir::MLIRContext *); -#define REDUCTION_OPERATION_MODEL(T) \ +#define REDUCTION_REF_OPERATION_MODEL(T) \ template <> \ constexpr TypeBuilderFunc \ - getModel>() { \ + getModel>() { \ return [](mlir::MLIRContext *context) -> mlir::Type { \ TypeBuilderFunc f{getModel()}; \ auto refTy = fir::ReferenceType::get(f(context)); \ @@ -480,18 +480,18 @@ constexpr TypeBuilderFunc getModel() { }; } -REDUCTION_OPERATION_MODEL(std::int8_t) -REDUCTION_OPERATION_MODEL(std::int16_t) -REDUCTION_OPERATION_MODEL(std::int32_t) -REDUCTION_OPERATION_MODEL(std::int64_t) -REDUCTION_OPERATION_MODEL(Fortran::common::int128_t) +REDUCTION_REF_OPERATION_MODEL(std::int8_t) +REDUCTION_REF_OPERATION_MODEL(std::int16_t) +REDUCTION_REF_OPERATION_MODEL(std::int32_t) +REDUCTION_REF_OPERATION_MODEL(std::int64_t) +REDUCTION_REF_OPERATION_MODEL(Fortran::common::int128_t) -REDUCTION_OPERATION_MODEL(float) -REDUCTION_OPERATION_MODEL(double) -REDUCTION_OPERATION_MODEL(long double) +REDUCTION_REF_OPERATION_MODEL(float) +REDUCTION_REF_OPERATION_MODEL(double) +REDUCTION_REF_OPERATION_MODEL(long double) -REDUCTION_OPERATION_MODEL(std::complex) -REDUCTION_OPERATION_MODEL(std::complex) +REDUCTION_REF_OPERATION_MODEL(std::complex) +REDUCTION_REF_OPERATION_MODEL(std::complex) REDUCTION_CHAR_OPERATION_MODEL(char) REDUCTION_CHAR_OPERATION_MODEL(char16_t) diff --git a/flang/include/flang/Runtime/reduce.h b/flang/include/flang/Runtime/reduce.h index 975aa6dea305f52..60f54c393b4bbd9 100644 --- a/flang/include/flang/Runtime/reduce.h +++ b/flang/include/flang/Runtime/reduce.h @@ -28,7 +28,9 @@ namespace Fortran::runtime { class Descriptor; -template using ReductionOperation = T (*)(const T *, const T *); +template +using ReferenceReductionOperation = T (*)(const T *, const T *); +template using ValueReductionOperation = T (*)(T, T); template using ReductionCharOperation = void (*)(CHAR *hiddenResult, std::size_t resultLen, const CHAR *x, const CHAR *y, std::size_t xLen, @@ -38,185 +40,364 @@ using ReductionDerivedTypeOperation = void (*)( extern "C" { -std::int8_t RTDECL(ReduceInteger1)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr, - bool ordered = true); -void RTDECL(ReduceInteger1Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, +std::int8_t RTDECL(ReduceInteger1Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +std::int8_t RTDECL(ReduceInteger1Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr, bool ordered = true); -std::int16_t RTDECL(ReduceInteger2)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const std::int16_t *identity = nullptr, - bool ordered = true); -void RTDECL(ReduceInteger2Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, const std::int16_t *identity = nullptr, - bool ordered = true); -std::int32_t RTDECL(ReduceInteger4)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const std::int32_t *identity = nullptr, - bool ordered = true); -void RTDECL(ReduceInteger4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, const std::int32_t *identity = nullptr, - bool ordered = true); -std::int64_t RTDECL(ReduceInteger8)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const std::int64_t *identity = nullptr, - bool ordered = true); -void RTDECL(ReduceInteger8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, const std::int64_t *identity = nullptr, - bool ordered = true); +std::int16_t RTDECL(ReduceInteger2Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +std::int16_t RTDECL(ReduceInteger2Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +std::int32_t RTDECL(ReduceInteger4Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +std::int32_t RTDECL(ReduceInteger4Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +std::int64_t RTDECL(ReduceInteger8Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +std::int64_t RTDECL(ReduceInteger8Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); #ifdef __SIZEOF_INT128__ -common::int128_t RTDECL(ReduceInteger16)(const Descriptor &, - ReductionOperation, const char *source, int line, +common::int128_t RTDECL(ReduceInteger16Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const common::int128_t *identity = nullptr, bool ordered = true); -void RTDECL(ReduceInteger16Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, +common::int128_t RTDECL(ReduceInteger16Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const common::int128_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const common::int128_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger16DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation, + const char *source, int line, int dim, const Descriptor *mask = nullptr, const common::int128_t *identity = nullptr, bool ordered = true); #endif // REAL/COMPLEX(2 & 3) return 32-bit float results for the caller to downconvert -float RTDECL(ReduceReal2)(const Descriptor &, ReductionOperation, - const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, +float RTDECL(ReduceReal2Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, const float *identity = nullptr, bool ordered = true); -void RTDECL(ReduceReal2Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, +float RTDECL(ReduceReal2Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const float *identity = nullptr, bool ordered = true); -float RTDECL(ReduceReal3)(const Descriptor &, ReductionOperation, - const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, +void RTDECL(ReduceReal2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +float RTDECL(ReduceReal3Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, const float *identity = nullptr, bool ordered = true); -void RTDECL(ReduceReal3Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, +float RTDECL(ReduceReal3Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const float *identity = nullptr, bool ordered = true); -float RTDECL(ReduceReal4)(const Descriptor &, ReductionOperation, - const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, +void RTDECL(ReduceReal3DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal3DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +float RTDECL(ReduceReal4Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, const float *identity = nullptr, bool ordered = true); -void RTDECL(ReduceReal4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, +float RTDECL(ReduceReal4Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const float *identity = nullptr, bool ordered = true); -double RTDECL(ReduceReal8)(const Descriptor &, ReductionOperation, - const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, +void RTDECL(ReduceReal4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +double RTDECL(ReduceReal8Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, const double *identity = nullptr, bool ordered = true); -void RTDECL(ReduceReal8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, +double RTDECL(ReduceReal8Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const double *identity = nullptr, bool ordered = true); -#if LDBL_MANT_DIG == 64 -long double RTDECL(ReduceReal10)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const long double *identity = nullptr, +void RTDECL(ReduceReal8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const double *identity = nullptr, bool ordered = true); -void RTDECL(ReduceReal10Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, +void RTDECL(ReduceReal8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const double *identity = nullptr, + bool ordered = true); +#if LDBL_MANT_DIG == 64 +long double RTDECL(ReduceReal10Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const long double *identity = nullptr, bool ordered = true); +long double RTDECL(ReduceReal10Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const long double *identity = nullptr, bool ordered = true); +void RTDECL(ReduceReal10DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const long double *identity = nullptr, bool ordered = true); +void RTDECL(ReduceReal10DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, int dim, const Descriptor *mask = nullptr, const long double *identity = nullptr, bool ordered = true); #endif #if LDBL_MANT_DIG == 113 || HAS_FLOAT128 -CppFloat128Type RTDECL(ReduceReal16)(const Descriptor &, - ReductionOperation, const char *source, int line, +CppFloat128Type RTDECL(ReduceReal16Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const CppFloat128Type *identity = nullptr, bool ordered = true); -void RTDECL(ReduceReal16Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, const CppFloat128Type *identity = nullptr, - bool ordered = true); +CppFloat128Type RTDECL(ReduceReal16Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const CppFloat128Type *identity = nullptr, bool ordered = true); +void RTDECL(ReduceReal16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const CppFloat128Type *identity = nullptr, bool ordered = true); +void RTDECL(ReduceReal16DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const CppFloat128Type *identity = nullptr, bool ordered = true); #endif -void RTDECL(CppReduceComplex2)(std::complex &, const Descriptor &, - ReductionOperation>, const char *source, int line, +void RTDECL(CppReduceComplex2Ref)(std::complex &, const Descriptor &, + ReferenceReductionOperation>, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex2Value)(std::complex &, const Descriptor &, + ValueReductionOperation>, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex2Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation>, const char *source, int line, - int dim, const Descriptor *mask = nullptr, +void RTDECL(CppReduceComplex2DimRef)(Descriptor &result, + const Descriptor &array, ReferenceReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex2DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex3)(std::complex &, const Descriptor &, - ReductionOperation>, const char *source, int line, +void RTDECL(CppReduceComplex3Ref)(std::complex &, const Descriptor &, + ReferenceReductionOperation>, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex3Value)(std::complex &, const Descriptor &, + ValueReductionOperation>, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex3Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation>, const char *source, int line, - int dim, const Descriptor *mask = nullptr, +void RTDECL(CppReduceComplex3DimRef)(Descriptor &result, + const Descriptor &array, ReferenceReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex3DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex4)(std::complex &, const Descriptor &, - ReductionOperation>, const char *source, int line, +void RTDECL(CppReduceComplex4Ref)(std::complex &, const Descriptor &, + ReferenceReductionOperation>, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex4Value)(std::complex &, const Descriptor &, + ValueReductionOperation>, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation>, const char *source, int line, - int dim, const Descriptor *mask = nullptr, +void RTDECL(CppReduceComplex4DimRef)(Descriptor &result, + const Descriptor &array, ReferenceReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex8)(std::complex &, const Descriptor &, - ReductionOperation>, const char *source, int line, +void RTDECL(CppReduceComplex4DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex8Ref)(std::complex &, const Descriptor &, + ReferenceReductionOperation>, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex8Value)(std::complex &, const Descriptor &, + ValueReductionOperation>, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation>, const char *source, int line, - int dim, const Descriptor *mask = nullptr, +void RTDECL(CppReduceComplex8DimRef)(Descriptor &result, + const Descriptor &array, ReferenceReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex8DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); #if LDBL_MANT_DIG == 64 -void RTDECL(CppReduceComplex10)(std::complex &, const Descriptor &, - ReductionOperation>, const char *source, int line, - int dim = 0, const Descriptor *mask = nullptr, +void RTDECL(CppReduceComplex10Ref)(std::complex &, + const Descriptor &, ReferenceReductionOperation>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex10Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation>, const char *source, int line, - int dim, const Descriptor *mask = nullptr, +void RTDECL(CppReduceComplex10Value)(std::complex &, + const Descriptor &, ValueReductionOperation>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex10DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation>, const char *source, + int line, int dim, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, bool ordered = true); +void RTDECL(CppReduceComplex10DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); #endif #if LDBL_MANT_DIG == 113 || HAS_FLOAT128 -void RTDECL(CppReduceComplex16)(std::complex &, - const Descriptor &, ReductionOperation>, +void RTDECL(CppReduceComplex16Ref)(std::complex &, + const Descriptor &, + ReferenceReductionOperation>, const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); -void RTDECL(CppReduceComplex16Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation>, const char *source, +void RTDECL(CppReduceComplex16Value)(std::complex &, + const Descriptor &, ValueReductionOperation>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex16DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::complex *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex16DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation>, const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::complex *identity = nullptr, bool ordered = true); #endif -bool RTDECL(ReduceLogical1)(const Descriptor &, ReductionOperation, - const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, +bool RTDECL(ReduceLogical1Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical1Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr, bool ordered = true); -void RTDECL(ReduceLogical1Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, +void RTDECL(ReduceLogical1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, int dim, const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr, bool ordered = true); -bool RTDECL(ReduceLogical2)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const std::int16_t *identity = nullptr, - bool ordered = true); -void RTDECL(ReduceLogical2Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, const std::int16_t *identity = nullptr, - bool ordered = true); -bool RTDECL(ReduceLogical4)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const std::int32_t *identity = nullptr, - bool ordered = true); -void RTDECL(ReduceLogical4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, const std::int32_t *identity = nullptr, - bool ordered = true); -bool RTDECL(ReduceLogical8)(const Descriptor &, - ReductionOperation, const char *source, int line, int dim = 0, - const Descriptor *mask = nullptr, const std::int64_t *identity = nullptr, - bool ordered = true); -void RTDECL(ReduceLogical8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation, const char *source, int line, int dim, - const Descriptor *mask = nullptr, const std::int64_t *identity = nullptr, - bool ordered = true); +bool RTDECL(ReduceLogical2Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical2Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical4Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical4Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical8Ref)(const Descriptor &, + ReferenceReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical8Value)(const Descriptor &, + ValueReductionOperation, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); void RTDECL(ReduceChar1)(char *result, const Descriptor &array, ReductionCharOperation, const char *source, int line, int dim = 0, diff --git a/flang/lib/Optimizer/Builder/Runtime/Reduction.cpp b/flang/lib/Optimizer/Builder/Runtime/Reduction.cpp index 4b086a98de47b22..c306b50eb56983c 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Reduction.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Reduction.cpp @@ -469,7 +469,8 @@ struct ForcedIParity16 { /// Placeholder for real*10 version of Reduce Intrinsic struct ForcedReduceReal10 { - static constexpr const char *name = ExpandAndQuoteKey(RTNAME(ReduceReal10)); + static constexpr const char *name = + ExpandAndQuoteKey(RTNAME(ReduceReal10Ref)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::FloatType::getF80(ctx); @@ -488,7 +489,8 @@ struct ForcedReduceReal10 { /// Placeholder for real*16 version of Reduce Intrinsic struct ForcedReduceReal16 { - static constexpr const char *name = ExpandAndQuoteKey(RTNAME(ReduceReal16)); + static constexpr const char *name = + ExpandAndQuoteKey(RTNAME(ReduceReal16Ref)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::FloatType::getF128(ctx); @@ -508,7 +510,7 @@ struct ForcedReduceReal16 { /// Placeholder for DIM real*10 version of Reduce Intrinsic struct ForcedReduceReal10Dim { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(ReduceReal10Dim)); + ExpandAndQuoteKey(RTNAME(ReduceReal10DimRef)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::FloatType::getF80(ctx); @@ -530,7 +532,7 @@ struct ForcedReduceReal10Dim { /// Placeholder for DIM real*16 version of Reduce Intrinsic struct ForcedReduceReal16Dim { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(ReduceReal16Dim)); + ExpandAndQuoteKey(RTNAME(ReduceReal16DimRef)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::FloatType::getF128(ctx); @@ -552,7 +554,7 @@ struct ForcedReduceReal16Dim { /// Placeholder for integer*16 version of Reduce Intrinsic struct ForcedReduceInteger16 { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(ReduceInteger16)); + ExpandAndQuoteKey(RTNAME(ReduceInteger16Ref)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::IntegerType::get(ctx, 128); @@ -572,7 +574,7 @@ struct ForcedReduceInteger16 { /// Placeholder for DIM integer*16 version of Reduce Intrinsic struct ForcedReduceInteger16Dim { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(ReduceInteger16Dim)); + ExpandAndQuoteKey(RTNAME(ReduceInteger16DimRef)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::IntegerType::get(ctx, 128); @@ -594,7 +596,7 @@ struct ForcedReduceInteger16Dim { /// Placeholder for complex(10) version of Reduce Intrinsic struct ForcedReduceComplex10 { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(CppReduceComplex10)); + ExpandAndQuoteKey(RTNAME(CppReduceComplex10Ref)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::ComplexType::get(mlir::FloatType::getF80(ctx)); @@ -615,7 +617,7 @@ struct ForcedReduceComplex10 { /// Placeholder for Dim complex(10) version of Reduce Intrinsic struct ForcedReduceComplex10Dim { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(CppReduceComplex10Dim)); + ExpandAndQuoteKey(RTNAME(CppReduceComplex10DimRef)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::ComplexType::get(mlir::FloatType::getF80(ctx)); @@ -637,7 +639,7 @@ struct ForcedReduceComplex10Dim { /// Placeholder for complex(16) version of Reduce Intrinsic struct ForcedReduceComplex16 { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(CppReduceComplex16)); + ExpandAndQuoteKey(RTNAME(CppReduceComplex16Ref)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::ComplexType::get(mlir::FloatType::getF128(ctx)); @@ -658,7 +660,7 @@ struct ForcedReduceComplex16 { /// Placeholder for Dim complex(16) version of Reduce Intrinsic struct ForcedReduceComplex16Dim { static constexpr const char *name = - ExpandAndQuoteKey(RTNAME(CppReduceComplex16Dim)); + ExpandAndQuoteKey(RTNAME(CppReduceComplex16DimRef)); static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { return [](mlir::MLIRContext *ctx) { auto ty = mlir::ComplexType::get(mlir::FloatType::getF128(ctx)); @@ -1471,17 +1473,17 @@ void fir::runtime::genReduce(fir::FirOpBuilder &builder, mlir::Location loc, fir::factory::CharacterExprHelper charHelper{builder, loc}; if (eleTy == fir::ComplexType::get(ctx, 2)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy == fir::ComplexType::get(ctx, 3)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy == fir::ComplexType::get(ctx, 4)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy == fir::ComplexType::get(ctx, 8)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy == fir::ComplexType::get(ctx, 10)) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::ComplexType::get(ctx, 16)) @@ -1529,35 +1531,43 @@ mlir::Value fir::runtime::genReduce(fir::FirOpBuilder &builder, "expect real, interger or logical"); if (eleTy.isF16()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isBF16()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF32()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF64()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF80()) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF128()) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(1))) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(2))) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(4))) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(8))) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(16))) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::LogicalType::get(ctx, 1)) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::LogicalType::get(ctx, 2)) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::LogicalType::get(ctx, 4)) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::LogicalType::get(ctx, 8)) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else fir::intrinsicTypeTODO(builder, eleTy, loc, "REDUCE"); @@ -1586,59 +1596,63 @@ void fir::runtime::genReduceDim(fir::FirOpBuilder &builder, mlir::Location loc, fir::factory::CharacterExprHelper charHelper{builder, loc}; if (eleTy.isF16()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isBF16()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF32()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF64()) - func = fir::runtime::getRuntimeFunc(loc, builder); + func = + fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF80()) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isF128()) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(1))) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(2))) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(4))) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(8))) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy.isInteger(builder.getKindMap().getIntegerBitsize(16))) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::ComplexType::get(ctx, 2)) - func = fir::runtime::getRuntimeFunc(loc, - builder); + func = fir::runtime::getRuntimeFunc( + loc, builder); else if (eleTy == fir::ComplexType::get(ctx, 3)) - func = fir::runtime::getRuntimeFunc(loc, - builder); + func = fir::runtime::getRuntimeFunc( + loc, builder); else if (eleTy == fir::ComplexType::get(ctx, 4)) - func = fir::runtime::getRuntimeFunc(loc, - builder); + func = fir::runtime::getRuntimeFunc( + loc, builder); else if (eleTy == fir::ComplexType::get(ctx, 8)) - func = fir::runtime::getRuntimeFunc(loc, - builder); + func = fir::runtime::getRuntimeFunc( + loc, builder); else if (eleTy == fir::ComplexType::get(ctx, 10)) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::ComplexType::get(ctx, 16)) func = fir::runtime::getRuntimeFunc(loc, builder); else if (eleTy == fir::LogicalType::get(ctx, 1)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy == fir::LogicalType::get(ctx, 2)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy == fir::LogicalType::get(ctx, 4)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (eleTy == fir::LogicalType::get(ctx, 8)) - func = - fir::runtime::getRuntimeFunc(loc, builder); + func = fir::runtime::getRuntimeFunc(loc, + builder); else if (fir::isa_char(eleTy) && charHelper.getCharacterKind(eleTy) == 1) func = fir::runtime::getRuntimeFunc(loc, builder); diff --git a/flang/runtime/reduce.cpp b/flang/runtime/reduce.cpp index f8a5221a1ebf76f..2f4bb6ea159cf4e 100644 --- a/flang/runtime/reduce.cpp +++ b/flang/runtime/reduce.cpp @@ -16,11 +16,12 @@ namespace Fortran::runtime { -template class ReduceAccumulator { +template class ReduceAccumulator { public: - RT_API_ATTRS ReduceAccumulator(const Descriptor &array, - ReductionOperation operation, const T *identity, - Terminator &terminator) + using Operation = std::conditional_t, + ReferenceReductionOperation>; + RT_API_ATTRS ReduceAccumulator(const Descriptor &array, Operation operation, + const T *identity, Terminator &terminator) : array_{array}, operation_{operation}, identity_{identity}, terminator_{terminator} {} RT_API_ATTRS void Reinitialize() { result_.reset(); } @@ -28,7 +29,11 @@ template class ReduceAccumulator { RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { const auto *operand{array_.Element(at)}; if (result_) { - result_ = operation_(&*result_, operand); + if constexpr (isByValue) { + result_ = operation_(*result_, *operand); + } else { + result_ = operation_(&*result_, operand); + } } else { result_ = *operand; } @@ -48,7 +53,7 @@ template class ReduceAccumulator { private: const Descriptor &array_; common::optional result_; - ReductionOperation operation_; + Operation operation_; const T *identity_{nullptr}; Terminator &terminator_; }; @@ -104,104 +109,213 @@ class BufferedReduceAccumulator { extern "C" { RT_EXT_API_GROUP_BEGIN -std::int8_t RTDEF(ReduceInteger1)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int8_t *identity, +std::int8_t RTDEF(ReduceInteger1Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int8_t RTDEF(ReduceInteger1Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator{array, operation, identity, terminator}, + ReduceAccumulator{ + array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceInteger1Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int8_t *identity, +void RTDEF(ReduceInteger1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } -std::int16_t RTDEF(ReduceInteger2)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int16_t *identity, +std::int16_t RTDEF(ReduceInteger2Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int16_t RTDEF(ReduceInteger2Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator{array, operation, identity, terminator}, + ReduceAccumulator{ + array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceInteger2Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int16_t *identity, +void RTDEF(ReduceInteger2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } -std::int32_t RTDEF(ReduceInteger4)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int32_t *identity, +std::int32_t RTDEF(ReduceInteger4Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int32_t RTDEF(ReduceInteger4Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator{array, operation, identity, terminator}, + ReduceAccumulator{ + array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceInteger4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int32_t *identity, +void RTDEF(ReduceInteger4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } -std::int64_t RTDEF(ReduceInteger8)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int64_t *identity, +std::int64_t RTDEF(ReduceInteger8Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int64_t RTDEF(ReduceInteger8Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator{array, operation, identity, terminator}, + ReduceAccumulator{ + array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceInteger8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int64_t *identity, +void RTDEF(ReduceInteger8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } #ifdef __SIZEOF_INT128__ -common::int128_t RTDEF(ReduceInteger16)(const Descriptor &array, - ReductionOperation operation, const char *source, +common::int128_t RTDEF(ReduceInteger16Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const common::int128_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{ + array, operation, identity, terminator}, + "REDUCE"); +} +common::int128_t RTDEF(ReduceInteger16Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, int line, int dim, const Descriptor *mask, const common::int128_t *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator{ + ReduceAccumulator{ array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceInteger16Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, +void RTDEF(ReduceInteger16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const common::int128_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger16DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, int line, int dim, const Descriptor *mask, const common::int128_t *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); @@ -209,231 +323,464 @@ void RTDEF(ReduceInteger16Dim)(Descriptor &result, const Descriptor &array, #endif // TODO: real/complex(2 & 3) -float RTDEF(ReduceReal4)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, int dim, - const Descriptor *mask, const float *identity, bool ordered) { +float RTDEF(ReduceReal4Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{array, operation, identity, terminator}, + "REDUCE"); +} +float RTDEF(ReduceReal4Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, - mask, ReduceAccumulator{array, operation, identity, terminator}, + mask, + ReduceAccumulator{array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceReal4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, int dim, - const Descriptor *mask, const float *identity, bool ordered) { +void RTDEF(ReduceReal4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } -double RTDEF(ReduceReal8)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, int dim, - const Descriptor *mask, const double *identity, bool ordered) { +double RTDEF(ReduceReal8Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, - mask, ReduceAccumulator{array, operation, identity, terminator}, + mask, + ReduceAccumulator{array, operation, identity, terminator}, + "REDUCE"); +} +double RTDEF(ReduceReal8Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceReal8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, int dim, - const Descriptor *mask, const double *identity, bool ordered) { +void RTDEF(ReduceReal8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } #if LDBL_MANT_DIG == 64 -long double RTDEF(ReduceReal10)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const long double *identity, +long double RTDEF(ReduceReal10Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const long double *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{ + array, operation, identity, terminator}, + "REDUCE"); +} +long double RTDEF(ReduceReal10Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const long double *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator{array, operation, identity, terminator}, + ReduceAccumulator{ + array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceReal10Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const long double *identity, +void RTDEF(ReduceReal10DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const long double *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal10DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const long double *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } #endif #if LDBL_MANT_DIG == 113 || HAS_FLOAT128 -CppFloat128Type RTDEF(ReduceReal16)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const CppFloat128Type *identity, +CppFloat128Type RTDEF(ReduceReal16Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, bool ordered) { Terminator terminator{source, line}; return GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator{ + ReduceAccumulator{ array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(ReduceReal16Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const CppFloat128Type *identity, +CppFloat128Type RTDEF(ReduceReal16Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator; + return GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceReal16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal16DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } #endif -void RTDEF(CppReduceComplex4)(std::complex &result, - const Descriptor &array, ReductionOperation> operation, +void RTDEF(CppReduceComplex4Ref)(std::complex &result, + const Descriptor &array, + ReferenceReductionOperation> operation, const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; result = GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator>{ + ReduceAccumulator, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex4Value)(std::complex &result, + const Descriptor &array, + ValueReductionOperation> operation, const char *source, + int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator, true>{ array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(CppReduceComplex4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation> operation, const char *source, +void RTDEF(CppReduceComplex4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex4DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation> operation, const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator>; + using Accumulator = ReduceAccumulator, true>; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } -void RTDEF(CppReduceComplex8)(std::complex &result, - const Descriptor &array, ReductionOperation> operation, +void RTDEF(CppReduceComplex8Ref)(std::complex &result, + const Descriptor &array, + ReferenceReductionOperation> operation, const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; result = GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator>{ + ReduceAccumulator, false>{ array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(CppReduceComplex8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation> operation, const char *source, +void RTDEF(CppReduceComplex8Value)(std::complex &result, + const Descriptor &array, + ValueReductionOperation> operation, const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator>; + result = GetTotalReduction(array, source, line, dim, + mask, + ReduceAccumulator, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator, false>; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } -#if LDBL_MANT_DIG == 64 -void RTDEF(CppReduceComplex10)(std::complex &result, +void RTDEF(CppReduceComplex8DimValue)(Descriptor &result, const Descriptor &array, - ReductionOperation> operation, const char *source, + ValueReductionOperation> operation, const char *source, int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#if LDBL_MANT_DIG == 64 +void RTDEF(CppReduceComplex10Ref)(std::complex &result, + const Descriptor &array, + ReferenceReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; result = GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator>{ + ReduceAccumulator, false>{ array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(CppReduceComplex10Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation> operation, const char *source, - int line, int dim, const Descriptor *mask, +void RTDEF(CppReduceComplex10Value)(std::complex &result, + const Descriptor &array, + ValueReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator>; + result = GetTotalReduction(array, source, line, + dim, mask, + ReduceAccumulator, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex10DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex10DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator, true>; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } #endif #if LDBL_MANT_DIG == 113 || HAS_FLOAT128 -void RTDEF(CppReduceComplex16)(std::complex &result, +void RTDEF(CppReduceComplex16Ref)(std::complex &result, + const Descriptor &array, + ReferenceReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction(array, source, line, + dim, mask, + ReduceAccumulator, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex16Value)(std::complex &result, const Descriptor &array, - ReductionOperation> operation, + ValueReductionOperation> operation, const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; result = GetTotalReduction(array, source, line, dim, mask, - ReduceAccumulator>{ + ReduceAccumulator, true>{ array, operation, identity, terminator}, "REDUCE"); } -void RTDEF(CppReduceComplex16Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation> operation, +void RTDEF(CppReduceComplex16DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation> operation, const char *source, int line, int dim, const Descriptor *mask, const std::complex *identity, bool ordered) { Terminator terminator{source, line}; - using Accumulator = ReduceAccumulator>; + using Accumulator = ReduceAccumulator, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex16DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation> operation, + const char *source, int line, int dim, const Descriptor *mask, + const std::complex *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator, true>; Accumulator accumulator{array, operation, identity, terminator}; PartialReduction(result, array, array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); } #endif -bool RTDEF(ReduceLogical1)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int8_t *identity, +bool RTDEF(ReduceLogical1Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, bool ordered) { - return RTNAME(ReduceInteger1)( + return RTNAME(ReduceInteger1Ref)( array, operation, source, line, dim, mask, identity, ordered) != 0; } -void RTDEF(ReduceLogical1Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int8_t *identity, +bool RTDEF(ReduceLogical1Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + return RTNAME(ReduceInteger1Value)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +void RTDEF(ReduceLogical1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + RTNAME(ReduceInteger1DimRef) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +void RTDEF(ReduceLogical1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, bool ordered) { - RTNAME(ReduceInteger1Dim) + RTNAME(ReduceInteger1DimValue) (result, array, operation, source, line, dim, mask, identity, ordered); } -bool RTDEF(ReduceLogical2)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int16_t *identity, +bool RTDEF(ReduceLogical2Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, bool ordered) { - return RTNAME(ReduceInteger2)( + return RTNAME(ReduceInteger2Ref)( array, operation, source, line, dim, mask, identity, ordered) != 0; } -void RTDEF(ReduceLogical2Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int16_t *identity, +bool RTDEF(ReduceLogical2Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, bool ordered) { - RTNAME(ReduceInteger2Dim) + return RTNAME(ReduceInteger2Value)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +void RTDEF(ReduceLogical2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + RTNAME(ReduceInteger2DimRef) (result, array, operation, source, line, dim, mask, identity, ordered); } -bool RTDEF(ReduceLogical4)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int32_t *identity, +void RTDEF(ReduceLogical2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, bool ordered) { - return RTNAME(ReduceInteger4)( + RTNAME(ReduceInteger2DimValue) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +bool RTDEF(ReduceLogical4Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + return RTNAME(ReduceInteger4Ref)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +bool RTDEF(ReduceLogical4Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + return RTNAME(ReduceInteger4Value)( array, operation, source, line, dim, mask, identity, ordered) != 0; } -void RTDEF(ReduceLogical4Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int32_t *identity, +void RTDEF(ReduceLogical4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + RTNAME(ReduceInteger4DimRef) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +void RTDEF(ReduceLogical4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, bool ordered) { - RTNAME(ReduceInteger4Dim) + RTNAME(ReduceInteger4DimValue) (result, array, operation, source, line, dim, mask, identity, ordered); } -bool RTDEF(ReduceLogical8)(const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int64_t *identity, +bool RTDEF(ReduceLogical8Ref)(const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, bool ordered) { - return RTNAME(ReduceInteger8)( + return RTNAME(ReduceInteger8Ref)( array, operation, source, line, dim, mask, identity, ordered) != 0; } -void RTDEF(ReduceLogical8Dim)(Descriptor &result, const Descriptor &array, - ReductionOperation operation, const char *source, int line, - int dim, const Descriptor *mask, const std::int64_t *identity, +bool RTDEF(ReduceLogical8Value)(const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + return RTNAME(ReduceInteger8Value)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +void RTDEF(ReduceLogical8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + RTNAME(ReduceInteger8DimRef) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +void RTDEF(ReduceLogical8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, bool ordered) { - RTNAME(ReduceInteger8Dim) + RTNAME(ReduceInteger8DimValue) (result, array, operation, source, line, dim, mask, identity, ordered); } diff --git a/flang/test/Lower/Intrinsics/reduce.f90 b/flang/test/Lower/Intrinsics/reduce.f90 index 8d7b7798a94c560..7619edffd529e94 100644 --- a/flang/test/Lower/Intrinsics/reduce.f90 +++ b/flang/test/Lower/Intrinsics/reduce.f90 @@ -40,7 +40,7 @@ subroutine integer1(a, id) ! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX_PROC]] : (!fir.boxproc<() -> ()>) -> ((!fir.ref, !fir.ref) -> !fir.ref) ! CHECK: %[[A_NONE:.*]] = fir.convert %[[A]]#1 : (!fir.box>) -> !fir.box ! CHECK: %[[MASK_NONE:.*]] = fir.convert %[[MASK]] : (!fir.box) -> !fir.box -! CHECK: %[[REDUCE_RES:.*]] = fir.call @_FortranAReduceInteger1(%[[A_NONE]], %[[BOX_ADDR]], %{{.*}}, %{{.*}}, %c1{{.*}}, %[[MASK_NONE]], %[[IDENTITY]], %false) fastmath : (!fir.box, (!fir.ref, !fir.ref) -> !fir.ref, !fir.ref, i32, i32, !fir.box, !fir.ref, i1) -> i8 +! CHECK: %[[REDUCE_RES:.*]] = fir.call @_FortranAReduceInteger1Ref(%[[A_NONE]], %[[BOX_ADDR]], %{{.*}}, %{{.*}}, %c1{{.*}}, %[[MASK_NONE]], %[[IDENTITY]], %false) fastmath : (!fir.box, (!fir.ref, !fir.ref) -> !fir.ref, !fir.ref, i32, i32, !fir.box, !fir.ref, i1) -> i8 ! CHECK: hlfir.assign %[[REDUCE_RES]] to %[[RES]]#0 : i8, !fir.ref ! CHECK: %[[ADDR_OP:.*]] = fir.address_of(@_QMreduce_modPred_int1) : (!fir.ref, !fir.ref) -> i8 ! CHECK: %[[BOX_PROC:.*]] = fir.emboxproc %[[ADDR_OP]] : ((!fir.ref, !fir.ref) -> i8) -> !fir.boxproc<() -> ()> @@ -48,13 +48,13 @@ subroutine integer1(a, id) ! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX_PROC]] : (!fir.boxproc<() -> ()>) -> ((!fir.ref, !fir.ref) -> !fir.ref) ! CHECK: %[[A_NONE:.*]] = fir.convert %[[A]]#1 : (!fir.box>) -> !fir.box ! CHECK: %[[MASK_NONE:.*]] = fir.convert %[[MASK]] : (!fir.box) -> !fir.box -! CHECK: %{{.*}} = fir.call @_FortranAReduceInteger1(%[[A_NONE]], %[[BOX_ADDR]], %{{.*}}, %{{.*}}, %c1{{.*}}, %[[MASK_NONE]], %[[ID]]#1, %false{{.*}}) fastmath : (!fir.box, (!fir.ref, !fir.ref) -> !fir.ref, !fir.ref, i32, i32, !fir.box, !fir.ref, i1) -> i8 -! CHECK: fir.call @_FortranAReduceInteger1(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}#1, %true) +! CHECK: %{{.*}} = fir.call @_FortranAReduceInteger1Ref(%[[A_NONE]], %[[BOX_ADDR]], %{{.*}}, %{{.*}}, %c1{{.*}}, %[[MASK_NONE]], %[[ID]]#1, %false{{.*}}) fastmath : (!fir.box, (!fir.ref, !fir.ref) -> !fir.ref, !fir.ref, i32, i32, !fir.box, !fir.ref, i1) -> i8 +! CHECK: fir.call @_FortranAReduceInteger1Ref(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}#1, %true) ! CHECK: %[[MASK:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {fortran_attrs = #fir.var_attrs, uniq_name = "_QQro.3xl4.0"} : (!fir.ref>>, !fir.shape<1>) -> (!fir.ref>>, !fir.ref>>) ! CHECK: %[[SHAPE_C3:.*]] = fir.shape %c3{{.*}} : (index) -> !fir.shape<1> ! CHECK: %[[BOXED_MASK:.*]] = fir.embox %[[MASK]]#1(%[[SHAPE_C3]]) : (!fir.ref>>, !fir.shape<1>) -> !fir.box>> ! CHECK: %[[CONV_MASK:.*]] = fir.convert %[[BOXED_MASK]] : (!fir.box>>) -> !fir.box -! CHECK: fir.call @_FortranAReduceInteger1(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %[[CONV_MASK]], %{{.*}}, %false{{.*}}) +! CHECK: fir.call @_FortranAReduceInteger1Ref(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %[[CONV_MASK]], %{{.*}}, %false{{.*}}) pure function red_int2(a,b) integer(2), intent(in) :: a, b @@ -68,7 +68,7 @@ subroutine integer2(a) res = reduce(a, red_int2) end subroutine -! CHECK: fir.call @_FortranAReduceInteger2 +! CHECK: fir.call @_FortranAReduceInteger2Ref pure function red_int4(a,b) integer(4), intent(in) :: a, b @@ -82,7 +82,7 @@ subroutine integer4(a) res = reduce(a, red_int4) end subroutine -! CHECK: fir.call @_FortranAReduceInteger4 +! CHECK: fir.call @_FortranAReduceInteger4Ref pure function red_int8(a,b) integer(8), intent(in) :: a, b @@ -96,7 +96,7 @@ subroutine integer8(a) res = reduce(a, red_int8) end subroutine -! CHECK: fir.call @_FortranAReduceInteger8 +! CHECK: fir.call @_FortranAReduceInteger8Ref pure function red_int16(a,b) integer(16), intent(in) :: a, b @@ -110,7 +110,7 @@ subroutine integer16(a) res = reduce(a, red_int16) end subroutine -! CHECK: fir.call @_FortranAReduceInteger16 +! CHECK: fir.call @_FortranAReduceInteger16Ref pure function red_real2(a,b) real(2), intent(in) :: a, b @@ -124,7 +124,7 @@ subroutine real2(a) res = reduce(a, red_real2) end subroutine -! CHECK: fir.call @_FortranAReduceReal2 +! CHECK: fir.call @_FortranAReduceReal2Ref pure function red_real3(a,b) real(3), intent(in) :: a, b @@ -138,7 +138,7 @@ subroutine real3(a) res = reduce(a, red_real3) end subroutine -! CHECK: fir.call @_FortranAReduceReal3 +! CHECK: fir.call @_FortranAReduceReal3Ref pure function red_real4(a,b) real(4), intent(in) :: a, b @@ -152,7 +152,7 @@ subroutine real4(a) res = reduce(a, red_real4) end subroutine -! CHECK: fir.call @_FortranAReduceReal4 +! CHECK: fir.call @_FortranAReduceReal4Ref pure function red_real8(a,b) real(8), intent(in) :: a, b @@ -166,7 +166,7 @@ subroutine real8(a) res = reduce(a, red_real8) end subroutine -! CHECK: fir.call @_FortranAReduceReal8 +! CHECK: fir.call @_FortranAReduceReal8Ref pure function red_real10(a,b) real(10), intent(in) :: a, b @@ -180,7 +180,7 @@ subroutine real10(a) res = reduce(a, red_real10) end subroutine -! CHECK: fir.call @_FortranAReduceReal10 +! CHECK: fir.call @_FortranAReduceReal10Ref pure function red_real16(a,b) real(16), intent(in) :: a, b @@ -194,7 +194,7 @@ subroutine real16(a) res = reduce(a, red_real16) end subroutine -! CHECK: fir.call @_FortranAReduceReal16 +! CHECK: fir.call @_FortranAReduceReal16Ref pure function red_complex2(a,b) complex(2), intent(in) :: a, b @@ -292,7 +292,7 @@ subroutine log1(a) res = reduce(a, red_log1) end subroutine -! CHECK: fir.call @_FortranAReduceLogical1 +! CHECK: fir.call @_FortranAReduceLogical1Ref pure function red_log2(a,b) logical(2), intent(in) :: a, b @@ -306,7 +306,7 @@ subroutine log2(a) res = reduce(a, red_log2) end subroutine -! CHECK: fir.call @_FortranAReduceLogical2 +! CHECK: fir.call @_FortranAReduceLogical2Ref pure function red_log4(a,b) logical(4), intent(in) :: a, b @@ -320,7 +320,7 @@ subroutine log4(a) res = reduce(a, red_log4) end subroutine -! CHECK: fir.call @_FortranAReduceLogical4 +! CHECK: fir.call @_FortranAReduceLogical4Ref pure function red_log8(a,b) logical(8), intent(in) :: a, b @@ -334,7 +334,7 @@ subroutine log8(a) res = reduce(a, red_log8) end subroutine -! CHECK: fir.call @_FortranAReduceLogical8 +! CHECK: fir.call @_FortranAReduceLogical8Ref pure function red_char1(a,b) character(1), intent(in) :: a, b @@ -403,7 +403,7 @@ subroutine integer1dim(a, id) res = reduce(a, red_int1, 2) end subroutine -! CHECK: fir.call @_FortranAReduceInteger1Dim +! CHECK: fir.call @_FortranAReduceInteger1DimRef subroutine integer2dim(a, id) integer(2), intent(in) :: a(:,:) @@ -412,7 +412,7 @@ subroutine integer2dim(a, id) res = reduce(a, red_int2, 2) end subroutine -! CHECK: fir.call @_FortranAReduceInteger2Dim +! CHECK: fir.call @_FortranAReduceInteger2DimRef subroutine integer4dim(a, id) integer(4), intent(in) :: a(:,:) @@ -421,7 +421,7 @@ subroutine integer4dim(a, id) res = reduce(a, red_int4, 2) end subroutine -! CHECK: fir.call @_FortranAReduceInteger4Dim +! CHECK: fir.call @_FortranAReduceInteger4DimRef subroutine integer8dim(a, id) integer(8), intent(in) :: a(:,:) @@ -430,7 +430,7 @@ subroutine integer8dim(a, id) res = reduce(a, red_int8, 2) end subroutine -! CHECK: fir.call @_FortranAReduceInteger8Dim +! CHECK: fir.call @_FortranAReduceInteger8DimRef subroutine integer16dim(a, id) integer(16), intent(in) :: a(:,:) @@ -439,7 +439,7 @@ subroutine integer16dim(a, id) res = reduce(a, red_int16, 2) end subroutine -! CHECK: fir.call @_FortranAReduceInteger16Dim +! CHECK: fir.call @_FortranAReduceInteger16DimRef subroutine real2dim(a, id) real(2), intent(in) :: a(:,:) @@ -448,7 +448,7 @@ subroutine real2dim(a, id) res = reduce(a, red_real2, 2) end subroutine -! CHECK: fir.call @_FortranAReduceReal2Dim +! CHECK: fir.call @_FortranAReduceReal2DimRef subroutine real3dim(a, id) real(3), intent(in) :: a(:,:) @@ -457,7 +457,7 @@ subroutine real3dim(a, id) res = reduce(a, red_real3, 2) end subroutine -! CHECK: fir.call @_FortranAReduceReal3Dim +! CHECK: fir.call @_FortranAReduceReal3DimRef subroutine real4dim(a, id) real(4), intent(in) :: a(:,:) @@ -466,7 +466,7 @@ subroutine real4dim(a, id) res = reduce(a, red_real4, 2) end subroutine -! CHECK: fir.call @_FortranAReduceReal4Dim +! CHECK: fir.call @_FortranAReduceReal4DimRef subroutine real8dim(a, id) real(8), intent(in) :: a(:,:) @@ -475,7 +475,7 @@ subroutine real8dim(a, id) res = reduce(a, red_real8, 2) end subroutine -! CHECK: fir.call @_FortranAReduceReal8Dim +! CHECK: fir.call @_FortranAReduceReal8DimRef subroutine real10dim(a, id) real(10), intent(in) :: a(:,:) @@ -484,7 +484,7 @@ subroutine real10dim(a, id) res = reduce(a, red_real10, 2) end subroutine -! CHECK: fir.call @_FortranAReduceReal10Dim +! CHECK: fir.call @_FortranAReduceReal10DimRef subroutine real16dim(a, id) real(16), intent(in) :: a(:,:) @@ -493,7 +493,7 @@ subroutine real16dim(a, id) res = reduce(a, red_real16, 2) end subroutine -! CHECK: fir.call @_FortranAReduceReal16Dim +! CHECK: fir.call @_FortranAReduceReal16DimRef subroutine complex2dim(a, id) complex(2), intent(in) :: a(:,:) @@ -556,7 +556,7 @@ subroutine logical1dim(a, id) res = reduce(a, red_log1, 2) end subroutine -! CHECK: fir.call @_FortranAReduceLogical1Dim +! CHECK: fir.call @_FortranAReduceLogical1DimRef subroutine logical2dim(a, id) logical(2), intent(in) :: a(:,:) @@ -565,7 +565,7 @@ subroutine logical2dim(a, id) res = reduce(a, red_log2, 2) end subroutine -! CHECK: fir.call @_FortranAReduceLogical2Dim +! CHECK: fir.call @_FortranAReduceLogical2DimRef subroutine logical4dim(a, id) logical(4), intent(in) :: a(:,:) @@ -574,7 +574,7 @@ subroutine logical4dim(a, id) res = reduce(a, red_log4, 2) end subroutine -! CHECK: fir.call @_FortranAReduceLogical4Dim +! CHECK: fir.call @_FortranAReduceLogical4DimRef subroutine logical8dim(a, id) logical(8), intent(in) :: a(:,:) @@ -583,7 +583,7 @@ subroutine logical8dim(a, id) res = reduce(a, red_log8, 2) end subroutine -! CHECK: fir.call @_FortranAReduceLogical8Dim +! CHECK: fir.call @_FortranAReduceLogical8DimRef subroutine testtypeDim(a) type(t1), intent(in) :: a(:,:) diff --git a/flang/unittests/Runtime/Reduction.cpp b/flang/unittests/Runtime/Reduction.cpp index b2661e78abdf584..41c8d86c35b7621 100644 --- a/flang/unittests/Runtime/Reduction.cpp +++ b/flang/unittests/Runtime/Reduction.cpp @@ -647,23 +647,24 @@ static std::int32_t IMultiply(const std::int32_t *x, const std::int32_t *y) { TEST(Reductions, ReduceInt4) { auto intVector{MakeArray( std::vector{4}, std::vector{1, 2, 3, 4})}; - EXPECT_EQ(RTNAME(ReduceInteger4)(*intVector, IAdd, __FILE__, __LINE__), 10); EXPECT_EQ( - RTNAME(ReduceInteger4)(*intVector, IMultiply, __FILE__, __LINE__), 24); + RTNAME(ReduceInteger4Ref)(*intVector, IAdd, __FILE__, __LINE__), 10); + EXPECT_EQ( + RTNAME(ReduceInteger4Ref)(*intVector, IMultiply, __FILE__, __LINE__), 24); } TEST(Reductions, ReduceInt4Dim) { auto intMatrix{MakeArray( std::vector{2, 2}, std::vector{1, 2, 3, 4})}; StaticDescriptor<1, true> statDesc; Descriptor &sums{statDesc.descriptor()}; - RTNAME(ReduceInteger4Dim)(sums, *intMatrix, IAdd, __FILE__, __LINE__, 1); + RTNAME(ReduceInteger4DimRef)(sums, *intMatrix, IAdd, __FILE__, __LINE__, 1); EXPECT_EQ(sums.rank(), 1); EXPECT_EQ(sums.GetDimension(0).LowerBound(), 1); EXPECT_EQ(sums.GetDimension(0).Extent(), 2); EXPECT_EQ(*sums.ZeroBasedIndexedElement(0), 3); EXPECT_EQ(*sums.ZeroBasedIndexedElement(1), 7); sums.Destroy(); - RTNAME(ReduceInteger4Dim)(sums, *intMatrix, IAdd, __FILE__, __LINE__, 2); + RTNAME(ReduceInteger4DimRef)(sums, *intMatrix, IAdd, __FILE__, __LINE__, 2); EXPECT_EQ(sums.rank(), 1); EXPECT_EQ(sums.GetDimension(0).LowerBound(), 1); EXPECT_EQ(sums.GetDimension(0).Extent(), 2);