diff --git a/flang/include/flang/Optimizer/HLFIR/HLFIROps.td b/flang/include/flang/Optimizer/HLFIR/HLFIROps.td --- a/flang/include/flang/Optimizer/HLFIR/HLFIROps.td +++ b/flang/include/flang/Optimizer/HLFIR/HLFIROps.td @@ -329,7 +329,7 @@ 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 @@ "::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 @@ "::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 --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -1333,11 +1333,12 @@ 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 --- a/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp +++ b/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp @@ -451,31 +451,41 @@ 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 and dim != NULL) { + 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 @@ 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 @@ .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 @@ } } - 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 and dim != NULL) { + 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 --- 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 --- 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 @@ // 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 --- a/flang/test/HLFIR/flang-experimental-hlfir-flag.f90 +++ b/flang/test/HLFIR/flang-experimental-hlfir-flag.f90 @@ -13,7 +13,6 @@ ! 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 --- a/flang/test/HLFIR/invalid.fir +++ b/flang/test/HLFIR/invalid.fir @@ -299,13 +299,13 @@ // ----- 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 @@ %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_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_sum4(%arg0: !hlfir.expr, %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 --- 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 @@ %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 @@ %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 --- a/flang/test/HLFIR/product.fir +++ b/flang/test/HLFIR/product.fir @@ -10,7 +10,7 @@ %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 @@ // 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 @@ %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 @@ // 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 @@ %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 @@ // 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 @@ %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 @@ // 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 @@ // 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 @@ // 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 @@ // 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 --- 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 @@ %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 @@ %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 --- a/flang/test/HLFIR/sum.fir +++ b/flang/test/HLFIR/sum.fir @@ -10,7 +10,7 @@ %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 @@ // 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 @@ %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 @@ // 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 @@ %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 @@ // 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 @@ %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 @@ // 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 @@ // 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 @@ // 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 @@ // 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 --- a/flang/test/Lower/HLFIR/any.f90 +++ b/flang/test/Lower/HLFIR/any.f90 @@ -10,9 +10,8 @@ ! 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 --- a/flang/test/Lower/HLFIR/product.f90 +++ b/flang/test/Lower/HLFIR/product.f90 @@ -10,9 +10,8 @@ ! 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 @@ ! 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 @@ 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 @@ 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 @@ 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 --- a/flang/test/Lower/HLFIR/sum.f90 +++ b/flang/test/Lower/HLFIR/sum.f90 @@ -10,10 +10,8 @@ ! 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 @@ ! 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 @@ ! 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: }