From aa9679304011170905a37758c6ce5c0c6e7a6265 Mon Sep 17 00:00:00 2001 From: Jacob Crawley Date: Thu, 18 May 2023 15:35:36 +0000 Subject: [PATCH] [flang] Change return type of reduction intrinsics Comments in the recent patch https://reviews.llvm.org/D149964, mentioned that using hlfir_ExprType in cases where intrinsics return simple scalars adds unnecessary abstraction that isn't needed unless an array type is being used. This patch modifies the HLFIR operations for product, sum and any so that they only return a hlfir_ExprType when the result is an array, otherwise they will return just the simple scalar type. Differential Revision: https://reviews.llvm.org/D150877 --- flang/include/flang/Optimizer/HLFIR/HLFIROps.td | 6 +- flang/lib/Lower/ConvertCall.cpp | 9 +-- flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp | 72 ++++++++++++++-------- flang/test/HLFIR/any-lowering.fir | 5 +- flang/test/HLFIR/any.fir | 36 +++++------ flang/test/HLFIR/flang-experimental-hlfir-flag.f90 | 1 - flang/test/HLFIR/invalid.fir | 71 ++++++++++++++++++--- flang/test/HLFIR/product-lowering.fir | 15 ++--- flang/test/HLFIR/product.fir | 48 +++++++-------- flang/test/HLFIR/sum-lowering.fir | 15 ++--- flang/test/HLFIR/sum.fir | 48 +++++++-------- flang/test/Lower/HLFIR/any.f90 | 5 +- flang/test/Lower/HLFIR/product.f90 | 18 ++---- flang/test/Lower/HLFIR/sum.f90 | 16 ++--- 14 files changed, 210 insertions(+), 155 deletions(-) diff --git a/flang/include/flang/Optimizer/HLFIR/HLFIROps.td b/flang/include/flang/Optimizer/HLFIR/HLFIROps.td index 1fe3eba..572faf0 100644 --- a/flang/include/flang/Optimizer/HLFIR/HLFIROps.td +++ b/flang/include/flang/Optimizer/HLFIR/HLFIROps.td @@ -329,7 +329,7 @@ def hlfir_AnyOp : hlfir_Op<"any", []> { Optional:$dim ); - let results = (outs hlfir_ExprType); + let results = (outs AnyFortranValue); let assemblyFormat = [{ $mask (`dim` $dim^)? attr-dict `:` functional-type(operands, results) @@ -355,7 +355,7 @@ def hlfir_ProductOp : hlfir_Op<"product", [AttrSizedOperandSegments, "::mlir::arith::FastMathFlags::none">:$fastmath ); - let results = (outs hlfir_ExprType); + let results = (outs AnyFortranValue); let assemblyFormat = [{ $array (`dim` $dim^)? (`mask` $mask^)? attr-dict `:` functional-type(operands, results) @@ -400,7 +400,7 @@ def hlfir_SumOp : hlfir_Op<"sum", [AttrSizedOperandSegments, "::mlir::arith::FastMathFlags::none">:$fastmath ); - let results = (outs hlfir_ExprType); + let results = (outs AnyFortranValue); let assemblyFormat = [{ $array (`dim` $dim^)? (`mask` $mask^)? attr-dict `:` functional-type(operands, results) diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp index d2d9173..17fbdc4 100644 --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -1356,11 +1356,12 @@ genHLFIRIntrinsicRefCore(PreparedActualArguments &loweredActuals, if (auto array = normalisedResult.dyn_cast()) { resultShape = hlfir::ExprType::Shape{array.getShape()}; elementType = array.getEleTy(); - } else { - elementType = normalisedResult; + return hlfir::ExprType::get(builder.getContext(), resultShape, + elementType, + /*polymorphic=*/false); } - return hlfir::ExprType::get(builder.getContext(), resultShape, elementType, - /*polymorphic=*/false); + elementType = normalisedResult; + return elementType; }; auto buildSumOperation = [](fir::FirOpBuilder &builder, mlir::Location loc, diff --git a/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp b/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp index b399a45..9619eb0 100644 --- a/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp +++ b/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp @@ -451,31 +451,41 @@ mlir::LogicalResult hlfir::AnyOp::verify() { assert(results.size() == 1); mlir::Value mask = getMask(); + mlir::Value dim = getDim(); fir::SequenceType maskTy = hlfir::getFortranElementOrSequenceType(mask.getType()) .cast(); mlir::Type logicalTy = maskTy.getEleTy(); llvm::ArrayRef maskShape = maskTy.getShape(); - hlfir::ExprType resultTy = results[0].cast(); - // Result is of the same type as MASK - if (resultTy.getElementType() != logicalTy) - return emitOpError( - "result must have the same element type as MASK argument"); - - if (resultTy.isArray()) { + mlir::Type resultType = results[0]; + if (mlir::isa(resultType)) { // Result is of the same type as MASK - if (resultTy.getEleTy() != logicalTy) + if (resultType != logicalTy) return emitOpError( "result must have the same element type as MASK argument"); - llvm::ArrayRef resultShape = resultTy.getShape(); + } else if (auto resultExpr = + mlir::dyn_cast_or_null(resultType)) { + // Result should only be in hlfir.expr form if it is an array + if (maskShape.size() > 1 && dim != nullptr) { + if (!resultExpr.isArray()) + return emitOpError("result must be an array"); - // Result has rank n-1 - if (resultShape.size() != (maskShape.size() - 1)) - return emitOpError("result rank must be one less than MASK"); - } + if (resultExpr.getEleTy() != logicalTy) + return emitOpError( + "result must have the same element type as MASK argument"); + llvm::ArrayRef resultShape = resultExpr.getShape(); + // Result has rank n-1 + if (resultShape.size() != (maskShape.size() - 1)) + return emitOpError("result rank must be one less than MASK"); + } else { + return emitOpError("result must be of logical type"); + } + } else { + return emitOpError("result must be of logical type"); + } return mlir::success(); } @@ -538,6 +548,7 @@ static mlir::LogicalResult verifyReductionOp(ReductionOp reductionOp) { assert(results.size() == 1); mlir::Value array = reductionOp->getArray(); + mlir::Value dim = reductionOp->getDim(); mlir::Value mask = reductionOp->getMask(); fir::SequenceType arrayTy = @@ -545,7 +556,6 @@ static mlir::LogicalResult verifyReductionOp(ReductionOp reductionOp) { .cast(); mlir::Type numTy = arrayTy.getEleTy(); llvm::ArrayRef arrayShape = arrayTy.getShape(); - hlfir::ExprType resultTy = results[0].cast(); if (mask) { fir::SequenceType maskSeq = @@ -572,25 +582,35 @@ static mlir::LogicalResult verifyReductionOp(ReductionOp reductionOp) { } } - if (resultTy.isArray()) { + mlir::Type resultType = results[0]; + if (hlfir::isFortranScalarNumericalType(resultType)) { // Result is of the same type as ARRAY - if (resultTy.getEleTy() != numTy) + if (resultType != numTy) return reductionOp->emitOpError( "result must have the same element type as ARRAY argument"); - llvm::ArrayRef resultShape = resultTy.getShape(); - - // Result has rank n-1 - if (resultShape.size() != (arrayShape.size() - 1)) + } else if (auto resultExpr = + mlir::dyn_cast_or_null(resultType)) { + if (arrayShape.size() > 1 && dim != nullptr) { + if (!resultExpr.isArray()) + return reductionOp->emitOpError("result must be an array"); + + if (resultExpr.getEleTy() != numTy) + return reductionOp->emitOpError( + "result must have the same element type as ARRAY argument"); + + llvm::ArrayRef resultShape = resultExpr.getShape(); + // Result has rank n-1 + if (resultShape.size() != (arrayShape.size() - 1)) + return reductionOp->emitOpError( + "result rank must be one less than ARRAY"); + } else { return reductionOp->emitOpError( - "result rank must be one less than ARRAY"); + "result must be of numerical scalar type"); + } } else { - // Result is of the same type as ARRAY - if (resultTy.getElementType() != numTy) - return reductionOp->emitOpError( - "result must have the same element type as ARRAY argument"); + return reductionOp->emitOpError("result must be of numerical scalar type"); } - return mlir::success(); } diff --git a/flang/test/HLFIR/any-lowering.fir b/flang/test/HLFIR/any-lowering.fir index 2c750ce..ef8b895 100644 --- a/flang/test/HLFIR/any-lowering.fir +++ b/flang/test/HLFIR/any-lowering.fir @@ -5,9 +5,8 @@ func.func @_QPany1(%arg0: !fir.box>> {fir.bindc_name = "a"}, %arg1: !fir.ref> {fir.bindc_name = "s"}) { %0:2 = hlfir.declare %arg0 {uniq_name = "_QFany1Ea"} : (!fir.box>>) -> (!fir.box>>, !fir.box>>) %1:2 = hlfir.declare %arg1 {uniq_name = "_QFany1Es"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) - %2 = hlfir.any %0#0 : (!fir.box>>) -> !hlfir.expr> - hlfir.assign %2 to %1#0 : !hlfir.expr>, !fir.ref> - hlfir.destroy %2 : !hlfir.expr> + %2 = hlfir.any %0#0 : (!fir.box>>) -> !fir.logical<4> + hlfir.assign %2 to %1#0 : !fir.logical<4>, !fir.ref> return } // CHECK-LABEL: func.func @_QPany1( diff --git a/flang/test/HLFIR/any.fir b/flang/test/HLFIR/any.fir index cccbf83..dbea5ba 100644 --- a/flang/test/HLFIR/any.fir +++ b/flang/test/HLFIR/any.fir @@ -4,71 +4,71 @@ // mask is an expression of known shape func.func @any0(%arg0: !hlfir.expr<2x!fir.logical<4>>) { - %any = hlfir.any %arg0 : (!hlfir.expr<2x!fir.logical<4>>) -> !hlfir.expr> + %any = hlfir.any %arg0 : (!hlfir.expr<2x!fir.logical<4>>) -> !fir.logical<4> return } // CHECK: func.func @any0(%[[ARRAY:.*]]: !hlfir.expr<2x!fir.logical<4>>) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!hlfir.expr<2x!fir.logical<4>>) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!hlfir.expr<2x!fir.logical<4>>) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } // mask is an expression of assumed shape func.func @any1(%arg0: !hlfir.expr>) { - %any = hlfir.any %arg0 : (!hlfir.expr>) -> !hlfir.expr> + %any = hlfir.any %arg0 : (!hlfir.expr>) -> !fir.logical<4> return } // CHECK: func.func @any1(%[[ARRAY:.*]]: !hlfir.expr>) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!hlfir.expr>) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!hlfir.expr>) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } // mask is a boxed array func.func @any2(%arg0: !fir.box>>) { - %any = hlfir.any %arg0 : (!fir.box>>) -> !hlfir.expr> + %any = hlfir.any %arg0 : (!fir.box>>) -> !fir.logical<4> return } // CHECK: func.func @any2(%[[ARRAY:.*]]: !fir.box>>) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } // mask is an assumed shape boxed array func.func @any3(%arg0: !fir.box>>){ - %any = hlfir.any %arg0 : (!fir.box>>) -> !hlfir.expr> + %any = hlfir.any %arg0 : (!fir.box>>) -> !fir.logical<4> return } // CHECK: func.func @any3(%[[ARRAY:.*]]: !fir.box>>) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } // mask is a 2-dimensional array func.func @any4(%arg0: !fir.box>>){ - %any = hlfir.any %arg0 : (!fir.box>>) -> !hlfir.expr> + %any = hlfir.any %arg0 : (!fir.box>>) -> !fir.logical<4> return } // CHECK: func.func @any4(%[[ARRAY:.*]]: !fir.box>>) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } // mask and dim argument func.func @any5(%arg0: !fir.box>>, %arg1: i32) { - %any = hlfir.any %arg0 dim %arg1 : (!fir.box>>, i32) -> !hlfir.expr> + %any = hlfir.any %arg0 dim %arg1 : (!fir.box>>, i32) -> !fir.logical<4> return } // CHECK: func.func @any5(%[[ARRAY:.*]]: !fir.box>>, %[[DIM:.*]]: i32) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] dim %[[DIM]] : (!fir.box>>, i32) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] dim %[[DIM]] : (!fir.box>>, i32) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } // hlfir.any with dim argument with an unusual type func.func @any6(%arg0: !fir.box>>, %arg1: index) { - %any = hlfir.any %arg0 dim %arg1 : (!fir.box>>, index) -> !hlfir.expr> + %any = hlfir.any %arg0 dim %arg1 : (!fir.box>>, index) ->!fir.logical<4> return } // CHECK: func.func @any6(%[[ARRAY:.*]]: !fir.box>>, %[[DIM:.*]]: index) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] dim %[[DIM]] : (!fir.box>>, index) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] dim %[[DIM]] : (!fir.box>>, index) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } @@ -94,20 +94,20 @@ func.func @any8(%arg0: !fir.box>>, %arg1: i32) { // hlfir.any with mask argument of ref> type func.func @any9(%arg0: !fir.ref>>) { - %any = hlfir.any %arg0 : (!fir.ref>>) -> !hlfir.expr> + %any = hlfir.any %arg0 : (!fir.ref>>) -> !fir.logical<4> return } // CHECK: func.func @any9(%[[ARRAY:.*]]: !fir.ref>>) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.ref>>) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.ref>>) -> !fir.logical<4> // CHECK-NEXT: return // CHECK-NEXT: } // hlfir.any with fir.logical<8> type func.func @any10(%arg0: !fir.box>>) { - %any = hlfir.any %arg0 : (!fir.box>>) -> !hlfir.expr> + %any = hlfir.any %arg0 : (!fir.box>>) -> !fir.logical<8> return } // CHECK: func.func @any10(%[[ARRAY:.*]]: !fir.box>>) { -// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !hlfir.expr> +// CHECK-NEXT: %[[ANY:.*]] = hlfir.any %[[ARRAY]] : (!fir.box>>) -> !fir.logical<8> // CHECK-NEXT: return // CHECK-NEXT: } diff --git a/flang/test/HLFIR/flang-experimental-hlfir-flag.f90 b/flang/test/HLFIR/flang-experimental-hlfir-flag.f90 index a375d27..4d9191c 100644 --- a/flang/test/HLFIR/flang-experimental-hlfir-flag.f90 +++ b/flang/test/HLFIR/flang-experimental-hlfir-flag.f90 @@ -13,7 +13,6 @@ end subroutine ! CHECK-DAG: %[[RES_VAR:.*]]:2 = hlfir.declare %[[RES]] ! CHECK-NEXT: %[[SUM_RES:.*]] = hlfir.sum %[[A_VAR]]#0 ! CHECK-NEXT: hlfir.assign %[[SUM_RES]] to %[[RES_VAR]]#0 -! CHECK-NEXT: hlfir.destroy %[[SUM_RES]] ! CHECK-NEXT: return ! CHECK-NEXT: } diff --git a/flang/test/HLFIR/invalid.fir b/flang/test/HLFIR/invalid.fir index e4e9cd0..e1c95c1 100644 --- a/flang/test/HLFIR/invalid.fir +++ b/flang/test/HLFIR/invalid.fir @@ -299,13 +299,13 @@ func.func @bad_concat_4(%arg0: !fir.ref>) { // ----- func.func @bad_any1(%arg0: !hlfir.expr>) { // expected-error@+1 {{'hlfir.any' op result must have the same element type as MASK argument}} - %0 = hlfir.any %arg0 : (!hlfir.expr>) -> !hlfir.expr> + %0 = hlfir.any %arg0 : (!hlfir.expr>) -> !fir.logical<8> } // ----- -func.func @bad_any2(%arg0: !hlfir.expr>) { +func.func @bad_any2(%arg0: !hlfir.expr>, %arg1: i32) { // expected-error@+1 {{'hlfir.any' op result must have the same element type as MASK argument}} - %0 = hlfir.any %arg0 : (!hlfir.expr>) -> !hlfir.expr> + %0 = hlfir.any %arg0 dim %arg1 : (!hlfir.expr>, i32) -> !hlfir.expr> } // ----- @@ -314,11 +314,28 @@ func.func @bad_any3(%arg0: !hlfir.expr>, %arg1: i32){ %0 = hlfir.any %arg0 dim %arg1 : (!hlfir.expr>, i32) -> !hlfir.expr> } +// ----- +func.func @bad_any4(%arg0: !hlfir.expr>, %arg1: i32) { + // expected-error@+1 {{'hlfir.any' op result must be an array}} + %0 = hlfir.any %arg0 dim %arg1 : (!hlfir.expr>, i32) -> !hlfir.expr> +} + +// ----- +func.func @bad_any5(%arg0: !hlfir.expr>) { + // expected-error@+1 {{'hlfir.any' op result must be of logical type}} + %0 = hlfir.any %arg0 : (!hlfir.expr>) -> i32 +} + +// ----- +func.func @bad_any6(%arg0: !hlfir.expr>) { + // expected-error@+1 {{'hlfir.any' op result must be of logical type}} + %0 = hlfir.any %arg0 : (!hlfir.expr>) -> !hlfir.expr> +} // ----- func.func @bad_product1(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box>) { // expected-error@+1 {{'hlfir.product' op result must have the same element type as ARRAY argument}} - %0 = hlfir.product %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> f32 } // ----- @@ -334,15 +351,33 @@ func.func @bad_product3(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.b } // ----- -func.func @bad_product4(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box>) { +func.func @bad_product4(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box>) { // expected-error@+1 {{'hlfir.product' op result rank must be one less than ARRAY}} - %0 = hlfir.product %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !hlfir.expr +} + +// ----- +func.func @bad_product5(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box>) { + // expected-error@+1 {{'hlfir.product' op result must be of numerical scalar type}} + %0 = hlfir.product %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !fir.logical<4> +} + +// ----- +func.func @bad_product6(%arg0: !hlfir.expr, %arg1: i32){ + // expected-error@+1 {{'hlfir.product' op result must be an array}} + %0 = hlfir.product %arg0 dim %arg1 : (!hlfir.expr, i32) -> !hlfir.expr +} + +// ----- +func.func @bad_product7(%arg0: !hlfir.expr){ + // expected-error@+1 {{'hlfir.product' op result must be of numerical scalar type}} + %0 = hlfir.product %arg0 : (!hlfir.expr) -> !hlfir.expr } // ----- func.func @bad_sum1(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box>) { // expected-error@+1 {{'hlfir.sum' op result must have the same element type as ARRAY argument}} - %0 = hlfir.sum %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> f32 } // ----- @@ -358,9 +393,27 @@ func.func @bad_sum3(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box, %arg1: i32, %arg2: !fir.box>) { +func.func @bad_sum4(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box>) { // expected-error@+1 {{'hlfir.sum' op result rank must be one less than ARRAY}} - %0 = hlfir.sum %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !hlfir.expr +} + +// ----- +func.func @bad_sum5(%arg0: !hlfir.expr, %arg1: i32, %arg2: !fir.box>) { + // expected-error@+1 {{'hlfir.sum' op result must be of numerical scalar type}} + %0 = hlfir.sum %arg0 dim %arg1 mask %arg2 : (!hlfir.expr, i32, !fir.box>) -> !fir.logical<4> +} + +// ----- +func.func @bad_sum6(%arg0: !hlfir.expr, %arg1: i32){ + // expected-error@+1 {{'hlfir.sum' op result must be an array}} + %0 = hlfir.sum %arg0 dim %arg1 : (!hlfir.expr, i32) -> !hlfir.expr +} + +// ----- +func.func @bad_sum7(%arg0: !hlfir.expr){ + // expected-error@+1 {{'hlfir.sum' op result must be of numerical scalar type}} + %0 = hlfir.sum %arg0 : (!hlfir.expr) -> !hlfir.expr } // ----- diff --git a/flang/test/HLFIR/product-lowering.fir b/flang/test/HLFIR/product-lowering.fir index e22869f..aedc499 100644 --- a/flang/test/HLFIR/product-lowering.fir +++ b/flang/test/HLFIR/product-lowering.fir @@ -5,9 +5,8 @@ func.func @_QPproduct1(%arg0: !fir.box> {fir.bindc_name = "a"}, %arg1: !fir.ref {fir.bindc_name = "s"}) { %0:2 = hlfir.declare %arg0 {uniq_name = "_QFsum1Ea"} : (!fir.box>) -> (!fir.box>, !fir.box>) %1:2 = hlfir.declare %arg1 {uniq_name = "_QFsum1Es"} : (!fir.ref) -> (!fir.ref, !fir.ref) - %2 = hlfir.product %0#0 {fastmath = #arith.fastmath} : (!fir.box>) -> !hlfir.expr - hlfir.assign %2 to %1#0 : !hlfir.expr, !fir.ref - hlfir.destroy %2 : !hlfir.expr + %2 = hlfir.product %0#0 {fastmath = #arith.fastmath} : (!fir.box>) -> i32 + hlfir.assign %2 to %1#0 : i32, !fir.ref return } @@ -77,9 +76,8 @@ func.func @_QPproduct3(%arg0: !fir.box> {fir.bindc_name = "a"} %0:2 = hlfir.declare %arg0 {uniq_name = "_QFproduct3Ea"} : (!fir.box>) -> (!fir.box>, !fir.box>) %1:2 = hlfir.declare %arg2 {uniq_name = "_QFproduct3Em"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) %2:2 = hlfir.declare %arg1 {uniq_name = "_QFproduct3Es"} : (!fir.ref) -> (!fir.ref, !fir.ref) - %3 = hlfir.product %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> !hlfir.expr - hlfir.assign %3 to %2#0 : !hlfir.expr, !fir.ref - hlfir.destroy %3 : !hlfir.expr + %3 = hlfir.product %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> i32 + hlfir.assign %3 to %2#0 : i32, !fir.ref return } @@ -103,9 +101,8 @@ func.func @_QPproduct4(%arg0: !fir.box> {fir.bindc_name = "a"} %0:2 = hlfir.declare %arg0 {uniq_name = "_QFproduct4Ea"} : (!fir.box>) -> (!fir.box>, !fir.box>) %1:2 = hlfir.declare %arg2 {uniq_name = "_QFproduct4Em"} : (!fir.box>>) -> (!fir.box>>, !fir.box>>) %2:2 = hlfir.declare %arg1 {uniq_name = "_QFproduct4Es"} : (!fir.ref) -> (!fir.ref, !fir.ref) - %3 = hlfir.product %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> !hlfir.expr - hlfir.assign %3 to %2#0 : !hlfir.expr, !fir.ref - hlfir.destroy %3 : !hlfir.expr + %3 = hlfir.product %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> i32 + hlfir.assign %3 to %2#0 : i32, !fir.ref return } diff --git a/flang/test/HLFIR/product.fir b/flang/test/HLFIR/product.fir index b0c7dfe..e10a4a2 100644 --- a/flang/test/HLFIR/product.fir +++ b/flang/test/HLFIR/product.fir @@ -10,7 +10,7 @@ func.func @product0(%arg0: !hlfir.expr<42xi32>) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!hlfir.expr<42xi32>, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!hlfir.expr<42xi32>, index, !fir.box>) -> i32 return } // CHECK: func.func @product0(%[[ARRAY:.*]]: !hlfir.expr<42xi32>) { @@ -20,7 +20,7 @@ func.func @product0(%arg0: !hlfir.expr<42xi32>) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL]] to %[[MASK]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %0 : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr<42xi32>, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr<42xi32>, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -32,7 +32,7 @@ func.func @product1(%arg0: !hlfir.expr) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!hlfir.expr, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!hlfir.expr, index, !fir.box>) -> i32 return } // CHECK: func.func @product1(%[[ARRAY:.*]]: !hlfir.expr) { @@ -42,7 +42,7 @@ func.func @product1(%arg0: !hlfir.expr) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL:.*]] to %[[MASK:.*]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %[[MASK:.*]] : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.product %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -54,7 +54,7 @@ func.func @product2(%arg0: !fir.box>) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> i32 return } // CHECK: func.func @product2(%[[ARRAY:.*]]: !fir.box>) { @@ -64,7 +64,7 @@ func.func @product2(%arg0: !fir.box>) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL:.*]] to %[[MASK:.*]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %[[MASK:.*]] : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.product %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -76,7 +76,7 @@ func.func @product3(%arg0: !fir.box>) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> i32 return } // CHECK: func.func @product3(%[[ARRAY:.*]]: !fir.box>) { @@ -86,55 +86,55 @@ func.func @product3(%arg0: !fir.box>) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL:.*]] to %[[MASK:.*]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %[[MASK:.*]] : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.product %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // known shape expr mask func.func @product4(%arg0: !fir.box>, %arg1: !hlfir.expr<42x!fir.logical<4>>) { %c_1 = arith.constant 1 : index - %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> i32 return } // CHECK: func.func @product4(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !hlfir.expr<42x!fir.logical<4>>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // assumed shape expr mask func.func @product5(%arg0: !fir.box>, %arg1: !hlfir.expr>) { %c_1 = arith.constant 1 : index - %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr>) -> i32 return } // CHECK: func.func @product5(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !hlfir.expr>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // known shape array mask func.func @product6(%arg0: !fir.box>, %arg1: !fir.box>>) { %c_1 = arith.constant 1 : index - %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> i32 return } // CHECK: func.func @product6(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.box>>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // assumed shape array mask func.func @product7(%arg0: !fir.box>, %arg1: !fir.box>>) { %c_1 = arith.constant 1 : index - %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> !hlfir.expr + %0 = hlfir.product %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> i32 return } // CHECK: func.func @product7(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.box>>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> !hlfir.expr +// CHECK-NEXT: hlfir.product %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -181,11 +181,11 @@ func.func @product9(%arg0: !fir.box>, %arg1: i32) { // hlfir.product with only an array argument func.func @product10(%arg0: !fir.box>) { - %product = hlfir.product %arg0 : (!fir.box>) -> !hlfir.expr + %product = hlfir.product %arg0 : (!fir.box>) -> i32 return } // CHECK: func.func @product10(%[[ARRAY:.*]]: !fir.box> -// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] : (!fir.box>) -> !hlfir.expr +// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] : (!fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -201,11 +201,11 @@ func.func @product11(%arg0: !fir.box>, %arg1: i32) { // hlfir.product with array and mask argument func.func @product12(%arg0: !fir.box>, %arg1: !fir.logical<4>) { - %product = hlfir.product %arg0 mask %arg1 : (!fir.box>, !fir.logical<4>) -> !hlfir.expr + %product = hlfir.product %arg0 mask %arg1 : (!fir.box>, !fir.logical<4>) -> i32 return } // CHECK: func.func @product12(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.logical<4> -// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.logical<4>) -> !hlfir.expr +// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.logical<4>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -221,20 +221,20 @@ func.func @product13(%arg0: !fir.box>, %arg1: index) { // hlfir.product with mask argument of unusual type func.func @product14(%arg0: !fir.box>, %arg1: i1) { - %product = hlfir.product %arg0 mask %arg1 : (!fir.box>, i1) -> !hlfir.expr + %product = hlfir.product %arg0 mask %arg1 : (!fir.box>, i1) -> i32 return } // CHECK: func.func @product14(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: i1 -// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] mask %[[MASK]] : (!fir.box>, i1) -> !hlfir.expr +// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] mask %[[MASK]] : (!fir.box>, i1) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // hlfir.product with mask argument of ref> type func.func @product15(%arg0: !fir.box>, %arg1: !fir.ref>>) { - %product = hlfir.product %arg0 mask %arg1 : (!fir.box>, !fir.ref>>) -> !hlfir.expr + %product = hlfir.product %arg0 mask %arg1 : (!fir.box>, !fir.ref>>) -> i32 return } // CHECK: func.func @product15(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.ref>> -// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.ref>>) -> !hlfir.expr +// CHECK-NEXT: %[[PRODUCT:.*]] = hlfir.product %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.ref>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } diff --git a/flang/test/HLFIR/sum-lowering.fir b/flang/test/HLFIR/sum-lowering.fir index c031f6d..8f5ddd7 100644 --- a/flang/test/HLFIR/sum-lowering.fir +++ b/flang/test/HLFIR/sum-lowering.fir @@ -5,9 +5,8 @@ func.func @_QPsum1(%arg0: !fir.box> {fir.bindc_name = "a"}, %arg1: !fir.ref {fir.bindc_name = "s"}) { %0:2 = hlfir.declare %arg0 {uniq_name = "_QFsum1Ea"} : (!fir.box>) -> (!fir.box>, !fir.box>) %1:2 = hlfir.declare %arg1 {uniq_name = "_QFsum1Es"} : (!fir.ref) -> (!fir.ref, !fir.ref) - %2 = hlfir.sum %0#0 {fastmath = #arith.fastmath} : (!fir.box>) -> !hlfir.expr - hlfir.assign %2 to %1#0 : !hlfir.expr, !fir.ref - hlfir.destroy %2 : !hlfir.expr + %2 = hlfir.sum %0#0 {fastmath = #arith.fastmath} : (!fir.box>) -> i32 + hlfir.assign %2 to %1#0 : i32, !fir.ref return } // CHECK-LABEL: func.func @_QPsum1( @@ -76,9 +75,8 @@ func.func @_QPsum3(%arg0: !fir.box> {fir.bindc_name = "a"}, %a %0:2 = hlfir.declare %arg0 {uniq_name = "_QFsum3Ea"} : (!fir.box>) -> (!fir.box>, !fir.box>) %1:2 = hlfir.declare %arg2 {uniq_name = "_QFsum3Em"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) %2:2 = hlfir.declare %arg1 {uniq_name = "_QFsum3Es"} : (!fir.ref) -> (!fir.ref, !fir.ref) - %3 = hlfir.sum %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> !hlfir.expr - hlfir.assign %3 to %2#0 : !hlfir.expr, !fir.ref - hlfir.destroy %3 : !hlfir.expr + %3 = hlfir.sum %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> i32 + hlfir.assign %3 to %2#0 : i32, !fir.ref return } // CHECK-LABEL: func.func @_QPsum3( @@ -101,9 +99,8 @@ func.func @_QPsum4(%arg0: !fir.box> {fir.bindc_name = "a"}, %a %0:2 = hlfir.declare %arg0 {uniq_name = "_QFsum4Ea"} : (!fir.box>) -> (!fir.box>, !fir.box>) %1:2 = hlfir.declare %arg2 {uniq_name = "_QFsum4Em"} : (!fir.box>>) -> (!fir.box>>, !fir.box>>) %2:2 = hlfir.declare %arg1 {uniq_name = "_QFsum4Es"} : (!fir.ref) -> (!fir.ref, !fir.ref) - %3 = hlfir.sum %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> !hlfir.expr - hlfir.assign %3 to %2#0 : !hlfir.expr, !fir.ref - hlfir.destroy %3 : !hlfir.expr + %3 = hlfir.sum %0#0 mask %1#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> i32 + hlfir.assign %3 to %2#0 : i32, !fir.ref return } // CHECK-LABEL: func.func @_QPsum4( diff --git a/flang/test/HLFIR/sum.fir b/flang/test/HLFIR/sum.fir index 45388c3..a33873e 100644 --- a/flang/test/HLFIR/sum.fir +++ b/flang/test/HLFIR/sum.fir @@ -10,7 +10,7 @@ func.func @sum0(%arg0: !hlfir.expr<42xi32>) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!hlfir.expr<42xi32>, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!hlfir.expr<42xi32>, index, !fir.box>) -> i32 return } // CHECK: func.func @sum0(%[[ARRAY:.*]]: !hlfir.expr<42xi32>) { @@ -20,7 +20,7 @@ func.func @sum0(%arg0: !hlfir.expr<42xi32>) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL]] to %[[MASK]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %0 : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr<42xi32>, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr<42xi32>, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -32,7 +32,7 @@ func.func @sum1(%arg0: !hlfir.expr) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!hlfir.expr, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!hlfir.expr, index, !fir.box>) -> i32 return } // CHECK: func.func @sum1(%[[ARRAY:.*]]: !hlfir.expr) { @@ -42,7 +42,7 @@ func.func @sum1(%arg0: !hlfir.expr) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL:.*]] to %[[MASK:.*]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %[[MASK:.*]] : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.sum %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!hlfir.expr, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -54,7 +54,7 @@ func.func @sum2(%arg0: !fir.box>) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> i32 return } // CHECK: func.func @sum2(%[[ARRAY:.*]]: !fir.box>) { @@ -64,7 +64,7 @@ func.func @sum2(%arg0: !fir.box>) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL:.*]] to %[[MASK:.*]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %[[MASK:.*]] : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.sum %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -76,7 +76,7 @@ func.func @sum3(%arg0: !fir.box>) { %true_logical = fir.convert %true : (i1) -> !fir.logical<4> fir.store %true_logical to %mask : !fir.ref> %mask_box = fir.embox %mask : (!fir.ref>) -> !fir.box> - %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %mask_box : (!fir.box>, index, !fir.box>) -> i32 return } // CHECK: func.func @sum3(%[[ARRAY:.*]]: !fir.box>) { @@ -86,55 +86,55 @@ func.func @sum3(%arg0: !fir.box>) { // CHECK-NEXT: %[[LOGICAL:.*]] = fir.convert %[[TRUE]] : (i1) -> !fir.logical<4> // CHECK-NEXT: fir.store %[[LOGICAL:.*]] to %[[MASK:.*]] : !fir.ref> // CHECK-NEXT: %[[BOX:.*]] = fir.embox %[[MASK:.*]] : (!fir.ref>) -> !fir.box> -// CHECK-NEXT: hlfir.sum %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY:.*]] dim %[[C1]] mask %[[BOX]] : (!fir.box>, index, !fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // known shape expr mask func.func @sum4(%arg0: !fir.box>, %arg1: !hlfir.expr<42x!fir.logical<4>>) { %c_1 = arith.constant 1 : index - %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> i32 return } // CHECK: func.func @sum4(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !hlfir.expr<42x!fir.logical<4>>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr<42x!fir.logical<4>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // assumed shape expr mask func.func @sum5(%arg0: !fir.box>, %arg1: !hlfir.expr>) { %c_1 = arith.constant 1 : index - %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !hlfir.expr>) -> i32 return } // CHECK: func.func @sum5(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !hlfir.expr>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !hlfir.expr>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // known shape array mask func.func @sum6(%arg0: !fir.box>, %arg1: !fir.box>>) { %c_1 = arith.constant 1 : index - %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> i32 return } // CHECK: func.func @sum6(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.box>>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // assumed shape array mask func.func @sum7(%arg0: !fir.box>, %arg1: !fir.box>>) { %c_1 = arith.constant 1 : index - %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> !hlfir.expr + %0 = hlfir.sum %arg0 dim %c_1 mask %arg1 : (!fir.box>, index, !fir.box>>) -> i32 return } // CHECK: func.func @sum7(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.box>>) { // CHECK-NEXT: %[[C1:.*]] = arith.constant 1 : index -// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> !hlfir.expr +// CHECK-NEXT: hlfir.sum %[[ARRAY]] dim %[[C1]] mask %[[MASK]] : (!fir.box>, index, !fir.box>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -180,11 +180,11 @@ func.func @sum9(%arg0: !fir.box>, %arg1: i32) { // hlfir.sum with only an array argument func.func @sum10(%arg0: !fir.box>) { - %sum = hlfir.sum %arg0 : (!fir.box>) -> !hlfir.expr + %sum = hlfir.sum %arg0 : (!fir.box>) -> i32 return } // CHECK: func.func @sum10(%[[ARRAY:.*]]: !fir.box> -// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] : (!fir.box>) -> !hlfir.expr +// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] : (!fir.box>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -200,11 +200,11 @@ func.func @sum11(%arg0: !fir.box>, %arg1: i32) { // hlfir.sum with array and mask argument func.func @sum12(%arg0: !fir.box>, %arg1: !fir.logical<4>) { - %sum = hlfir.sum %arg0 mask %arg1 : (!fir.box>, !fir.logical<4>) -> !hlfir.expr + %sum = hlfir.sum %arg0 mask %arg1 : (!fir.box>, !fir.logical<4>) -> i32 return } // CHECK: func.func @sum12(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.logical<4> -// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.logical<4>) -> !hlfir.expr +// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.logical<4>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } @@ -220,20 +220,20 @@ func.func @sum13(%arg0: !fir.box>, %arg1: index) { // hlfir.sum with mask argument of unusual type func.func @sum14(%arg0: !fir.box>, %arg1: i1) { - %sum = hlfir.sum %arg0 mask %arg1 : (!fir.box>, i1) -> !hlfir.expr + %sum = hlfir.sum %arg0 mask %arg1 : (!fir.box>, i1) -> i32 return } // CHECK: func.func @sum14(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: i1 -// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] mask %[[MASK]] : (!fir.box>, i1) -> !hlfir.expr +// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] mask %[[MASK]] : (!fir.box>, i1) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } // hlfir.sum with mask argument of ref> type func.func @sum15(%arg0: !fir.box>, %arg1: !fir.ref>>) { - %sum = hlfir.sum %arg0 mask %arg1 : (!fir.box>, !fir.ref>>) -> !hlfir.expr + %sum = hlfir.sum %arg0 mask %arg1 : (!fir.box>, !fir.ref>>) -> i32 return } // CHECK: func.func @sum15(%[[ARRAY:.*]]: !fir.box>, %[[MASK:.*]]: !fir.ref>> -// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.ref>>) -> !hlfir.expr +// CHECK-NEXT: %[[SUM:.*]] = hlfir.sum %[[ARRAY]] mask %[[MASK]] : (!fir.box>, !fir.ref>>) -> i32 // CHECK-NEXT: return // CHECK-NEXT: } diff --git a/flang/test/Lower/HLFIR/any.f90 b/flang/test/Lower/HLFIR/any.f90 index f4e66cb..ac2f9ba 100644 --- a/flang/test/Lower/HLFIR/any.f90 +++ b/flang/test/Lower/HLFIR/any.f90 @@ -10,9 +10,8 @@ end subroutine ! CHECK: %[[ARG1:.*]]: !fir.ref> ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]] ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]] -! CHECK-NEXT: %[[EXPR:.*]] = hlfir.any %[[MASK]]#0 : (!fir.box>>) -> !hlfir.expr> -! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr>, !fir.ref> -! CHECK-NEXT: hlfir.destroy %[[EXPR]] +! CHECK-NEXT: %[[EXPR:.*]] = hlfir.any %[[MASK]]#0 : (!fir.box>>) -> !fir.logical<4> +! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !fir.logical<4>, !fir.ref> ! CHECK-NEXT: return ! CHECK-NEXT: } diff --git a/flang/test/Lower/HLFIR/product.f90 b/flang/test/Lower/HLFIR/product.f90 index 148d53b..2748883 100644 --- a/flang/test/Lower/HLFIR/product.f90 +++ b/flang/test/Lower/HLFIR/product.f90 @@ -10,9 +10,8 @@ end subroutine ! CHECK: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref ! CHECK-DAG: %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]] ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]] -! CHECK-NEXT: %[[EXPR:.*]] = hlfir.product %[[ARRAY]]#0 {fastmath = #arith.fastmath} : (!fir.box>) -> !hlfir.expr -! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr, !fir.ref -! CHECK-NEXT: hlfir.destroy %[[EXPR]] +! CHECK-NEXT: %[[EXPR:.*]] = hlfir.product %[[ARRAY]]#0 {fastmath = #arith.fastmath} : (!fir.box>) -> i32 +! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref ! CHECK-NEXT: return ! CHECK-NEXT: } @@ -44,9 +43,8 @@ end subroutine ! CHECK-DAG: %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]] ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG2]] -! CHECK-NEXT: %[[EXPR:.*]] = hlfir.product %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> !hlfir.expr -! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr, !fir.ref -! CHECK-NEXT: hlfir.destroy %[[EXPR]] +! CHECK-NEXT: %[[EXPR:.*]] = hlfir.product %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> i32 +! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref ! CHECK-NEXT: return ! CHECK-NEXT: } @@ -56,15 +54,13 @@ subroutine product4(a, s, m) logical :: m(:) s = PRODUCT(a, m) end subroutine - ! CHECK-LABEL: func.func @_QPproduct4( ! CHECK: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a"}, %arg1: !fir.ref {fir.bindc_name = "s"}, %arg2: !fir.box>> {fir.bindc_name = "m"}) ! CHECK-DAG: %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]] ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG2]] -! CHECK-NEXT: %[[EXPR:.*]] = hlfir.product %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> !hlfir.expr -! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr, !fir.ref -! CHECK-NEXT: hlfir.destroy %[[EXPR]] +! CHECK-NEXT: %[[EXPR:.*]] = hlfir.product %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> i32 +! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref ! CHECK-NEXT: return ! CHECK-NEXT: } @@ -74,7 +70,6 @@ subroutine product5(s) integer :: a(2,2) = reshape((/1, 2, 3, 4/), [2,2]) s = PRODUCT(a, 1, .true.) end subroutine - ! CHECK-LABEL: func.func @_QPproduct5( ! CHECK: %[[ARG0:.*]]: !fir.ref> ! CHECK-DAG: %[[ADDR:.*]] = fir.address_of({{.*}}) : !fir.ref> @@ -96,7 +91,6 @@ subroutine product6(a, s, d) real :: a(:,:), s(:) s = PRODUCT(a, (d)) end subroutine - ! CHECK-LABEL: func.func @_QPproduct6( ! CHECK: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.box> {fir.bindc_name = "s"}, %[[ARG2:.*]]: !fir.ref>> {fir.bindc_name = "d"}) ! CHECK-DAG: %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]] diff --git a/flang/test/Lower/HLFIR/sum.f90 b/flang/test/Lower/HLFIR/sum.f90 index 32a2423..72dbb5b 100644 --- a/flang/test/Lower/HLFIR/sum.f90 +++ b/flang/test/Lower/HLFIR/sum.f90 @@ -10,10 +10,8 @@ end subroutine ! CHECK: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref ! CHECK-DAG: %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]] ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]] -! CHECK-NEXT: %[[EXPR:.*]] = hlfir.sum %[[ARRAY]]#0 {fastmath = #arith.fastmath} : (!fir.box>) -> -!hlfir.expr -! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr, !fir.ref -! CHECK-NEXT: hlfir.destroy %[[EXPR]] +! CHECK-NEXT: %[[EXPR:.*]] = hlfir.sum %[[ARRAY]]#0 {fastmath = #arith.fastmath} : (!fir.box>) -> i32 +! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref ! CHECK-NEXT: return ! CHECK-NEXT: } @@ -45,9 +43,8 @@ end subroutine ! CHECK-DAG: %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]] ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG2]] -! CHECK-NEXT: %[[EXPR:.*]] = hlfir.sum %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> !hlfir.expr -! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr, !fir.ref -! CHECK-NEXT: hlfir.destroy %[[EXPR]] +! CHECK-NEXT: %[[EXPR:.*]] = hlfir.sum %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.ref>) -> i32 +! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref ! CHECK-NEXT: return ! CHECK-NEXT: } @@ -62,9 +59,8 @@ end subroutine ! CHECK-DAG: %[[ARRAY:.*]]:2 = hlfir.declare %[[ARG0]] ! CHECK-DAG: %[[OUT:.*]]:2 = hlfir.declare %[[ARG1]] ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG2]] -! CHECK-NEXT: %[[EXPR:.*]] = hlfir.sum %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> !hlfir.expr -! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : !hlfir.expr, !fir.ref -! CHECK-NEXT: hlfir.destroy %[[EXPR]] +! CHECK-NEXT: %[[EXPR:.*]] = hlfir.sum %[[ARRAY]]#0 mask %[[MASK]]#0 {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> i32 +! CHECK-NEXT: hlfir.assign %[[EXPR]] to %[[OUT]]#0 : i32, !fir.ref ! CHECK-NEXT: return ! CHECK-NEXT: } -- 2.7.4