[flang-commits] [flang] 1538ad9 - [flang][hlfir] fix elemental subroutine calls
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Tue Jul 4 02:35:33 PDT 2023
Author: Tom Eccles
Date: 2023-07-04T09:34:43Z
New Revision: 1538ad9fc0140584c1569220f8c0b8c1c75c6578
URL: https://github.com/llvm/llvm-project/commit/1538ad9fc0140584c1569220f8c0b8c1c75c6578
DIFF: https://github.com/llvm/llvm-project/commit/1538ad9fc0140584c1569220f8c0b8c1c75c6578.diff
LOG: [flang][hlfir] fix elemental subroutine calls
genElementalCall can return a null option when lowering elemental
subroutine calls (as there is no return value). Therefore
std::option::value should not be used as it will cause an
assertion failure.
This fixes uses of the mvbits intrinsic with array arguments, as used in
the gfortran test suite.
Differential Revision: https://reviews.llvm.org/D154340
Added:
Modified:
flang/lib/Lower/ConvertCall.cpp
flang/test/Lower/HLFIR/intrinsic-subroutines.f90
Removed:
################################################################################
diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp
index cf814ecadfe448..3b47560210c434 100644
--- a/flang/lib/Lower/ConvertCall.cpp
+++ b/flang/lib/Lower/ConvertCall.cpp
@@ -1773,8 +1773,8 @@ genIntrinsicRef(const Fortran::evaluate::SpecificIntrinsic *intrinsic,
// All intrinsic elemental functions are pure.
const bool isFunction = callContext.resultType.has_value();
return ElementalIntrinsicCallBuilder{intrinsic, argLowering, isFunction}
- .genElementalCall(loweredActuals, /*isImpure=*/!isFunction, callContext)
- .value();
+ .genElementalCall(loweredActuals, /*isImpure=*/!isFunction,
+ callContext);
}
std::optional<hlfir::EntityWithAttributes> result = genHLFIRIntrinsicRefCore(
loweredActuals, intrinsic, argLowering, callContext);
diff --git a/flang/test/Lower/HLFIR/intrinsic-subroutines.f90 b/flang/test/Lower/HLFIR/intrinsic-subroutines.f90
index 9eb05a33dc9aae..216e044ec9cab0 100644
--- a/flang/test/Lower/HLFIR/intrinsic-subroutines.f90
+++ b/flang/test/Lower/HLFIR/intrinsic-subroutines.f90
@@ -12,3 +12,77 @@ subroutine test_subroutine(x)
! CHECK: %[[VAL_2:.*]] = fir.call @_FortranACpuTime() fastmath<contract> : () -> f64
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (f64) -> f32
! CHECK: fir.store %[[VAL_3]] to %[[VAL_1]]#1 : !fir.ref<f32>
+
+! test elemental subroutine calls
+program main
+ implicit none
+ integer, parameter :: N = 3
+ integer :: from(N), to(N)
+ from = 7
+ to = 6
+
+ call mvbits(from, 2, 2, to, 0)
+ if (any(to /= 5)) STOP 1
+end program
+! CHECK-LABEL: func.func @_QQmain() attributes {fir.bindc_name = "main"} {
+! CHECK: %[[VAL_0:.*]] = arith.constant 3 : index
+! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "from", uniq_name = "_QFEfrom"}
+! CHECK: %[[VAL_2:.*]] = fir.shape %[[VAL_0]] : (index) -> !fir.shape<1>
+! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_2]]) {uniq_name = "_QFEfrom"} : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<3xi32>>, !fir.ref<!fir.array<3xi32>>)
+! CHECK: %[[VAL_4:.*]] = fir.address_of(@_QFECn) : !fir.ref<i32>
+! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QFECn"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+! CHECK: %[[VAL_6:.*]] = arith.constant 3 : index
+! CHECK: %[[VAL_7:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "to", uniq_name = "_QFEto"}
+! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>
+! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_7]](%[[VAL_8]]) {uniq_name = "_QFEto"} : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<3xi32>>, !fir.ref<!fir.array<3xi32>>)
+! CHECK: %[[VAL_10:.*]] = arith.constant 7 : i32
+! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_3]]#0 : i32, !fir.ref<!fir.array<3xi32>>
+! CHECK: %[[VAL_11:.*]] = arith.constant 6 : i32
+! CHECK: hlfir.assign %[[VAL_11]] to %[[VAL_9]]#0 : i32, !fir.ref<!fir.array<3xi32>>
+! CHECK: %[[VAL_12:.*]] = arith.constant 2 : i32
+! CHECK: %[[VAL_13:.*]] = arith.constant 2 : i32
+! CHECK: %[[VAL_14:.*]] = arith.constant 0 : i32
+! CHECK: %[[VAL_15:.*]] = arith.constant 1 : index
+! CHECK: fir.do_loop %[[VAL_16:.*]] = %[[VAL_15]] to %[[VAL_0]] step %[[VAL_15]] {
+! CHECK: %[[VAL_17:.*]] = hlfir.designate %[[VAL_3]]#0 (%[[VAL_16]]) : (!fir.ref<!fir.array<3xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_17]] : !fir.ref<i32>
+! CHECK: %[[VAL_19:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_16]]) : (!fir.ref<!fir.array<3xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_20:.*]] = fir.load %[[VAL_19]] : !fir.ref<i32>
+! CHECK: %[[VAL_21:.*]] = arith.constant 0 : i32
+! CHECK: %[[VAL_22:.*]] = arith.constant -1 : i32
+! CHECK: %[[VAL_23:.*]] = arith.constant 32 : i32
+! CHECK: %[[VAL_24:.*]] = arith.subi %[[VAL_23]], %[[VAL_13]] : i32
+! CHECK: %[[VAL_25:.*]] = arith.shrui %[[VAL_22]], %[[VAL_24]] : i32
+! CHECK: %[[VAL_26:.*]] = arith.shli %[[VAL_25]], %[[VAL_14]] : i32
+! CHECK: %[[VAL_27:.*]] = arith.xori %[[VAL_26]], %[[VAL_22]] : i32
+! CHECK: %[[VAL_28:.*]] = arith.andi %[[VAL_27]], %[[VAL_20]] : i32
+! CHECK: %[[VAL_29:.*]] = arith.shrui %[[VAL_18]], %[[VAL_12]] : i32
+! CHECK: %[[VAL_30:.*]] = arith.andi %[[VAL_29]], %[[VAL_25]] : i32
+! CHECK: %[[VAL_31:.*]] = arith.shli %[[VAL_30]], %[[VAL_14]] : i32
+! CHECK: %[[VAL_32:.*]] = arith.ori %[[VAL_28]], %[[VAL_31]] : i32
+! CHECK: %[[VAL_33:.*]] = arith.cmpi eq, %[[VAL_13]], %[[VAL_21]] : i32
+! CHECK: %[[VAL_34:.*]] = arith.select %[[VAL_33]], %[[VAL_20]], %[[VAL_32]] : i32
+! CHECK: fir.store %[[VAL_34]] to %[[VAL_19]] : !fir.ref<i32>
+! CHECK: }
+! CHECK: %[[VAL_35:.*]] = arith.constant 5 : i32
+! CHECK: %[[VAL_36:.*]] = hlfir.elemental %[[VAL_8]] unordered : (!fir.shape<1>) -> !hlfir.expr<3x!fir.logical<4>> {
+! CHECK: ^bb0(%[[VAL_37:.*]]: index):
+! CHECK: %[[VAL_38:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_37]]) : (!fir.ref<!fir.array<3xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_38]] : !fir.ref<i32>
+! CHECK: %[[VAL_40:.*]] = arith.cmpi ne, %[[VAL_39]], %[[VAL_35]] : i32
+! CHECK: %[[VAL_41:.*]] = fir.convert %[[VAL_40]] : (i1) -> !fir.logical<4>
+! CHECK: hlfir.yield_element %[[VAL_41]] : !fir.logical<4>
+! CHECK: }
+! CHECK: %[[VAL_42:.*]] = hlfir.any %[[VAL_43:.*]] : (!hlfir.expr<3x!fir.logical<4>>) -> !fir.logical<4>
+! CHECK: hlfir.destroy %[[VAL_43]] : !hlfir.expr<3x!fir.logical<4>>
+! CHECK: %[[VAL_44:.*]] = fir.convert %[[VAL_42]] : (!fir.logical<4>) -> i1
+! CHECK: cf.cond_br %[[VAL_44]], ^bb1, ^bb2
+! CHECK: ^bb1:
+! CHECK: %[[VAL_45:.*]] = arith.constant 1 : i32
+! CHECK: %[[VAL_46:.*]] = arith.constant false
+! CHECK: %[[VAL_47:.*]] = arith.constant false
+! CHECK: %[[VAL_48:.*]] = fir.call @_FortranAStopStatement(%[[VAL_45]], %[[VAL_46]], %[[VAL_47]]) fastmath<contract> : (i32, i1, i1) -> none
+! CHECK: fir.unreachable
+! CHECK: ^bb2:
+! CHECK: return
+! CHECK: }
More information about the flang-commits
mailing list