[flang-commits] [flang] [flang][NFC] Converted five tests from old lowering to new lowering (part 6) (PR #175485)
Eugene Epshteyn via flang-commits
flang-commits at lists.llvm.org
Wed Jan 14 07:25:05 PST 2026
https://github.com/eugeneepshteyn updated https://github.com/llvm/llvm-project/pull/175485
>From 7183ef201962323d42f267203611fb4c5e640aba Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Sun, 11 Jan 2026 23:25:54 -0500
Subject: [PATCH 1/2] [flang][NFC] Converted five tests from old lowering to
new lowering (part 6) Modified the following tests:
array-elemental-calls-2.f90, array-expression-assumed-size.f90,
array-temp.f90, array-user-def-assignments.f90, array.f90
---
flang/test/Lower/array-elemental-calls-2.f90 | 321 ++++---
.../Lower/array-expression-assumed-size.f90 | 362 ++------
flang/test/Lower/array-temp.f90 | 429 ++--------
.../test/Lower/array-user-def-assignments.f90 | 807 ++++--------------
flang/test/Lower/array.f90 | 147 ++--
5 files changed, 612 insertions(+), 1454 deletions(-)
diff --git a/flang/test/Lower/array-elemental-calls-2.f90 b/flang/test/Lower/array-elemental-calls-2.f90
index 60c9257a19822..30e2cf88d1195 100644
--- a/flang/test/Lower/array-elemental-calls-2.f90
+++ b/flang/test/Lower/array-elemental-calls-2.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -o - -emit-fir -hlfir=false %s | FileCheck %s
+! RUN: bbc -o - -emit-hlfir %s | FileCheck %s
! Test lowering of operations sub-expression inside elemental call arguments.
! This tests array contexts where an address is needed for each element (for
@@ -26,147 +26,253 @@ integer elemental function elem_func_real(x)
complex(8) :: z1(10), z2
contains
-! CHECK-LABEL: func @_QMtest_opsPcheck_binary_ops() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_binary_ops() {
subroutine check_binary_ops()
print *, elem_func(i+j)
-! CHECK: %[[VAL_0:.*]] = fir.alloca i32
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_25:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xi32>, index) -> i32
-! CHECK: %[[VAL_26:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xi32>, index) -> i32
-! CHECK: %[[VAL_27:.*]] = arith.addi %[[VAL_25]], %[[VAL_26]] : i32
-! CHECK: fir.store %[[VAL_27]] to %[[VAL_0]] : !fir.ref<i32>
-! CHECK: fir.call @_QPelem_func(%[[VAL_0]]) {{.*}}: (!fir.ref<i32>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_38:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_37]] : !fir.ref<i32>
+! CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_38]] : !fir.ref<i32>
+! CHECK: %[[VAL_41:.*]] = arith.addi %[[VAL_39]], %[[VAL_40]] : i32
+! CHECK: hlfir.yield_element %[[VAL_41]] : i32
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10xi32>, index) -> i32
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func(%[[VAL_38]]#0) {{.*}} : (!fir.ref<i32>) -> i32
+! CHECK: hlfir.end_associate %[[VAL_38]]#1, %[[VAL_38]]#2 : !fir.ref<i32>, i1
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_binary_ops_2() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_binary_ops_2() {
subroutine check_binary_ops_2()
print *, elem_func(i*iscalar)
-! CHECK: %[[VAL_0:.*]] = fir.alloca i32
-! CHECK: %[[VAL_13:.*]] = fir.load %{{.*}} : !fir.ref<i32>
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_25:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xi32>, index) -> i32
-! CHECK: %[[VAL_27:.*]] = arith.muli %[[VAL_25]], %[[VAL_13]] : i32
-! CHECK: fir.store %[[VAL_27]] to %[[VAL_0]] : !fir.ref<i32>
-! CHECK: fir.call @_QPelem_func(%[[VAL_0]]) {{.*}}: (!fir.ref<i32>) -> i32
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_38:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_38]] : !fir.ref<i32>
+! CHECK: %[[VAL_40:.*]] = arith.muli %[[VAL_39]], %{{.*}} : i32
+! CHECK: hlfir.yield_element %[[VAL_40]] : i32
+! CHECK: }
+! CHECK: %[[VAL_31:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_38:.*]] = hlfir.apply %[[VAL_30]], %[[ARG0]] : (!hlfir.expr<10xi32>, index) -> i32
+! CHECK: %[[VAL_39:.*]]:3 = hlfir.associate %[[VAL_38]] {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
+! CHECK: %[[VAL_40:.*]] = fir.call @_QPelem_func(%[[VAL_39]]#0) {{.*}} : (!fir.ref<i32>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_40]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_negate() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_negate() {
subroutine check_negate()
print *, elem_func(-i)
-! CHECK: %[[VAL_0:.*]] = fir.alloca i32
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_21:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xi32>, index) -> i32
-! CHECK: %[[VAL_22:.*]] = arith.constant 0 : i32
-! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_22]], %[[VAL_21]] : i32
-! CHECK: fir.store %[[VAL_23]] to %[[VAL_0]] : !fir.ref<i32>
-! CHECK: fir.call @_QPelem_func(%[[VAL_0]]) {{.*}}: (!fir.ref<i32>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_37]] : !fir.ref<i32>
+! CHECK: %[[VAL_39:.*]] = arith.subi %c0_i32, %[[VAL_38]] : i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10xi32>, index) -> i32
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func(%[[VAL_38]]#0) {{.*}} : (!fir.ref<i32>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_convert() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_convert() {
subroutine check_convert()
print *, elem_func(int(x))
-! CHECK: %[[VAL_0:.*]] = fir.alloca i32
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_21:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64
-! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (f64) -> i32
-! CHECK: fir.store %[[VAL_22]] to %[[VAL_0]] : !fir.ref<i32>
-! CHECK: fir.call @_QPelem_func(%[[VAL_0]]) {{.*}}: (!fir.ref<i32>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xf64>>, index) -> !fir.ref<f64>
+! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_37]] : !fir.ref<f64>
+! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (f64) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10xi32>, index) -> i32
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func(%[[VAL_38]]#0) {{.*}} : (!fir.ref<i32>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_exteremum() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_exteremum() {
subroutine check_exteremum()
print *, elem_func(min(i, j))
-! CHECK: %[[VAL_0:.*]] = fir.alloca i32
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_25:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xi32>, index) -> i32
-! CHECK: %[[VAL_26:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xi32>, index) -> i32
-! CHECK: %[[VAL_27:.*]] = arith.cmpi slt, %[[VAL_25]], %[[VAL_26]] : i32
-! CHECK: %[[VAL_28:.*]] = arith.select %[[VAL_27]], %[[VAL_25]], %[[VAL_26]] : i32
-! CHECK: fir.store %[[VAL_28]] to %[[VAL_0]] : !fir.ref<i32>
-! CHECK: fir.call @_QPelem_func(%[[VAL_0]]) {{.*}}: (!fir.ref<i32>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_38:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_37]] : !fir.ref<i32>
+! CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_38]] : !fir.ref<i32>
+! CHECK: %[[VAL_41:.*]] = arith.cmpi slt, %[[VAL_39]], %[[VAL_40]] : i32
+! CHECK: %[[VAL_42:.*]] = arith.select %[[VAL_41]], %[[VAL_39]], %[[VAL_40]] : i32
+! CHECK: hlfir.yield_element %[[VAL_42]] : i32
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10xi32>, index) -> i32
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func(%[[VAL_38]]#0) {{.*}} : (!fir.ref<i32>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_logical_unary_ops() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_logical_unary_ops() {
subroutine check_logical_unary_ops()
print *, elem_func_logical(.not.b)
-! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.logical<8>
-! CHECK: %[[VAL_12:.*]] = arith.constant true
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_22:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10x!fir.logical<8>>, index) -> !fir.logical<8>
-! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (!fir.logical<8>) -> i1
-! CHECK: %[[VAL_24:.*]] = arith.xori %[[VAL_23]], %[[VAL_12]] : i1
-! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i1) -> !fir.logical<8>
-! CHECK: fir.store %[[VAL_25]] to %[[VAL_0]] : !fir.ref<!fir.logical<8>>
-! CHECK: fir.call @_QPelem_func_logical(%[[VAL_0]]) {{.*}}: (!fir.ref<!fir.logical<8>>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<8>> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10x!fir.logical<8>>>, index) -> !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_37]] : !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (!fir.logical<8>) -> i1
+! CHECK: %[[VAL_40:.*]] = arith.xori %[[VAL_39]], %true : i1
+! CHECK: %[[VAL_41:.*]] = fir.convert %[[VAL_40]] : (i1) -> !fir.logical<8>
+! CHECK: hlfir.yield_element %[[VAL_41]] : !fir.logical<8>
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10x!fir.logical<8>>, index) -> !fir.logical<8>
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (!fir.logical<8>) -> (!fir.ref<!fir.logical<8>>, !fir.ref<!fir.logical<8>>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func_logical(%[[VAL_38]]#0) {{.*}} : (!fir.ref<!fir.logical<8>>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_logical_binary_ops() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_logical_binary_ops() {
subroutine check_logical_binary_ops()
print *, elem_func_logical(a.eqv.b)
-! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.logical<8>
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_25:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10x!fir.logical<8>>, index) -> !fir.logical<8>
-! CHECK: %[[VAL_26:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10x!fir.logical<8>>, index) -> !fir.logical<8>
-! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_25]] : (!fir.logical<8>) -> i1
-! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_26]] : (!fir.logical<8>) -> i1
-! CHECK: %[[VAL_29:.*]] = arith.cmpi eq, %[[VAL_27]], %[[VAL_28]] : i1
-! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i1) -> !fir.logical<8>
-! CHECK: fir.store %[[VAL_30]] to %[[VAL_0]] : !fir.ref<!fir.logical<8>>
-! CHECK: fir.call @_QPelem_func_logical(%[[VAL_0]]) {{.*}}: (!fir.ref<!fir.logical<8>>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<8>> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10x!fir.logical<8>>>, index) -> !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_38:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10x!fir.logical<8>>>, index) -> !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_37]] : !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_38]] : !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_41:.*]] = fir.convert %[[VAL_39]] : (!fir.logical<8>) -> i1
+! CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_40]] : (!fir.logical<8>) -> i1
+! CHECK: %[[VAL_43:.*]] = arith.cmpi eq, %[[VAL_41]], %[[VAL_42]] : i1
+! CHECK: %[[VAL_44:.*]] = fir.convert %[[VAL_43]] : (i1) -> !fir.logical<8>
+! CHECK: hlfir.yield_element %[[VAL_44]] : !fir.logical<8>
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10x!fir.logical<8>>, index) -> !fir.logical<8>
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (!fir.logical<8>) -> (!fir.ref<!fir.logical<8>>, !fir.ref<!fir.logical<8>>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func_logical(%[[VAL_38]]#0) {{.*}} : (!fir.ref<!fir.logical<8>>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_compare() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_compare() {
subroutine check_compare()
print *, elem_func_logical4(x.lt.y)
-! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.logical<4>
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_25:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64
-! CHECK: %[[VAL_26:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64
-! CHECK: %[[VAL_27:.*]] = arith.cmpf olt, %[[VAL_25]], %[[VAL_26]] {{.*}} : f64
-! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i1) -> !fir.logical<4>
-! CHECK: fir.store %[[VAL_28]] to %[[VAL_0]] : !fir.ref<!fir.logical<4>>
-! CHECK: fir.call @_QPelem_func_logical4(%[[VAL_0]]) {{.*}}: (!fir.ref<!fir.logical<4>>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<4>> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xf64>>, index) -> !fir.ref<f64>
+! CHECK: %[[VAL_38:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xf64>>, index) -> !fir.ref<f64>
+! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_37]] : !fir.ref<f64>
+! CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_38]] : !fir.ref<f64>
+! CHECK: %[[VAL_41:.*]] = arith.cmpf olt, %[[VAL_39]], %[[VAL_40]] {{.*}} : f64
+! CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_41]] : (i1) -> !fir.logical<4>
+! CHECK: hlfir.yield_element %[[VAL_42]] : !fir.logical<4>
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10x!fir.logical<4>>, index) -> !fir.logical<4>
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (!fir.logical<4>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func_logical4(%[[VAL_38]]#0) {{.*}} : (!fir.ref<!fir.logical<4>>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_pow() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_pow() {
subroutine check_pow()
print *, elem_func_real(x**y)
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_25:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64
-! CHECK: %[[VAL_26:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64
-! CHECK: %[[VAL_27:.*]] = math.powf %[[VAL_25]], %[[VAL_26]] {{.*}}: f64
-! CHECK: %[[VAL_28:.*]] = fir.call @_QPelem_func_real(%[[VAL_27]]) {{.*}}: (f64) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xf64> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xf64>>, index) -> !fir.ref<f64>
+! CHECK: %[[VAL_38:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xf64>>, index) -> !fir.ref<f64>
+! CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_37]] : !fir.ref<f64>
+! CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_38]] : !fir.ref<f64>
+! CHECK: %[[VAL_41:.*]] = math.powf %[[VAL_39]], %[[VAL_40]] {{.*}} : f64
+! CHECK: hlfir.yield_element %[[VAL_41]] : f64
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10xf64>, index) -> f64
+! CHECK: %[[VAL_38:.*]] = fir.call @_QPelem_func_real(%[[VAL_37]]) {{.*}} : (f64) -> i32
+! CHECK: hlfir.yield_element %[[VAL_38]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_cmplx_part() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_cmplx_part() {
subroutine check_cmplx_part()
print *, elem_func_real(AIMAG(z1 + z2))
-! CHECK: %[[VAL_13:.*]] = fir.load %{{.*}} : !fir.ref<complex<f64>>
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_23:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xcomplex<f64>>, index) -> complex<f64>
-! CHECK: %[[VAL_24:.*]] = fir.addc %[[VAL_23]], %[[VAL_13]] {fastmath = #arith.fastmath<contract>} : complex<f64>
-! CHECK: %[[VAL_25:.*]] = fir.extract_value %[[VAL_24]], [1 : index] : (complex<f64>) -> f64
-! CHECK: fir.call @_QPelem_func_real(%[[VAL_25]]) {{.*}}: (f64) -> i32
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xcomplex<f64>> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_39:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xcomplex<f64>>>, index) -> !fir.ref<complex<f64>>
+! CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_39]] : !fir.ref<complex<f64>>
+! CHECK: %[[VAL_41:.*]] = fir.addc %[[VAL_40]], %{{.*}} {{.*}} : complex<f64>
+! CHECK: hlfir.yield_element %[[VAL_41]] : complex<f64>
+! CHECK: }
+! CHECK: %[[VAL_31:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xf64> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_39:.*]] = hlfir.apply %[[VAL_30]], %[[ARG0]] : (!hlfir.expr<10xcomplex<f64>>, index) -> complex<f64>
+! CHECK: %[[VAL_40:.*]] = fir.extract_value %[[VAL_39]], [1 : index] : (complex<f64>) -> f64
+! CHECK: hlfir.yield_element %[[VAL_40]] : f64
+! CHECK: }
+! CHECK: %[[VAL_32:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_39:.*]] = hlfir.apply %[[VAL_31]], %[[ARG0]] : (!hlfir.expr<10xf64>, index) -> f64
+! CHECK: %[[VAL_40:.*]] = fir.call @_QPelem_func_real(%[[VAL_39]]) {{.*}} : (f64) -> i32
+! CHECK: hlfir.yield_element %[[VAL_40]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_parentheses() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_parentheses() {
subroutine check_parentheses()
print *, elem_func_real((x))
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_21:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10xf64>, index) -> f64
-! CHECK: %[[VAL_22:.*]] = fir.no_reassoc %[[VAL_21]] : f64
-! CHECK: fir.call @_QPelem_func_real(%[[VAL_22]]) {{.*}}: (f64) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xf64> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10xf64>>, index) -> !fir.ref<f64>
+! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_37]] : !fir.ref<f64>
+! CHECK: %[[VAL_39:.*]] = hlfir.no_reassoc %[[VAL_38]] : f64
+! CHECK: hlfir.yield_element %[[VAL_39]] : f64
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10xf64>, index) -> f64
+! CHECK: %[[VAL_38:.*]] = fir.call @_QPelem_func_real(%[[VAL_37]]) {{.*}} : (f64) -> i32
+! CHECK: hlfir.yield_element %[[VAL_38]] : i32
+! CHECK: }
end subroutine
-! CHECK-LABEL: func @_QMtest_opsPcheck_parentheses_logical() {
+! CHECK-LABEL: func.func @_QMtest_opsPcheck_parentheses_logical() {
subroutine check_parentheses_logical()
print *, elem_func_logical((a))
-! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.logical<8>
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_21:.*]] = fir.array_fetch %{{.*}}, %{{.*}} : (!fir.array<10x!fir.logical<8>>, index) -> !fir.logical<8>
-! CHECK: %[[VAL_22:.*]] = fir.no_reassoc %[[VAL_21]] : !fir.logical<8>
-! CHECK: fir.store %[[VAL_22]] to %[[VAL_0]] : !fir.ref<!fir.logical<8>>
-! CHECK: fir.call @_QPelem_func_logical(%[[VAL_0]]) {{.*}}: (!fir.ref<!fir.logical<8>>) -> i32
+! CHECK: %[[VAL_29:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<8>> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.designate %{{.*}} (%[[ARG0]]) : (!fir.ref<!fir.array<10x!fir.logical<8>>>, index) -> !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_37]] : !fir.ref<!fir.logical<8>>
+! CHECK: %[[VAL_39:.*]] = hlfir.no_reassoc %[[VAL_38]] : !fir.logical<8>
+! CHECK: hlfir.yield_element %[[VAL_39]] : !fir.logical<8>
+! CHECK: }
+! CHECK: %[[VAL_30:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10xi32> {
+! CHECK: ^bb0(%[[ARG0:.*]]: index):
+! CHECK: %[[VAL_37:.*]] = hlfir.apply %[[VAL_29]], %[[ARG0]] : (!hlfir.expr<10x!fir.logical<8>>, index) -> !fir.logical<8>
+! CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[VAL_37]] {adapt.valuebyref} : (!fir.logical<8>) -> (!fir.ref<!fir.logical<8>>, !fir.ref<!fir.logical<8>>, i1)
+! CHECK: %[[VAL_39:.*]] = fir.call @_QPelem_func_logical(%[[VAL_38]]#0) {{.*}} : (!fir.ref<!fir.logical<8>>) -> i32
+! CHECK: hlfir.yield_element %[[VAL_39]] : i32
+! CHECK: }
end subroutine
subroutine check_parentheses_derived(a)
@@ -181,14 +287,19 @@ integer elemental function elem_func_derived(x)
end interface
type(t), pointer :: a(:)
print *, elem_func_derived((a))
-! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>
-! CHECK: fir.do_loop
-! CHECK: %[[VAL_21:.*]] = fir.array_access %{{.}}, %{{.*}}
-! CHECK: %[[VAL_22:.*]] = fir.no_reassoc %[[VAL_21]] : !fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>
-! CHECK: %[[FROM:.*]] = fir.coordinate_of %[[VAL_22]], i : (!fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>) -> !fir.ref<i32>
-! CHECK: %[[TO:.*]] = fir.coordinate_of %[[VAL_0]], i : (!fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>) -> !fir.ref<i32>
-! CHECK: %[[VAL:.*]] = fir.load %[[FROM]] : !fir.ref<i32>
-! CHECK: fir.store %[[VAL]] to %[[TO]] : !fir.ref<i32>
-! CHECK: %{{.*}} = fir.call @_QPelem_func_derived(%[[VAL_0]]) {{.*}}: (!fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>) -> i32
+! CHECK: %[[VAL_42:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?x!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>> {
+! CHECK: ^bb0(%[[ARG1:.*]]: index):
+! CHECK: %[[VAL_53:.*]] = hlfir.designate %{{.*}} (%{{.*}}) : (!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>>>, index) -> !fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>
+! CHECK: %[[VAL_54:.*]] = hlfir.as_expr %[[VAL_53]] : (!fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>) -> !hlfir.expr<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>
+! CHECK: hlfir.yield_element %[[VAL_54]] : !hlfir.expr<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>
+! CHECK: }
+! CHECK: %[[VAL_43:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32> {
+! CHECK: ^bb0(%[[ARG1:.*]]: index):
+! CHECK: %[[VAL_50:.*]] = hlfir.apply %[[VAL_42]], %[[ARG1]] : (!hlfir.expr<?x!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>, index) -> !hlfir.expr<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>
+! CHECK: %[[VAL_51:.*]]:3 = hlfir.associate %[[VAL_50]] {adapt.valuebyref} : (!hlfir.expr<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>) -> (!fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>, !fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>, i1)
+! CHECK: %[[VAL_52:.*]] = fir.call @_QPelem_func_derived(%[[VAL_51]]#0) {{.*}} : (!fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>) -> i32
+! CHECK: hlfir.end_associate %[[VAL_51]]#1, %[[VAL_51]]#2 : !fir.ref<!fir.type<_QMtest_opsFcheck_parentheses_derivedTt{i:i32}>>, i1
+! CHECK: hlfir.yield_element %[[VAL_52]] : i32
+! CHECK: }
end subroutine
end module
diff --git a/flang/test/Lower/array-expression-assumed-size.f90 b/flang/test/Lower/array-expression-assumed-size.f90
index b51dc00c20e28..29962c8ec3cf1 100644
--- a/flang/test/Lower/array-expression-assumed-size.f90
+++ b/flang/test/Lower/array-expression-assumed-size.f90
@@ -1,12 +1,46 @@
-! RUN: bbc --emit-fir -hlfir=false %s -o - | FileCheck %s
-! RUN: bbc -hlfir=false -fwrapv %s -o - | FileCheck --check-prefix=PostOpt %s
-
+! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
+! RUN: bbc -emit-hlfir -fwrapv %s -o - | FileCheck %s
+! Note: with the old lowering, -fwrapv made a differents in FIR output.
+! With lowering to HLFIR, there's no difference at HLFIR level.
subroutine assumed_size_test(a)
integer :: a(10,*)
a(:, 1:2) = a(:, 3:4)
end subroutine assumed_size_test
+! CHECK-LABEL: func.func @_QPassumed_size_test(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<10x?xi32>> {fir.bindc_name = "a"}) {
+! CHECK: %[[SCOPE:.*]] = fir.dummy_scope : !fir.dscope
+! CHECK: %[[C10_I64:.*]] = arith.constant 10 : i64
+! CHECK: %[[IDX10:.*]] = fir.convert %[[C10_I64]] : (i64) -> index
+! CHECK: %[[C0:.*]] = arith.constant 0 : index
+! CHECK: %[[COND:.*]] = arith.cmpi sgt, %[[IDX10]], %[[C0]] : index
+! CHECK: %[[SEL:.*]] = arith.select %[[COND]], %[[IDX10]], %[[C0]] : index
+! CHECK: %[[EXT:.*]] = fir.assumed_size_extent : index
+! CHECK: %[[SHAPE:.*]] = fir.shape %[[SEL]], %[[EXT]] : (index, index) -> !fir.shape<2>
+! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]](%[[SHAPE]]) dummy_scope %[[SCOPE]] arg 1 {uniq_name = "_QFassumed_size_testEa"} : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, !fir.dscope) -> (!fir.box<!fir.array<10x?xi32>>, !fir.ref<!fir.array<10x?xi32>>)
+! CHECK: %[[C1:.*]] = arith.constant 1 : index
+! CHECK: %[[C1_0:.*]] = arith.constant 1 : index
+! CHECK: %[[C10:.*]] = arith.constant 10 : index
+! CHECK: %[[C3:.*]] = arith.constant 3 : index
+! CHECK: %[[C4:.*]] = arith.constant 4 : index
+! CHECK: %[[C1_1:.*]] = arith.constant 1 : index
+! CHECK: %[[C2:.*]] = arith.constant 2 : index
+! CHECK: %[[SHAPE2:.*]] = fir.shape %[[C10]], %[[C2]] : (index, index) -> !fir.shape<2>
+! CHECK: %[[SRC:.*]] = hlfir.designate %[[DECL]]#0 (%[[C1]]:%[[SEL]]:%[[C1_0]], %[[C3]]:%[[C4]]:%[[C1_1]]) shape %[[SHAPE2]] : (!fir.box<!fir.array<10x?xi32>>, index, index, index, index, index, index, !fir.shape<2>) -> !fir.ref<!fir.array<10x2xi32>>
+! CHECK: %[[C1_2:.*]] = arith.constant 1 : index
+! CHECK: %[[C1_3:.*]] = arith.constant 1 : index
+! CHECK: %[[C10_4:.*]] = arith.constant 10 : index
+! CHECK: %[[C1_5:.*]] = arith.constant 1 : index
+! CHECK: %[[C2_6:.*]] = arith.constant 2 : index
+! CHECK: %[[C1_7:.*]] = arith.constant 1 : index
+! CHECK: %[[C2_8:.*]] = arith.constant 2 : index
+! CHECK: %[[SHAPE3:.*]] = fir.shape %[[C10_4]], %[[C2_8]] : (index, index) -> !fir.shape<2>
+! CHECK: %[[DST:.*]] = hlfir.designate %[[DECL]]#0 (%[[C1_2]]:%[[SEL]]:%[[C1_3]], %[[C1_5]]:%[[C2_6]]:%[[C1_7]]) shape %[[SHAPE3]] : (!fir.box<!fir.array<10x?xi32>>, index, index, index, index, index, index, !fir.shape<2>) -> !fir.ref<!fir.array<10x2xi32>>
+! CHECK: hlfir.assign %[[SRC]] to %[[DST]] : !fir.ref<!fir.array<10x2xi32>>, !fir.ref<!fir.array<10x2xi32>>
+! CHECK: return
+! CHECK: }
+
subroutine assumed_size_forall_test(b)
integer :: b(10,*)
forall (i=2:6)
@@ -14,290 +48,46 @@ subroutine assumed_size_forall_test(b)
end forall
end subroutine assumed_size_forall_test
-! CHECK-LABEL: func @_QPassumed_size_test(
-! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x?xi32>>{{.*}}) {
-! CHECK: %[[VAL_1A:.*]] = fir.convert %c10{{.*}} : (i64) -> index
-! CHECK: %[[VAL_1B:.*]] = arith.cmpi sgt, %[[VAL_1A]], %c0{{.*}} : index
-! CHECK: %[[VAL_1:.*]] = arith.select %[[VAL_1B]], %[[VAL_1A]], %c0{{.*}} : index
-! CHECK: %[[VAL_2:.*]] = fir.assumed_size_extent : index
-! CHECK: %[[VAL_3:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_4:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i64) -> index
-! CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_3]], %[[VAL_1]] : index
-! CHECK: %[[VAL_7:.*]] = arith.subi %[[VAL_6]], %[[VAL_3]] : index
-! CHECK: %[[VAL_8:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_9:.*]] = arith.subi %[[VAL_7]], %[[VAL_3]] : index
-! CHECK: %[[VAL_10:.*]] = arith.addi %[[VAL_9]], %[[VAL_5]] : index
-! CHECK: %[[VAL_11:.*]] = arith.divsi %[[VAL_10]], %[[VAL_5]] : index
-! CHECK: %[[VAL_12:.*]] = arith.cmpi sgt, %[[VAL_11]], %[[VAL_8]] : index
-! CHECK: %[[VAL_13:.*]] = arith.select %[[VAL_12]], %[[VAL_11]], %[[VAL_8]] : index
-! CHECK: %[[VAL_14:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i64) -> index
-! CHECK: %[[VAL_16:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
-! CHECK: %[[VAL_18:.*]] = arith.constant 2 : i64
-! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i64) -> index
-! CHECK: %[[VAL_20:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_21:.*]] = arith.subi %[[VAL_19]], %[[VAL_15]] : index
-! CHECK: %[[VAL_22:.*]] = arith.addi %[[VAL_21]], %[[VAL_17]] : index
-! CHECK: %[[VAL_23:.*]] = arith.divsi %[[VAL_22]], %[[VAL_17]] : index
-! CHECK: %[[VAL_24:.*]] = arith.cmpi sgt, %[[VAL_23]], %[[VAL_20]] : index
-! CHECK: %[[VAL_25:.*]] = arith.select %[[VAL_24]], %[[VAL_23]], %[[VAL_20]] : index
-! CHECK: %[[VAL_26:.*]] = fir.shape %[[VAL_1]], %[[VAL_2]] : (index, index) -> !fir.shape<2>
-! CHECK: %[[VAL_27:.*]] = fir.slice %[[VAL_3]], %[[VAL_7]], %[[VAL_5]], %[[VAL_15]], %[[VAL_19]], %[[VAL_17]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[VAL_28:.*]] = fir.array_load %[[VAL_0]](%[[VAL_26]]) {{\[}}%[[VAL_27]]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.array<10x?xi32>
-! CHECK: %[[VAL_29:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_30:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i64) -> index
-! CHECK: %[[VAL_32:.*]] = arith.addi %[[VAL_29]], %[[VAL_1]] : index
-! CHECK: %[[VAL_33:.*]] = arith.subi %[[VAL_32]], %[[VAL_29]] : index
-! CHECK: %[[VAL_34:.*]] = arith.constant 3 : i64
-! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_34]] : (i64) -> index
-! CHECK: %[[VAL_36:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_37:.*]] = fir.convert %[[VAL_36]] : (i64) -> index
-! CHECK: %[[VAL_38:.*]] = arith.constant 4 : i64
-! CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (i64) -> index
-! CHECK: %[[VAL_40:.*]] = fir.shape %[[VAL_1]], %[[VAL_2]] : (index, index) -> !fir.shape<2>
-! CHECK: %[[VAL_41:.*]] = fir.slice %[[VAL_29]], %[[VAL_33]], %[[VAL_31]], %[[VAL_35]], %[[VAL_39]], %[[VAL_37]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[VAL_42:.*]] = fir.array_load %[[VAL_0]](%[[VAL_40]]) {{\[}}%[[VAL_41]]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.array<10x?xi32>
-! CHECK: %[[VAL_43:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_44:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_45:.*]] = arith.subi %[[VAL_13]], %[[VAL_43]] : index
-! CHECK: %[[VAL_46:.*]] = arith.subi %[[VAL_25]], %[[VAL_43]] : index
-! CHECK: %[[VAL_47:.*]] = fir.do_loop %[[VAL_48:.*]] = %[[VAL_44]] to %[[VAL_46]] step %[[VAL_43]] unordered iter_args(%[[VAL_49:.*]] = %[[VAL_28]]) -> (!fir.array<10x?xi32>) {
-! CHECK: %[[VAL_50:.*]] = fir.do_loop %[[VAL_51:.*]] = %[[VAL_44]] to %[[VAL_45]] step %[[VAL_43]] unordered iter_args(%[[VAL_52:.*]] = %[[VAL_49]]) -> (!fir.array<10x?xi32>) {
-! CHECK: %[[VAL_53:.*]] = fir.array_fetch %[[VAL_42]], %[[VAL_51]], %[[VAL_48]] : (!fir.array<10x?xi32>, index, index) -> i32
-! CHECK: %[[VAL_54:.*]] = fir.array_update %[[VAL_52]], %[[VAL_53]], %[[VAL_51]], %[[VAL_48]] : (!fir.array<10x?xi32>, i32, index, index) -> !fir.array<10x?xi32>
-! CHECK: fir.result %[[VAL_54]] : !fir.array<10x?xi32>
+! CHECK-LABEL: func.func @_QPassumed_size_forall_test(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<10x?xi32>> {fir.bindc_name = "b"}) {
+! CHECK: %[[SCOPE:.*]] = fir.dummy_scope : !fir.dscope
+! CHECK: %[[C10_I64:.*]] = arith.constant 10 : i64
+! CHECK: %[[IDX10:.*]] = fir.convert %[[C10_I64]] : (i64) -> index
+! CHECK: %[[C0:.*]] = arith.constant 0 : index
+! CHECK: %[[COND:.*]] = arith.cmpi sgt, %[[IDX10]], %[[C0]] : index
+! CHECK: %[[SEL:.*]] = arith.select %[[COND]], %[[IDX10]], %[[C0]] : index
+! CHECK: %[[EXT:.*]] = fir.assumed_size_extent : index
+! CHECK: %[[SHAPE:.*]] = fir.shape %[[SEL]], %[[EXT]] : (index, index) -> !fir.shape<2>
+! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]](%[[SHAPE]]) dummy_scope %[[SCOPE]] arg 1 {uniq_name = "_QFassumed_size_forall_testEb"} : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, !fir.dscope) -> (!fir.box<!fir.array<10x?xi32>>, !fir.ref<!fir.array<10x?xi32>>)
+! CHECK: %[[C2_I32:.*]] = arith.constant 2 : i32
+! CHECK: %[[C6_I32:.*]] = arith.constant 6 : i32
+! CHECK: hlfir.forall lb {
+! CHECK: hlfir.yield %[[C2_I32]] : i32
+! CHECK: } ub {
+! CHECK: hlfir.yield %[[C6_I32]] : i32
+! CHECK: } (%[[IARG:.*]]: i32) {
+! CHECK: %[[IDXVAR:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK: hlfir.region_assign {
+! CHECK: %[[I:.*]] = fir.load %[[IDXVAR]] : !fir.ref<i32>
+! CHECK: %[[I64:.*]] = fir.convert %[[I]] : (i32) -> i64
+! CHECK: %[[C3:.*]] = arith.constant 3 : index
+! CHECK: %[[C4:.*]] = arith.constant 4 : index
+! CHECK: %[[C1:.*]] = arith.constant 1 : index
+! CHECK: %[[C2:.*]] = arith.constant 2 : index
+! CHECK: %[[SHAPE1:.*]] = fir.shape %[[C2]] : (index) -> !fir.shape<1>
+! CHECK: %[[SRC:.*]] = hlfir.designate %[[DECL]]#0 (%[[I64]], %[[C3]]:%[[C4]]:%[[C1]]) shape %[[SHAPE1]] : (!fir.box<!fir.array<10x?xi32>>, i64, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<2xi32>>
+! CHECK: hlfir.yield %[[SRC]] : !fir.box<!fir.array<2xi32>>
+! CHECK: } to {
+! CHECK: %[[I:.*]] = fir.load %[[IDXVAR]] : !fir.ref<i32>
+! CHECK: %[[I64:.*]] = fir.convert %[[I]] : (i32) -> i64
+! CHECK: %[[C1:.*]] = arith.constant 1 : index
+! CHECK: %[[C2:.*]] = arith.constant 2 : index
+! CHECK: %[[C1_0:.*]] = arith.constant 1 : index
+! CHECK: %[[C2_1:.*]] = arith.constant 2 : index
+! CHECK: %[[SHAPE1:.*]] = fir.shape %[[C2_1]] : (index) -> !fir.shape<1>
+! CHECK: %[[DST:.*]] = hlfir.designate %[[DECL]]#0 (%[[I64]], %[[C1]]:%[[C2]]:%[[C1_0]]) shape %[[SHAPE1]] : (!fir.box<!fir.array<10x?xi32>>, i64, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<2xi32>>
+! CHECK: hlfir.yield %[[DST]] : !fir.box<!fir.array<2xi32>>
! CHECK: }
-! CHECK: fir.result %[[VAL_55:.*]] : !fir.array<10x?xi32>
! CHECK: }
-! CHECK: fir.array_merge_store %[[VAL_28]], %[[VAL_56:.*]] to %[[VAL_0]]{{\[}}%[[VAL_27]]] : !fir.array<10x?xi32>, !fir.array<10x?xi32>, !fir.ref<!fir.array<10x?xi32>>, !fir.slice<2>
! CHECK: return
! CHECK: }
-
-! CHECK-LABEL: func @_QPassumed_size_forall_test(
-! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x?xi32>>{{.*}}) {
-! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK: %[[VAL_2A:.*]] = fir.convert %c10{{.*}} : (i64) -> index
-! CHECK: %[[VAL_2B:.*]] = arith.cmpi sgt, %[[VAL_2A]], %c0{{.*}} : index
-! CHECK: %[[VAL_2:.*]] = arith.select %[[VAL_2B]], %[[VAL_2A]], %c0{{.*}} : index
-! CHECK: %[[VAL_3:.*]] = fir.assumed_size_extent : index
-! CHECK: %[[VAL_4:.*]] = arith.constant 2 : i32
-! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> index
-! CHECK: %[[VAL_6:.*]] = arith.constant 6 : i32
-! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
-! CHECK: %[[VAL_8:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2>
-! CHECK: %[[VAL_10:.*]] = fir.array_load %[[VAL_0]](%[[VAL_9]]) : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>) -> !fir.array<10x?xi32>
-! CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2>
-! CHECK: %[[VAL_12:.*]] = fir.array_load %[[VAL_0]](%[[VAL_11]]) : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>) -> !fir.array<10x?xi32>
-! CHECK: %[[VAL_13:.*]] = fir.do_loop %[[VAL_14:.*]] = %[[VAL_5]] to %[[VAL_7]] step %[[VAL_8]] unordered iter_args(%[[VAL_15:.*]] = %[[VAL_10]]) -> (!fir.array<10x?xi32>) {
-! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_14]] : (index) -> i32
-! CHECK: fir.store %[[VAL_16]] to %[[VAL_1]] : !fir.ref<i32>
-! CHECK: %[[VAL_17:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
-! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i64
-! CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i64) -> index
-! CHECK: %[[VAL_21:.*]] = arith.subi %[[VAL_20]], %[[VAL_17]] : index
-! CHECK: %[[VAL_22:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index
-! CHECK: %[[VAL_24:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i64) -> index
-! CHECK: %[[VAL_26:.*]] = arith.constant 2 : i64
-! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i64) -> index
-! CHECK: %[[VAL_28:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_29:.*]] = arith.subi %[[VAL_27]], %[[VAL_23]] : index
-! CHECK: %[[VAL_30:.*]] = arith.addi %[[VAL_29]], %[[VAL_25]] : index
-! CHECK: %[[VAL_31:.*]] = arith.divsi %[[VAL_30]], %[[VAL_25]] : index
-! CHECK: %[[VAL_32:.*]] = arith.cmpi sgt, %[[VAL_31]], %[[VAL_28]] : index
-! CHECK: %[[VAL_33:.*]] = arith.select %[[VAL_32]], %[[VAL_31]], %[[VAL_28]] : index
-! CHECK: %[[VAL_34:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_35:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
-! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_35]] : (i32) -> i64
-! CHECK: %[[VAL_37:.*]] = fir.convert %[[VAL_36]] : (i64) -> index
-! CHECK: %[[VAL_38:.*]] = arith.subi %[[VAL_37]], %[[VAL_34]] : index
-! CHECK: %[[VAL_39:.*]] = arith.constant 3 : i64
-! CHECK: %[[VAL_40:.*]] = fir.convert %[[VAL_39]] : (i64) -> index
-! CHECK: %[[VAL_41:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_41]] : (i64) -> index
-! CHECK: %[[VAL_43:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_44:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_45:.*]] = arith.subi %[[VAL_33]], %[[VAL_43]] : index
-! CHECK: %[[VAL_46:.*]] = fir.do_loop %[[VAL_47:.*]] = %[[VAL_44]] to %[[VAL_45]] step %[[VAL_43]] unordered iter_args(%[[VAL_48:.*]] = %[[VAL_15]]) -> (!fir.array<10x?xi32>) {
-! CHECK: %[[VAL_49:.*]] = arith.subi %[[VAL_40]], %[[VAL_34]] : index
-! CHECK: %[[VAL_50:.*]] = arith.muli %[[VAL_47]], %[[VAL_42]] : index
-! CHECK: %[[VAL_51:.*]] = arith.addi %[[VAL_49]], %[[VAL_50]] : index
-! CHECK: %[[VAL_52:.*]] = fir.array_fetch %[[VAL_12]], %[[VAL_38]], %[[VAL_51]] : (!fir.array<10x?xi32>, index, index) -> i32
-! CHECK: %[[VAL_53:.*]] = arith.subi %[[VAL_23]], %[[VAL_17]] : index
-! CHECK: %[[VAL_54:.*]] = arith.muli %[[VAL_47]], %[[VAL_25]] : index
-! CHECK: %[[VAL_55:.*]] = arith.addi %[[VAL_53]], %[[VAL_54]] : index
-! CHECK: %[[VAL_56:.*]] = fir.array_update %[[VAL_48]], %[[VAL_52]], %[[VAL_21]], %[[VAL_55]] : (!fir.array<10x?xi32>, i32, index, index) -> !fir.array<10x?xi32>
-! CHECK: fir.result %[[VAL_56]] : !fir.array<10x?xi32>
-! CHECK: }
-! CHECK: fir.result %[[VAL_57:.*]] : !fir.array<10x?xi32>
-! CHECK: }
-! CHECK: fir.array_merge_store %[[VAL_10]], %[[VAL_58:.*]] to %[[VAL_0]] : !fir.array<10x?xi32>, !fir.array<10x?xi32>, !fir.ref<!fir.array<10x?xi32>>
-! CHECK: return
-! CHECK: }
-
-! PostOpt-LABEL: func @_QPassumed_size_test(
-! PostOpt-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x?xi32>>{{.*}}) {
-! PostOpt-DAG: %[[VAL_1:.*]] = arith.constant 10 : index
-! PostOpt-DAG: %[[VAL_2:.*]] = arith.constant 1 : index
-! PostOpt-DAG: %[[VAL_3:.*]] = arith.constant 2 : index
-! PostOpt-DAG: %[[VAL_4:.*]] = arith.constant 0 : index
-! PostOpt-DAG: %[[VAL_5:.*]] = arith.constant 3 : index
-! PostOpt-DAG: %[[VAL_6:.*]] = arith.constant 4 : index
-! PostOpt-DAG: %[[VAL_7:.*]] = fir.assumed_size_extent : index
-! PostOpt: %[[VAL_8:.*]] = fir.shape %[[VAL_1]], %[[VAL_7]] : (index, index) -> !fir.shape<2>
-! PostOpt: %[[VAL_9:.*]] = fir.slice %[[VAL_2]], %[[VAL_1]], %[[VAL_2]], %[[VAL_2]], %[[VAL_3]], %[[VAL_2]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! PostOpt: %[[VAL_10:.*]] = fir.allocmem !fir.array<10x?xi32>, %[[VAL_3]]
-! PostOpt: br ^bb1(%[[VAL_4]], %[[VAL_3]] : index, index)
-! PostOpt: ^bb1(%[[VAL_11:.*]]: index, %[[VAL_12:.*]]: index):
-! PostOpt: %[[VAL_13:.*]] = arith.cmpi sgt, %[[VAL_12]], %[[VAL_4]] : index
-! PostOpt: cond_br %[[VAL_13]], ^bb2(%[[VAL_4]], %[[VAL_1]] : index, index), ^bb5
-! PostOpt: ^bb2(%[[VAL_14:.*]]: index, %[[VAL_15:.*]]: index):
-! PostOpt: %[[VAL_16:.*]] = arith.cmpi sgt, %[[VAL_15]], %[[VAL_4]] : index
-! PostOpt: cond_br %[[VAL_16]], ^bb3, ^bb4
-! PostOpt: ^bb3:
-! PostOpt: %[[VAL_17:.*]] = arith.addi %[[VAL_14]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_18:.*]] = arith.addi %[[VAL_11]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_19:.*]] = fir.array_coor %[[VAL_0]](%[[VAL_8]]) {{\[}}%[[VAL_9]]] %[[VAL_17]], %[[VAL_18]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_20:.*]] = fir.array_coor %[[VAL_10]](%[[VAL_8]]) %[[VAL_17]], %[[VAL_18]] : (!fir.heap<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_21:.*]] = fir.load %[[VAL_19]] : !fir.ref<i32>
-! PostOpt: fir.store %[[VAL_21]] to %[[VAL_20]] : !fir.ref<i32>
-! PostOpt: %[[VAL_22:.*]] = arith.subi %[[VAL_15]], %[[VAL_2]] : index
-! PostOpt: br ^bb2(%[[VAL_17]], %[[VAL_22]] : index, index)
-! PostOpt: ^bb4:
-! PostOpt: %[[VAL_23:.*]] = arith.addi %[[VAL_11]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_24:.*]] = arith.subi %[[VAL_12]], %[[VAL_2]] : index
-! PostOpt: br ^bb1(%[[VAL_23]], %[[VAL_24]] : index, index)
-! PostOpt: ^bb5:
-! PostOpt: %[[VAL_25:.*]] = fir.slice %[[VAL_2]], %[[VAL_1]], %[[VAL_2]], %[[VAL_5]], %[[VAL_6]], %[[VAL_2]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! PostOpt: br ^bb6(%[[VAL_4]], %[[VAL_3]] : index, index)
-! PostOpt: ^bb6(%[[VAL_26:.*]]: index, %[[VAL_27:.*]]: index):
-! PostOpt: %[[VAL_28:.*]] = arith.cmpi sgt, %[[VAL_27]], %[[VAL_4]] : index
-! PostOpt: cond_br %[[VAL_28]], ^bb7(%[[VAL_4]], %[[VAL_1]] : index, index), ^bb10(%[[VAL_4]], %[[VAL_3]] : index, index)
-! PostOpt: ^bb7(%[[VAL_29:.*]]: index, %[[VAL_30:.*]]: index):
-! PostOpt: %[[VAL_31:.*]] = arith.cmpi sgt, %[[VAL_30]], %[[VAL_4]] : index
-! PostOpt: cond_br %[[VAL_31]], ^bb8, ^bb9
-! PostOpt: ^bb8:
-! PostOpt: %[[VAL_32:.*]] = arith.addi %[[VAL_29]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_33:.*]] = arith.addi %[[VAL_26]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_34:.*]] = fir.array_coor %[[VAL_0]](%[[VAL_8]]) {{\[}}%[[VAL_25]]] %[[VAL_32]], %[[VAL_33]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_35:.*]] = fir.load %[[VAL_34]] : !fir.ref<i32>
-! PostOpt: %[[VAL_36:.*]] = fir.array_coor %[[VAL_10]](%[[VAL_8]]) %[[VAL_32]], %[[VAL_33]] : (!fir.heap<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: fir.store %[[VAL_35]] to %[[VAL_36]] : !fir.ref<i32>
-! PostOpt: %[[VAL_37:.*]] = arith.subi %[[VAL_30]], %[[VAL_2]] : index
-! PostOpt: br ^bb7(%[[VAL_32]], %[[VAL_37]] : index, index)
-! PostOpt: ^bb9:
-! PostOpt: %[[VAL_38:.*]] = arith.addi %[[VAL_26]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_39:.*]] = arith.subi %[[VAL_27]], %[[VAL_2]] : index
-! PostOpt: br ^bb6(%[[VAL_38]], %[[VAL_39]] : index, index)
-! PostOpt: ^bb10(%[[VAL_40:.*]]: index, %[[VAL_41:.*]]: index):
-! PostOpt: %[[VAL_42:.*]] = arith.cmpi sgt, %[[VAL_41]], %[[VAL_4]] : index
-! PostOpt: cond_br %[[VAL_42]], ^bb11(%[[VAL_4]], %[[VAL_1]] : index, index), ^bb14
-! PostOpt: ^bb11(%[[VAL_43:.*]]: index, %[[VAL_44:.*]]: index):
-! PostOpt: %[[VAL_45:.*]] = arith.cmpi sgt, %[[VAL_44]], %[[VAL_4]] : index
-! PostOpt: cond_br %[[VAL_45]], ^bb12, ^bb13
-! PostOpt: ^bb12:
-! PostOpt: %[[VAL_46:.*]] = arith.addi %[[VAL_43]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_47:.*]] = arith.addi %[[VAL_40]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_48:.*]] = fir.array_coor %[[VAL_10]](%[[VAL_8]]) %[[VAL_46]], %[[VAL_47]] : (!fir.heap<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_49:.*]] = fir.array_coor %[[VAL_0]](%[[VAL_8]]) {{\[}}%[[VAL_9]]] %[[VAL_46]], %[[VAL_47]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_50:.*]] = fir.load %[[VAL_48]] : !fir.ref<i32>
-! PostOpt: fir.store %[[VAL_50]] to %[[VAL_49]] : !fir.ref<i32>
-! PostOpt: %[[VAL_51:.*]] = arith.subi %[[VAL_44]], %[[VAL_2]] : index
-! PostOpt: br ^bb11(%[[VAL_46]], %[[VAL_51]] : index, index)
-! PostOpt: ^bb13:
-! PostOpt: %[[VAL_52:.*]] = arith.addi %[[VAL_40]], %[[VAL_2]] : index
-! PostOpt: %[[VAL_53:.*]] = arith.subi %[[VAL_41]], %[[VAL_2]] : index
-! PostOpt: br ^bb10(%[[VAL_52]], %[[VAL_53]] : index, index)
-! PostOpt: ^bb14:
-! PostOpt: fir.freemem %[[VAL_10]] : !fir.heap<!fir.array<10x?xi32>>
-! PostOpt: return
-! PostOpt: }
-
-! PostOpt-LABEL: func @_QPassumed_size_forall_test(
-! PostOpt-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x?xi32>>{{.*}}) {
-! PostOpt-DAG: %[[VAL_1:.*]] = arith.constant 3 : index
-! PostOpt-DAG: %[[VAL_2:.*]] = arith.constant 10 : index
-! PostOpt-DAG: %[[VAL_3:.*]] = arith.constant 2 : index
-! PostOpt-DAG: %[[VAL_4:.*]] = arith.constant 1 : index
-! PostOpt-DAG: %[[VAL_5:.*]] = arith.constant 0 : index
-! PostOpt-DAG: %[[VAL_6:.*]] = arith.constant 5 : index
-! PostOpt: %[[VAL_7:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! PostOpt: %[[VAL_8:.*]] = fir.assumed_size_extent : index
-! PostOpt: %[[VAL_9:.*]] = fir.shape %[[VAL_2]], %[[VAL_8]] : (index, index) -> !fir.shape<2>
-! PostOpt: %[[VAL_10:.*]] = fir.allocmem !fir.array<10x?xi32>, %[[VAL_4]]
-! PostOpt: br ^bb1(%[[VAL_5]], %[[VAL_4]] : index, index)
-! PostOpt: ^bb1(%[[VAL_11:.*]]: index, %[[VAL_12:.*]]: index):
-! PostOpt: %[[VAL_13:.*]] = arith.cmpi sgt, %[[VAL_12]], %[[VAL_5]] : index
-! PostOpt: cond_br %[[VAL_13]], ^bb2(%[[VAL_5]], %[[VAL_2]] : index, index), ^bb5
-! PostOpt: ^bb2(%[[VAL_14:.*]]: index, %[[VAL_15:.*]]: index):
-! PostOpt: %[[VAL_16:.*]] = arith.cmpi sgt, %[[VAL_15]], %[[VAL_5]] : index
-! PostOpt: cond_br %[[VAL_16]], ^bb3, ^bb4
-! PostOpt: ^bb3:
-! PostOpt: %[[VAL_17:.*]] = arith.addi %[[VAL_14]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_18:.*]] = arith.addi %[[VAL_11]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_19:.*]] = fir.array_coor %[[VAL_0]](%[[VAL_9]]) %[[VAL_17]], %[[VAL_18]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_20:.*]] = fir.array_coor %[[VAL_10]](%[[VAL_9]]) %[[VAL_17]], %[[VAL_18]] : (!fir.heap<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_21:.*]] = fir.load %[[VAL_19]] : !fir.ref<i32>
-! PostOpt: fir.store %[[VAL_21]] to %[[VAL_20]] : !fir.ref<i32>
-! PostOpt: %[[VAL_22:.*]] = arith.subi %[[VAL_15]], %[[VAL_4]] : index
-! PostOpt: br ^bb2(%[[VAL_17]], %[[VAL_22]] : index, index)
-! PostOpt: ^bb4:
-! PostOpt: %[[VAL_23:.*]] = arith.addi %[[VAL_11]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_24:.*]] = arith.subi %[[VAL_12]], %[[VAL_4]] : index
-! PostOpt: br ^bb1(%[[VAL_23]], %[[VAL_24]] : index, index)
-! PostOpt: ^bb5:
-! PostOpt: br ^bb6(%[[VAL_3]], %[[VAL_6]] : index, index)
-! PostOpt: ^bb6(%[[VAL_25:.*]]: index, %[[VAL_26:.*]]: index):
-! PostOpt: %[[VAL_27:.*]] = arith.cmpi sgt, %[[VAL_26]], %[[VAL_5]] : index
-! PostOpt: cond_br %[[VAL_27]], ^bb7, ^bb11(%[[VAL_5]], %[[VAL_4]] : index, index)
-! PostOpt: ^bb7:
-! PostOpt: %[[VAL_28:.*]] = fir.convert %[[VAL_25]] : (index) -> i32
-! PostOpt: fir.store %[[VAL_28]] to %[[VAL_7]] : !fir.ref<i32>
-! PostOpt: %[[VAL_29:.*]] = fir.load %[[VAL_7]] : !fir.ref<i32>
-! PostOpt: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> index
-! PostOpt: br ^bb8(%[[VAL_5]], %[[VAL_3]] : index, index)
-! PostOpt: ^bb8(%[[VAL_31:.*]]: index, %[[VAL_32:.*]]: index):
-! PostOpt: %[[VAL_33:.*]] = arith.cmpi sgt, %[[VAL_32]], %[[VAL_5]] : index
-! PostOpt: cond_br %[[VAL_33]], ^bb9, ^bb10
-! PostOpt: ^bb9:
-! PostOpt: %[[VAL_34:.*]] = arith.addi %[[VAL_31]], %[[VAL_1]] : index
-! PostOpt: %[[VAL_35:.*]] = fir.array_coor %[[VAL_0]](%[[VAL_9]]) %[[VAL_30]], %[[VAL_34]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_36:.*]] = fir.load %[[VAL_35]] : !fir.ref<i32>
-! PostOpt: %[[VAL_37:.*]] = arith.addi %[[VAL_31]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_38:.*]] = fir.array_coor %[[VAL_10]](%[[VAL_9]]) %[[VAL_30]], %[[VAL_37]] : (!fir.heap<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: fir.store %[[VAL_36]] to %[[VAL_38]] : !fir.ref<i32>
-! PostOpt: %[[VAL_39:.*]] = arith.subi %[[VAL_32]], %[[VAL_4]] : index
-! PostOpt: br ^bb8(%[[VAL_37]], %[[VAL_39]] : index, index)
-! PostOpt: ^bb10:
-! PostOpt: %[[VAL_40:.*]] = arith.addi %[[VAL_25]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_41:.*]] = arith.subi %[[VAL_26]], %[[VAL_4]] : index
-! PostOpt: br ^bb6(%[[VAL_40]], %[[VAL_41]] : index, index)
-! PostOpt: ^bb11(%[[VAL_42:.*]]: index, %[[VAL_43:.*]]: index):
-! PostOpt: %[[VAL_44:.*]] = arith.cmpi sgt, %[[VAL_43]], %[[VAL_5]] : index
-! PostOpt: cond_br %[[VAL_44]], ^bb12(%[[VAL_5]], %[[VAL_2]] : index, index), ^bb15
-! PostOpt: ^bb12(%[[VAL_45:.*]]: index, %[[VAL_46:.*]]: index):
-! PostOpt: %[[VAL_47:.*]] = arith.cmpi sgt, %[[VAL_46]], %[[VAL_5]] : index
-! PostOpt: cond_br %[[VAL_47]], ^bb13, ^bb14
-! PostOpt: ^bb13:
-! PostOpt: %[[VAL_48:.*]] = arith.addi %[[VAL_45]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_49:.*]] = arith.addi %[[VAL_42]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_50:.*]] = fir.array_coor %[[VAL_10]](%[[VAL_9]]) %[[VAL_48]], %[[VAL_49]] : (!fir.heap<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_51:.*]] = fir.array_coor %[[VAL_0]](%[[VAL_9]]) %[[VAL_48]], %[[VAL_49]] : (!fir.ref<!fir.array<10x?xi32>>, !fir.shape<2>, index, index) -> !fir.ref<i32>
-! PostOpt: %[[VAL_52:.*]] = fir.load %[[VAL_50]] : !fir.ref<i32>
-! PostOpt: fir.store %[[VAL_52]] to %[[VAL_51]] : !fir.ref<i32>
-! PostOpt: %[[VAL_53:.*]] = arith.subi %[[VAL_46]], %[[VAL_4]] : index
-! PostOpt: br ^bb12(%[[VAL_48]], %[[VAL_53]] : index, index)
-! PostOpt: ^bb14:
-! PostOpt: %[[VAL_54:.*]] = arith.addi %[[VAL_42]], %[[VAL_4]] : index
-! PostOpt: %[[VAL_55:.*]] = arith.subi %[[VAL_43]], %[[VAL_4]] : index
-! PostOpt: br ^bb11(%[[VAL_54]], %[[VAL_55]] : index, index)
-! PostOpt: ^bb15:
-! PostOpt: fir.freemem %[[VAL_10]] : !fir.heap<!fir.array<10x?xi32>>
-! PostOpt: return
-! PostOpt: }
diff --git a/flang/test/Lower/array-temp.f90 b/flang/test/Lower/array-temp.f90
index 6a67fb55be2a9..e00da0687f002 100644
--- a/flang/test/Lower/array-temp.f90
+++ b/flang/test/Lower/array-temp.f90
@@ -1,21 +1,20 @@
-! RUN: bbc -hlfir=false -fwrapv %s -o - | FileCheck %s
+! RUN: bbc -emit-hlfir -fwrapv %s -o - | FileCheck %s
! CHECK-LABEL: func @_QPss1()
subroutine ss1
- ! CHECK: %[[aa:[0-9]+]] = fir.alloca !fir.array<2650000xf32> {bindc_name = "aa", uniq_name = "_QFss1Eaa"}
! CHECK: %[[shape:[0-9]+]] = fir.shape {{.*}} : (index) -> !fir.shape<1>
+ ! CHECK: %[[aa:[0-9]+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFss1Eaa"}
integer, parameter :: N = 2650000
real aa(N)
- ! CHECK: fir.array_coor %[[aa]](%[[shape]]) {{.*}} : (!fir.ref<!fir.array<2650000xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
+ ! CHECK: hlfir.assign %{{.*}} to %[[aa]]#0
aa = -2
- ! CHECK: %[[temp:[0-9]+]] = fir.allocmem !fir.array<2650000xf32>
- ! CHECK: fir.array_coor %[[aa]](%[[shape]]) {{.*}} : (!fir.ref<!fir.array<2650000xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
- ! CHECK: fir.array_coor %[[temp]](%[[shape]]) {{.*}} : (!fir.heap<!fir.array<2650000xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
- ! CHECK: fir.array_coor %[[aa]](%[[shape]]) [{{.*}}] {{.*}} : (!fir.ref<!fir.array<2650000xf32>>, !fir.shape<1>, !fir.slice<1>, index) -> !fir.ref<f32>
- ! CHECK: fir.array_coor %[[temp]](%[[shape]]) [{{.*}}] {{.*}} : (!fir.heap<!fir.array<2650000xf32>>, !fir.shape<1>, !fir.slice<1>, index) -> !fir.ref<f32>
- ! CHECK: fir.array_coor %[[temp]](%[[shape]]) {{.*}} : (!fir.heap<!fir.array<2650000xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
- ! CHECK: fir.array_coor %[[aa]](%[[shape]]) {{.*}} : (!fir.ref<!fir.array<2650000xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
- ! CHECK: fir.freemem %[[temp]] : !fir.heap<!fir.array<2650000xf32>>
+ ! CHECK: %[[slice1:.*]] = hlfir.designate %[[aa]]#0 (%c1{{.*}}:%c2649999{{.*}}:%c1{{.*}})
+ ! CHECK: %[[res:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<2649999xf32> {
+ ! CHECK: hlfir.yield_element
+ ! CHECK: }
+ ! CHECK: %[[slice2:.*]] = hlfir.designate %[[aa]]#0 (%c2{{.*}}:%c2650000{{.*}}:%c1{{.*}})
+ ! CHECK: hlfir.assign %[[res]] to %[[slice2]]
+ ! CHECK: hlfir.destroy %[[res]]
aa(2:N) = aa(1:N-1) + 7.0
! print*, aa(1:2), aa(N-1:N)
end
@@ -43,365 +42,89 @@ subroutine ss4(N)
! CHECK-LABEL: func @_QPss2(
! CHECK-SAME: %arg0: !fir.ref<i32> {fir.bindc_name = "n"}) {
-! CHECK-DAG: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
-! CHECK-DAG: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
-! CHECK-DAG: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK-DAG: %[[C_27_i32:[-0-9a-z_]+]] = arith.constant 27 : i32
-! CHECK-DAG: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
-! CHECK-DAG: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
-! CHECK-DAG: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK-DAG: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
-! CHECK-DAG: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_0:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[V_0:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_2:[0-9]+]] = arith.cmpi sgt, %[[V_1]], %[[C_0]] : index
-! CHECK: %[[V_3:[0-9]+]] = arith.select %[[V_2]], %[[V_1]], %[[C_0]] : index
-! CHECK: %[[V_4:[0-9]+]] = fir.alloca !fir.array<?xf32>, %[[V_3]] {bindc_name = "aa", uniq_name = "_QFss2Eaa"}
-! CHECK: %[[V_5:[0-9]+]] = fir.shape %[[V_3:[0-9]+]] : (index) -> !fir.shape<1>
-! CHECK: cf.br ^bb1(%[[C_0]], %[[V_3:[0-9]+]] : index, index)
-! CHECK: ^bb1(%[[V_6:[0-9]+]]: index, %[[V_7:[0-9]+]]: index): // 2 preds: ^bb0, ^bb2
-! CHECK: %[[V_8:[0-9]+]] = arith.cmpi sgt, %[[V_7]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_8]], ^bb2, ^bb3
-! CHECK: ^bb2: // pred: ^bb1
-! CHECK: %[[V_9:[0-9]+]] = arith.addi %[[V_6]], %[[C_1]] : index
-! CHECK: %[[V_10:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_9:[0-9]+]] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
-! CHECK: fir.store %[[C_st_0]] to %[[V_10:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_11:[0-9]+]] = arith.subi %[[V_7]], %[[C_1]] : index
-! CHECK: cf.br ^bb1(%[[V_9]], %[[V_11:[0-9]+]] : index, index)
-! CHECK: ^bb3: // pred: ^bb1
-! CHECK: %[[V_12:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_13:[0-9]+]] = fir.convert %[[V_12:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_14:[0-9]+]] = arith.addi %[[V_13]], %[[C_m1]] : index
-! CHECK: %[[V_15:[0-9]+]] = arith.cmpi sgt, %[[V_14]], %[[C_0]] : index
-! CHECK: %[[V_16:[0-9]+]] = arith.select %[[V_15]], %[[V_14]], %[[C_0]] : index
-! CHECK: %[[V_17:[0-9]+]] = fir.slice %[[C_2]], %[[V_13]], %[[C_1]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[V_18:[0-9]+]] = fir.allocmem !fir.array<?xf32>, %[[V_3]]
-! CHECK: cf.br ^bb4(%[[C_0]], %[[V_3:[0-9]+]] : index, index)
-! CHECK: ^bb4(%[[V_19:[0-9]+]]: index, %[[V_20:[0-9]+]]: index): // 2 preds: ^bb3, ^bb5
-! CHECK: %[[V_21:[0-9]+]] = arith.cmpi sgt, %[[V_20]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_21]], ^bb5, ^bb6
-! CHECK: ^bb5: // pred: ^bb4
-! CHECK: %[[V_22:[0-9]+]] = arith.addi %[[V_19]], %[[C_1]] : index
-! CHECK: %[[V_23:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_22:[0-9]+]] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
-! CHECK: %[[V_24:[0-9]+]] = fir.array_coor %[[V_18]](%[[V_5]]) %[[V_22:[0-9]+]] : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
-! CHECK: %[[V_25:[0-9]+]] = fir.load %[[V_23:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.store %[[V_25]] to %[[V_24:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_26:[0-9]+]] = arith.subi %[[V_20]], %[[C_1]] : index
-! CHECK: cf.br ^bb4(%[[V_22]], %[[V_26:[0-9]+]] : index, index)
-! CHECK: ^bb6: // pred: ^bb4
-! CHECK: %[[V_27:[0-9]+]] = arith.subi %[[V_12]], %[[C_1_i32]] : i32
-! CHECK: %[[V_28:[0-9]+]] = fir.convert %[[V_27:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_29:[0-9]+]] = fir.slice %[[C_1]], %[[V_28]], %[[C_1]] : (index, index, index) -> !fir.slice<1>
-! CHECK: cf.br ^bb7(%[[C_0]], %[[V_16:[0-9]+]] : index, index)
-! CHECK: ^bb7(%[[V_30:[0-9]+]]: index, %[[V_31:[0-9]+]]: index): // 2 preds: ^bb6, ^bb8
-! CHECK: %[[V_32:[0-9]+]] = arith.cmpi sgt, %[[V_31]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_32]], ^bb8, ^bb9(%[[C_0]], %[[V_3:[0-9]+]] : index, index)
-! CHECK: ^bb8: // pred: ^bb7
-! CHECK: %[[V_33:[0-9]+]] = arith.addi %[[V_30]], %[[C_1]] : index
-! CHECK: %[[V_34:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) [%[[V_29]]] %[[V_33:[0-9]+]] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>, index) -> !fir.ref<f32>
-! CHECK: %[[V_35:[0-9]+]] = fir.load %[[V_34:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_36:[0-9]+]] = arith.addf %[[V_35]], %[[C_st]] fastmath<contract> : f32
-! CHECK: %[[V_37:[0-9]+]] = fir.array_coor %[[V_18]](%[[V_5]]) [%[[V_17]]] %[[V_33:[0-9]+]] : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>, index) -> !fir.ref<f32>
-! CHECK: fir.store %[[V_36]] to %[[V_37:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_38:[0-9]+]] = arith.subi %[[V_31]], %[[C_1]] : index
-! CHECK: cf.br ^bb7(%[[V_33]], %[[V_38:[0-9]+]] : index, index)
-! CHECK: ^bb9(%[[V_39:[0-9]+]]: index, %[[V_40:[0-9]+]]: index): // 2 preds: ^bb7, ^bb10
-! CHECK: %[[V_41:[0-9]+]] = arith.cmpi sgt, %[[V_40]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_41]], ^bb10, ^bb11
-! CHECK: ^bb10: // pred: ^bb9
-! CHECK: %[[V_42:[0-9]+]] = arith.addi %[[V_39]], %[[C_1]] : index
-! CHECK: %[[V_43:[0-9]+]] = fir.array_coor %[[V_18]](%[[V_5]]) %[[V_42:[0-9]+]] : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
-! CHECK: %[[V_44:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_42:[0-9]+]] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>
-! CHECK: %[[V_45:[0-9]+]] = fir.load %[[V_43:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.store %[[V_45]] to %[[V_44:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_46:[0-9]+]] = arith.subi %[[V_40]], %[[C_1]] : index
-! CHECK: cf.br ^bb9(%[[V_42]], %[[V_46:[0-9]+]] : index, index)
-! CHECK: ^bb11: // pred: ^bb9
-! CHECK: fir.freemem %[[V_18:[0-9]+]] : !fir.heap<!fir.array<?xf32>>
-! CHECK: %[[V_49:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_6_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
-! CHECK: %[[V_50:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[V_51:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_50]]] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<2xf32>>
-! CHECK: %[[V_52:[0-9]+]] = fir.convert %[[V_51:[0-9]+]] : (!fir.box<!fir.array<2xf32>>) -> !fir.box<none>
-! CHECK: %[[V_53:[0-9]+]] = fir.call @_FortranAioOutputDescriptor(%[[V_49]], %[[V_52]]) fastmath<contract> {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1
-! CHECK: %[[V_54:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_55:[0-9]+]] = arith.subi %[[V_54]], %[[C_1_i32]] : i32
-! CHECK: %[[V_56:[0-9]+]] = fir.convert %[[V_55:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_57:[0-9]+]] = fir.convert %[[V_54:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_58:[0-9]+]] = fir.slice %[[V_56]], %[[V_57]], %[[C_1]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[V_59:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_58]]] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>
-! CHECK: %[[V_60:[0-9]+]] = fir.convert %[[V_59:[0-9]+]] : (!fir.box<!fir.array<?xf32>>) -> !fir.box<none>
-! CHECK: %[[V_61:[0-9]+]] = fir.call @_FortranAioOutputDescriptor(%[[V_49]], %[[V_60]]) fastmath<contract> {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1
-! CHECK: %[[V_62:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_49]]) fastmath<contract> {{.*}}: (!fir.ref<i8>) -> i32
+! CHECK: %[[aa:[0-9]+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFss2Eaa"}
+! CHECK: hlfir.assign %{{.*}} to %[[aa]]#0
+! CHECK: %[[slice1:.*]] = hlfir.designate %[[aa]]#0 (%c1{{.*}}:%{{.*}}:%c1{{.*}})
+! CHECK: %[[res:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xf32> {
+! CHECK: hlfir.designate %[[slice1]]
+! CHECK: fir.load
+! CHECK: arith.addf
+! CHECK: hlfir.yield_element
+! CHECK: }
+! CHECK: %[[slice2:.*]] = hlfir.designate %[[aa]]#0 (%c2{{.*}}:%{{.*}}:%c1{{.*}})
+! CHECK: hlfir.assign %[[res]] to %[[slice2]]
+! CHECK: hlfir.destroy %[[res]]
+! CHECK: fir.call @_FortranAioBeginExternalListOutput
+! CHECK: fir.call @_FortranAioOutputDescriptor
+! CHECK: fir.call @_FortranAioOutputDescriptor
+! CHECK: fir.call @_FortranAioEndIoStatement
! CHECK: return
! CHECK: }
! CHECK-LABEL: func @_QPss3(
! CHECK-SAME: %arg0: !fir.ref<i32> {fir.bindc_name = "n"}) {
-! CHECK-DAG: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
-! CHECK-DAG: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
-! CHECK-DAG: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK-DAG: %[[C_34_i32:[-0-9a-z_]+]] = arith.constant 34 : i32
-! CHECK-DAG: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
-! CHECK-DAG: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
-! CHECK-DAG: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK-DAG: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
-! CHECK-DAG: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_0:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[V_0:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_2:[0-9]+]] = arith.cmpi sgt, %[[V_1]], %[[C_0]] : index
-! CHECK: %[[V_3:[0-9]+]] = arith.select %[[V_2]], %[[V_1]], %[[C_0]] : index
-! CHECK: %[[V_4:[0-9]+]] = fir.alloca !fir.array<2x?xf32>, %[[V_3]] {bindc_name = "aa", uniq_name = "_QFss3Eaa"}
-! CHECK: %[[V_5:[0-9]+]] = fir.shape %[[C_2]], %[[V_3:[0-9]+]] : (index, index) -> !fir.shape<2>
-! CHECK: cf.br ^bb1(%[[C_0]], %[[V_3:[0-9]+]] : index, index)
-! CHECK: ^bb1(%[[V_6:[0-9]+]]: index, %[[V_7:[0-9]+]]: index): // 2 preds: ^bb0, ^bb4
-! CHECK: %[[V_8:[0-9]+]] = arith.cmpi sgt, %[[V_7]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_8]], ^bb2(%[[C_0]], %[[C_2]] : index, index), ^bb5
-! CHECK: ^bb2(%[[V_9:[0-9]+]]: index, %[[V_10:[0-9]+]]: index): // 2 preds: ^bb1, ^bb3
-! CHECK: %[[V_11:[0-9]+]] = arith.cmpi sgt, %[[V_10]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_11]], ^bb3, ^bb4
-! CHECK: ^bb3: // pred: ^bb2
-! CHECK: %[[V_12:[0-9]+]] = arith.addi %[[V_9]], %[[C_1]] : index
-! CHECK: %[[V_13:[0-9]+]] = arith.addi %[[V_6]], %[[C_1]] : index
-! CHECK: %[[V_14:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_12]], %[[V_13:[0-9]+]] : (!fir.ref<!fir.array<2x?xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: fir.store %[[C_st_0]] to %[[V_14:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_15:[0-9]+]] = arith.subi %[[V_10]], %[[C_1]] : index
-! CHECK: cf.br ^bb2(%[[V_12]], %[[V_15:[0-9]+]] : index, index)
-! CHECK: ^bb4: // pred: ^bb2
-! CHECK: %[[V_16:[0-9]+]] = arith.addi %[[V_6]], %[[C_1]] : index
-! CHECK: %[[V_17:[0-9]+]] = arith.subi %[[V_7]], %[[C_1]] : index
-! CHECK: cf.br ^bb1(%[[V_16]], %[[V_17:[0-9]+]] : index, index)
-! CHECK: ^bb5: // pred: ^bb1
-! CHECK: %[[V_18:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_19:[0-9]+]] = fir.convert %[[V_18:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_20:[0-9]+]] = arith.addi %[[V_19]], %[[C_m1]] : index
-! CHECK: %[[V_21:[0-9]+]] = arith.cmpi sgt, %[[V_20]], %[[C_0]] : index
-! CHECK: %[[V_22:[0-9]+]] = arith.select %[[V_21]], %[[V_20]], %[[C_0]] : index
-! CHECK: %[[V_23:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]], %[[C_2]], %[[V_19]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[V_24:[0-9]+]] = fir.allocmem !fir.array<2x?xf32>, %[[V_3]]
-! CHECK: cf.br ^bb6(%[[C_0]], %[[V_3:[0-9]+]] : index, index)
-! CHECK: ^bb6(%[[V_25:[0-9]+]]: index, %[[V_26:[0-9]+]]: index): // 2 preds: ^bb5, ^bb9
-! CHECK: %[[V_27:[0-9]+]] = arith.cmpi sgt, %[[V_26]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_27]], ^bb7(%[[C_0]], %[[C_2]] : index, index), ^bb10
-! CHECK: ^bb7(%[[V_28:[0-9]+]]: index, %[[V_29:[0-9]+]]: index): // 2 preds: ^bb6, ^bb8
-! CHECK: %[[V_30:[0-9]+]] = arith.cmpi sgt, %[[V_29]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_30]], ^bb8, ^bb9
-! CHECK: ^bb8: // pred: ^bb7
-! CHECK: %[[V_31:[0-9]+]] = arith.addi %[[V_28]], %[[C_1]] : index
-! CHECK: %[[V_32:[0-9]+]] = arith.addi %[[V_25]], %[[C_1]] : index
-! CHECK: %[[V_33:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_31]], %[[V_32:[0-9]+]] : (!fir.ref<!fir.array<2x?xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_34:[0-9]+]] = fir.array_coor %[[V_24]](%[[V_5]]) %[[V_31]], %[[V_32:[0-9]+]] : (!fir.heap<!fir.array<2x?xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_35:[0-9]+]] = fir.load %[[V_33:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.store %[[V_35]] to %[[V_34:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_36:[0-9]+]] = arith.subi %[[V_29]], %[[C_1]] : index
-! CHECK: cf.br ^bb7(%[[V_31]], %[[V_36:[0-9]+]] : index, index)
-! CHECK: ^bb9: // pred: ^bb7
-! CHECK: %[[V_37:[0-9]+]] = arith.addi %[[V_25]], %[[C_1]] : index
-! CHECK: %[[V_38:[0-9]+]] = arith.subi %[[V_26]], %[[C_1]] : index
-! CHECK: cf.br ^bb6(%[[V_37]], %[[V_38:[0-9]+]] : index, index)
-! CHECK: ^bb10: // pred: ^bb6
-! CHECK: %[[V_39:[0-9]+]] = arith.subi %[[V_18]], %[[C_1_i32]] : i32
-! CHECK: %[[V_40:[0-9]+]] = fir.convert %[[V_39:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_41:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]], %[[C_1]], %[[V_40]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: cf.br ^bb11(%[[C_0]], %[[V_22:[0-9]+]] : index, index)
-! CHECK: ^bb11(%[[V_42:[0-9]+]]: index, %[[V_43:[0-9]+]]: index): // 2 preds: ^bb10, ^bb14
-! CHECK: %[[V_44:[0-9]+]] = arith.cmpi sgt, %[[V_43]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_44]], ^bb12(%[[C_0]], %[[C_2]] : index, index), ^bb15(%[[C_0]], %[[V_3:[0-9]+]] : index, index)
-! CHECK: ^bb12(%[[V_45:[0-9]+]]: index, %[[V_46:[0-9]+]]: index): // 2 preds: ^bb11, ^bb13
-! CHECK: %[[V_47:[0-9]+]] = arith.cmpi sgt, %[[V_46]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_47]], ^bb13, ^bb14
-! CHECK: ^bb13: // pred: ^bb12
-! CHECK: %[[V_48:[0-9]+]] = arith.addi %[[V_45]], %[[C_1]] : index
-! CHECK: %[[V_49:[0-9]+]] = arith.addi %[[V_42]], %[[C_1]] : index
-! CHECK: %[[V_50:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) [%[[V_41]]] %[[V_48]], %[[V_49:[0-9]+]] : (!fir.ref<!fir.array<2x?xf32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_51:[0-9]+]] = fir.load %[[V_50:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_52:[0-9]+]] = arith.addf %[[V_51]], %[[C_st]] fastmath<contract> : f32
-! CHECK: %[[V_53:[0-9]+]] = fir.array_coor %[[V_24]](%[[V_5]]) [%[[V_23]]] %[[V_48]], %[[V_49:[0-9]+]] : (!fir.heap<!fir.array<2x?xf32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<f32>
-! CHECK: fir.store %[[V_52]] to %[[V_53:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_54:[0-9]+]] = arith.subi %[[V_46]], %[[C_1]] : index
-! CHECK: cf.br ^bb12(%[[V_48]], %[[V_54:[0-9]+]] : index, index)
-! CHECK: ^bb14: // pred: ^bb12
-! CHECK: %[[V_55:[0-9]+]] = arith.addi %[[V_42]], %[[C_1]] : index
-! CHECK: %[[V_56:[0-9]+]] = arith.subi %[[V_43]], %[[C_1]] : index
-! CHECK: cf.br ^bb11(%[[V_55]], %[[V_56:[0-9]+]] : index, index)
-! CHECK: ^bb15(%[[V_57:[0-9]+]]: index, %[[V_58:[0-9]+]]: index): // 2 preds: ^bb11, ^bb18
-! CHECK: %[[V_59:[0-9]+]] = arith.cmpi sgt, %[[V_58]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_59]], ^bb16(%[[C_0]], %[[C_2]] : index, index), ^bb19
-! CHECK: ^bb16(%[[V_60:[0-9]+]]: index, %[[V_61:[0-9]+]]: index): // 2 preds: ^bb15, ^bb17
-! CHECK: %[[V_62:[0-9]+]] = arith.cmpi sgt, %[[V_61]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_62]], ^bb17, ^bb18
-! CHECK: ^bb17: // pred: ^bb16
-! CHECK: %[[V_63:[0-9]+]] = arith.addi %[[V_60]], %[[C_1]] : index
-! CHECK: %[[V_64:[0-9]+]] = arith.addi %[[V_57]], %[[C_1]] : index
-! CHECK: %[[V_65:[0-9]+]] = fir.array_coor %[[V_24]](%[[V_5]]) %[[V_63]], %[[V_64:[0-9]+]] : (!fir.heap<!fir.array<2x?xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_66:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_63]], %[[V_64:[0-9]+]] : (!fir.ref<!fir.array<2x?xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_67:[0-9]+]] = fir.load %[[V_65:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.store %[[V_67]] to %[[V_66:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_68:[0-9]+]] = arith.subi %[[V_61]], %[[C_1]] : index
-! CHECK: cf.br ^bb16(%[[V_63]], %[[V_68:[0-9]+]] : index, index)
-! CHECK: ^bb18: // pred: ^bb16
-! CHECK: %[[V_69:[0-9]+]] = arith.addi %[[V_57]], %[[C_1]] : index
-! CHECK: %[[V_70:[0-9]+]] = arith.subi %[[V_58]], %[[C_1]] : index
-! CHECK: cf.br ^bb15(%[[V_69]], %[[V_70:[0-9]+]] : index, index)
-! CHECK: ^bb19: // pred: ^bb15
-! CHECK: fir.freemem %[[V_24:[0-9]+]] : !fir.heap<!fir.array<2x?xf32>>
-! CHECK: %[[V_73:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_6_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
-! CHECK: %[[V_74:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]], %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[V_75:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_74]]] : (!fir.ref<!fir.array<2x?xf32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.box<!fir.array<?x2xf32>>
-! CHECK: %[[V_76:[0-9]+]] = fir.convert %[[V_75:[0-9]+]] : (!fir.box<!fir.array<?x2xf32>>) -> !fir.box<none>
-! CHECK: %[[V_77:[0-9]+]] = fir.call @_FortranAioOutputDescriptor(%[[V_73]], %[[V_76]]) fastmath<contract> {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1
-! CHECK: %[[V_78:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_79:[0-9]+]] = arith.subi %[[V_78]], %[[C_1_i32]] : i32
-! CHECK: %[[V_80:[0-9]+]] = fir.convert %[[V_79:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_81:[0-9]+]] = fir.convert %[[V_78:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_82:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]], %[[V_80]], %[[V_81]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[V_83:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_82]]] : (!fir.ref<!fir.array<2x?xf32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.box<!fir.array<?x?xf32>>
-! CHECK: %[[V_84:[0-9]+]] = fir.convert %[[V_83:[0-9]+]] : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
-! CHECK: %[[V_85:[0-9]+]] = fir.call @_FortranAioOutputDescriptor(%[[V_73]], %[[V_84]]) fastmath<contract> {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1
-! CHECK: %[[V_86:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_73]]) fastmath<contract> {{.*}}: (!fir.ref<i8>) -> i32
+! CHECK: %[[aa:[0-9]+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFss3Eaa"}
+! CHECK: hlfir.assign %{{.*}} to %[[aa]]#0
+! CHECK: %[[slice1:.*]] = hlfir.designate %[[aa]]#0 (%c1{{.*}}:%{{.*}}:%c1{{.*}}, %c1{{.*}}:%{{.*}}:%c1{{.*}})
+! CHECK: %[[res:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<2>) -> !hlfir.expr<2x?xf32> {
+! CHECK: hlfir.designate %[[slice1]]
+! CHECK: fir.load
+! CHECK: arith.addf
+! CHECK: hlfir.yield_element
+! CHECK: }
+! CHECK: %[[slice2:.*]] = hlfir.designate %[[aa]]#0 (%c1{{.*}}:%{{.*}}:%c1{{.*}}, %c2{{.*}}:%{{.*}}:%c1{{.*}})
+! CHECK: hlfir.assign %[[res]] to %[[slice2]]
+! CHECK: hlfir.destroy %[[res]]
+! CHECK: fir.call @_FortranAioBeginExternalListOutput
+! CHECK: fir.call @_FortranAioOutputDescriptor
+! CHECK: fir.call @_FortranAioOutputDescriptor
+! CHECK: fir.call @_FortranAioEndIoStatement
! CHECK: return
! CHECK: }
! CHECK-LABEL: func @_QPss4(
! CHECK-SAME: %arg0: !fir.ref<i32> {fir.bindc_name = "n"}) {
-! CHECK-DAG: %[[C_2:[-0-9a-z_]+]] = arith.constant 2 : index
-! CHECK-DAG: %[[C_m1:[-0-9a-z_]+]] = arith.constant -1 : index
-! CHECK-DAG: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK-DAG: %[[C_41_i32:[-0-9a-z_]+]] = arith.constant 41 : i32
-! CHECK-DAG: %[[C_6_i32:[-0-9a-z_]+]] = arith.constant 6 : i32
-! CHECK-DAG: %[[C_st:[-0-9a-z_]+]] = arith.constant 7.000000e+00 : f32
-! CHECK-DAG: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK-DAG: %[[C_st_0:[-0-9a-z_]+]] = arith.constant -2.000000e+00 : f32
-! CHECK-DAG: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_0:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[V_0:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_2:[0-9]+]] = arith.cmpi sgt, %[[V_1]], %[[C_0]] : index
-! CHECK: %[[V_3:[0-9]+]] = arith.select %[[V_2]], %[[V_1]], %[[C_0]] : index
-! CHECK: %[[V_4:[0-9]+]] = fir.alloca !fir.array<?x2xf32>, %[[V_3]] {bindc_name = "aa", uniq_name = "_QFss4Eaa"}
-! CHECK: %[[V_5:[0-9]+]] = fir.shape %[[V_3]], %[[C_2]] : (index, index) -> !fir.shape<2>
-! CHECK: cf.br ^bb1(%[[C_0]], %[[C_2]] : index, index)
-! CHECK: ^bb1(%[[V_6:[0-9]+]]: index, %[[V_7:[0-9]+]]: index): // 2 preds: ^bb0, ^bb4
-! CHECK: %[[V_8:[0-9]+]] = arith.cmpi sgt, %[[V_7]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_8]], ^bb2(%[[C_0]], %[[V_3:[0-9]+]] : index, index), ^bb5
-! CHECK: ^bb2(%[[V_9:[0-9]+]]: index, %[[V_10:[0-9]+]]: index): // 2 preds: ^bb1, ^bb3
-! CHECK: %[[V_11:[0-9]+]] = arith.cmpi sgt, %[[V_10]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_11]], ^bb3, ^bb4
-! CHECK: ^bb3: // pred: ^bb2
-! CHECK: %[[V_12:[0-9]+]] = arith.addi %[[V_9]], %[[C_1]] : index
-! CHECK: %[[V_13:[0-9]+]] = arith.addi %[[V_6]], %[[C_1]] : index
-! CHECK: %[[V_14:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_12]], %[[V_13:[0-9]+]] : (!fir.ref<!fir.array<?x2xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: fir.store %[[C_st_0]] to %[[V_14:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_15:[0-9]+]] = arith.subi %[[V_10]], %[[C_1]] : index
-! CHECK: cf.br ^bb2(%[[V_12]], %[[V_15:[0-9]+]] : index, index)
-! CHECK: ^bb4: // pred: ^bb2
-! CHECK: %[[V_16:[0-9]+]] = arith.addi %[[V_6]], %[[C_1]] : index
-! CHECK: %[[V_17:[0-9]+]] = arith.subi %[[V_7]], %[[C_1]] : index
-! CHECK: cf.br ^bb1(%[[V_16]], %[[V_17:[0-9]+]] : index, index)
-! CHECK: ^bb5: // pred: ^bb1
-! CHECK: %[[V_18:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_19:[0-9]+]] = fir.convert %[[V_18:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_20:[0-9]+]] = arith.addi %[[V_19]], %[[C_m1]] : index
-! CHECK: %[[V_21:[0-9]+]] = arith.cmpi sgt, %[[V_20]], %[[C_0]] : index
-! CHECK: %[[V_22:[0-9]+]] = arith.select %[[V_21]], %[[V_20]], %[[C_0]] : index
-! CHECK: %[[V_23:[0-9]+]] = fir.slice %[[C_2]], %[[V_19]], %[[C_1]], %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[V_24:[0-9]+]] = fir.allocmem !fir.array<?x2xf32>, %[[V_3]]
-! CHECK: cf.br ^bb6(%[[C_0]], %[[C_2]] : index, index)
-! CHECK: ^bb6(%[[V_25:[0-9]+]]: index, %[[V_26:[0-9]+]]: index): // 2 preds: ^bb5, ^bb9
-! CHECK: %[[V_27:[0-9]+]] = arith.cmpi sgt, %[[V_26]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_27]], ^bb7(%[[C_0]], %[[V_3:[0-9]+]] : index, index), ^bb10
-! CHECK: ^bb7(%[[V_28:[0-9]+]]: index, %[[V_29:[0-9]+]]: index): // 2 preds: ^bb6, ^bb8
-! CHECK: %[[V_30:[0-9]+]] = arith.cmpi sgt, %[[V_29]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_30]], ^bb8, ^bb9
-! CHECK: ^bb8: // pred: ^bb7
-! CHECK: %[[V_31:[0-9]+]] = arith.addi %[[V_28]], %[[C_1]] : index
-! CHECK: %[[V_32:[0-9]+]] = arith.addi %[[V_25]], %[[C_1]] : index
-! CHECK: %[[V_33:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_31]], %[[V_32:[0-9]+]] : (!fir.ref<!fir.array<?x2xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_34:[0-9]+]] = fir.array_coor %[[V_24]](%[[V_5]]) %[[V_31]], %[[V_32:[0-9]+]] : (!fir.heap<!fir.array<?x2xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_35:[0-9]+]] = fir.load %[[V_33:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.store %[[V_35]] to %[[V_34:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_36:[0-9]+]] = arith.subi %[[V_29]], %[[C_1]] : index
-! CHECK: cf.br ^bb7(%[[V_31]], %[[V_36:[0-9]+]] : index, index)
-! CHECK: ^bb9: // pred: ^bb7
-! CHECK: %[[V_37:[0-9]+]] = arith.addi %[[V_25]], %[[C_1]] : index
-! CHECK: %[[V_38:[0-9]+]] = arith.subi %[[V_26]], %[[C_1]] : index
-! CHECK: cf.br ^bb6(%[[V_37]], %[[V_38:[0-9]+]] : index, index)
-! CHECK: ^bb10: // pred: ^bb6
-! CHECK: %[[V_39:[0-9]+]] = arith.subi %[[V_18]], %[[C_1_i32]] : i32
-! CHECK: %[[V_40:[0-9]+]] = fir.convert %[[V_39:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_41:[0-9]+]] = fir.slice %[[C_1]], %[[V_40]], %[[C_1]], %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: cf.br ^bb11(%[[C_0]], %[[C_2]] : index, index)
-! CHECK: ^bb11(%[[V_42:[0-9]+]]: index, %[[V_43:[0-9]+]]: index): // 2 preds: ^bb10, ^bb14
-! CHECK: %[[V_44:[0-9]+]] = arith.cmpi sgt, %[[V_43]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_44]], ^bb12(%[[C_0]], %[[V_22:[0-9]+]] : index, index), ^bb15(%[[C_0]], %[[C_2]] : index, index)
-! CHECK: ^bb12(%[[V_45:[0-9]+]]: index, %[[V_46:[0-9]+]]: index): // 2 preds: ^bb11, ^bb13
-! CHECK: %[[V_47:[0-9]+]] = arith.cmpi sgt, %[[V_46]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_47]], ^bb13, ^bb14
-! CHECK: ^bb13: // pred: ^bb12
-! CHECK: %[[V_48:[0-9]+]] = arith.addi %[[V_45]], %[[C_1]] : index
-! CHECK: %[[V_49:[0-9]+]] = arith.addi %[[V_42]], %[[C_1]] : index
-! CHECK: %[[V_50:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) [%[[V_41]]] %[[V_48]], %[[V_49:[0-9]+]] : (!fir.ref<!fir.array<?x2xf32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_51:[0-9]+]] = fir.load %[[V_50:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_52:[0-9]+]] = arith.addf %[[V_51]], %[[C_st]] fastmath<contract> : f32
-! CHECK: %[[V_53:[0-9]+]] = fir.array_coor %[[V_24]](%[[V_5]]) [%[[V_23]]] %[[V_48]], %[[V_49:[0-9]+]] : (!fir.heap<!fir.array<?x2xf32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<f32>
-! CHECK: fir.store %[[V_52]] to %[[V_53:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_54:[0-9]+]] = arith.subi %[[V_46]], %[[C_1]] : index
-! CHECK: cf.br ^bb12(%[[V_48]], %[[V_54:[0-9]+]] : index, index)
-! CHECK: ^bb14: // pred: ^bb12
-! CHECK: %[[V_55:[0-9]+]] = arith.addi %[[V_42]], %[[C_1]] : index
-! CHECK: %[[V_56:[0-9]+]] = arith.subi %[[V_43]], %[[C_1]] : index
-! CHECK: cf.br ^bb11(%[[V_55]], %[[V_56:[0-9]+]] : index, index)
-! CHECK: ^bb15(%[[V_57:[0-9]+]]: index, %[[V_58:[0-9]+]]: index): // 2 preds: ^bb11, ^bb18
-! CHECK: %[[V_59:[0-9]+]] = arith.cmpi sgt, %[[V_58]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_59]], ^bb16(%[[C_0]], %[[V_3:[0-9]+]] : index, index), ^bb19
-! CHECK: ^bb16(%[[V_60:[0-9]+]]: index, %[[V_61:[0-9]+]]: index): // 2 preds: ^bb15, ^bb17
-! CHECK: %[[V_62:[0-9]+]] = arith.cmpi sgt, %[[V_61]], %[[C_0]] : index
-! CHECK: cf.cond_br %[[V_62]], ^bb17, ^bb18
-! CHECK: ^bb17: // pred: ^bb16
-! CHECK: %[[V_63:[0-9]+]] = arith.addi %[[V_60]], %[[C_1]] : index
-! CHECK: %[[V_64:[0-9]+]] = arith.addi %[[V_57]], %[[C_1]] : index
-! CHECK: %[[V_65:[0-9]+]] = fir.array_coor %[[V_24]](%[[V_5]]) %[[V_63]], %[[V_64:[0-9]+]] : (!fir.heap<!fir.array<?x2xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_66:[0-9]+]] = fir.array_coor %[[V_4]](%[[V_5]]) %[[V_63]], %[[V_64:[0-9]+]] : (!fir.ref<!fir.array<?x2xf32>>, !fir.shape<2>, index, index) -> !fir.ref<f32>
-! CHECK: %[[V_67:[0-9]+]] = fir.load %[[V_65:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.store %[[V_67]] to %[[V_66:[0-9]+]] : !fir.ref<f32>
-! CHECK: %[[V_68:[0-9]+]] = arith.subi %[[V_61]], %[[C_1]] : index
-! CHECK: cf.br ^bb16(%[[V_63]], %[[V_68:[0-9]+]] : index, index)
-! CHECK: ^bb18: // pred: ^bb16
-! CHECK: %[[V_69:[0-9]+]] = arith.addi %[[V_57]], %[[C_1]] : index
-! CHECK: %[[V_70:[0-9]+]] = arith.subi %[[V_58]], %[[C_1]] : index
-! CHECK: cf.br ^bb15(%[[V_69]], %[[V_70:[0-9]+]] : index, index)
-! CHECK: ^bb19: // pred: ^bb15
-! CHECK: fir.freemem %[[V_24:[0-9]+]] : !fir.heap<!fir.array<?x2xf32>>
-! CHECK: %[[V_73:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput(%[[C_6_i32]], %{{.*}}, %{{.*}}) {{.*}}: (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
-! CHECK: %[[V_74:[0-9]+]] = fir.slice %[[C_1]], %[[C_2]], %[[C_1]], %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[V_75:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_74]]] : (!fir.ref<!fir.array<?x2xf32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.box<!fir.array<2x?xf32>>
-! CHECK: %[[V_76:[0-9]+]] = fir.convert %[[V_75:[0-9]+]] : (!fir.box<!fir.array<2x?xf32>>) -> !fir.box<none>
-! CHECK: %[[V_77:[0-9]+]] = fir.call @_FortranAioOutputDescriptor(%[[V_73]], %[[V_76]]) fastmath<contract> {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1
-! CHECK: %[[V_78:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-! CHECK: %[[V_79:[0-9]+]] = arith.subi %[[V_78]], %[[C_1_i32]] : i32
-! CHECK: %[[V_80:[0-9]+]] = fir.convert %[[V_79:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_81:[0-9]+]] = fir.convert %[[V_78:[0-9]+]] : (i32) -> index
-! CHECK: %[[V_82:[0-9]+]] = fir.slice %[[V_80]], %[[V_81]], %[[C_1]], %[[C_1]], %[[C_2]], %[[C_1]] : (index, index, index, index, index, index) -> !fir.slice<2>
-! CHECK: %[[V_83:[0-9]+]] = fir.embox %[[V_4]](%[[V_5]]) [%[[V_82]]] : (!fir.ref<!fir.array<?x2xf32>>, !fir.shape<2>, !fir.slice<2>) -> !fir.box<!fir.array<?x?xf32>>
-! CHECK: %[[V_84:[0-9]+]] = fir.convert %[[V_83:[0-9]+]] : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<none>
-! CHECK: %[[V_85:[0-9]+]] = fir.call @_FortranAioOutputDescriptor(%[[V_73]], %[[V_84]]) fastmath<contract> {{.*}}: (!fir.ref<i8>, !fir.box<none>) -> i1
-! CHECK: %[[V_86:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_73]]) fastmath<contract> {{.*}}: (!fir.ref<i8>) -> i32
+! CHECK: %[[aa:[0-9]+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFss4Eaa"}
+! CHECK: hlfir.assign %{{.*}} to %[[aa]]#0
+! CHECK: %[[slice1:.*]] = hlfir.designate %[[aa]]#0 (%c1{{.*}}:%{{.*}}:%c1{{.*}}, %c1{{.*}}:%{{.*}}:%c1{{.*}})
+! CHECK: %[[res:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<2>) -> !hlfir.expr<?x2xf32> {
+! CHECK: hlfir.designate %[[slice1]]
+! CHECK: fir.load
+! CHECK: arith.addf
+! CHECK: hlfir.yield_element
+! CHECK: }
+! CHECK: %[[slice2:.*]] = hlfir.designate %[[aa]]#0 (%c2{{.*}}:%{{.*}}:%c1{{.*}}, %c1{{.*}}:%{{.*}}:%c1{{.*}})
+! CHECK: hlfir.assign %[[res]] to %[[slice2]]
+! CHECK: hlfir.destroy %[[res]]
+! CHECK: fir.call @_FortranAioBeginExternalListOutput
+! CHECK: fir.call @_FortranAioOutputDescriptor
+! CHECK: fir.call @_FortranAioOutputDescriptor
+! CHECK: fir.call @_FortranAioEndIoStatement
! CHECK: return
! CHECK: }
! CHECK-LABEL: func @_QPtt1
subroutine tt1
! CHECK: fir.call @_FortranAioBeginExternalListOutput
- ! CHECK: %[[temp3:[0-9]+]] = fir.allocmem !fir.array<3xf32>
- ! CHECK: br ^bb1(%[[temp3]]
- ! CHECK-NEXT: ^bb1(%[[temp3arg:[0-9]+]]: !fir.heap<!fir.array<3xf32>>
- ! CHECK: %[[temp1:[0-9]+]] = fir.allocmem !fir.array<1xf32>
- ! CHECK: fir.call @_QFtt1Pr
- ! CHECK: fir.call @realloc
- ! CHECK: fir.freemem %[[temp1]] : !fir.heap<!fir.array<1xf32>>
- ! CHECK: %[[temp3x:[0-9]+]] = fir.allocmem !fir.array<3xf32>
+ ! CHECK: %[[temp:.*]] = fir.allocmem !fir.array<3xf32>
+ ! CHECK: %[[temp_decl:.*]]:2 = hlfir.declare %[[temp]]
+ ! CHECK: fir.do_loop %[[arg:.*]] =
+ ! CHECK: %[[const:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro.1xr4.0"}
+ ! CHECK: %[[expr:.*]] = hlfir.as_expr %[[const]]#0
+ ! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[expr]]
+ ! CHECK: %[[box:.*]] = fir.embox %[[assoc]]#0
+ ! CHECK: %[[conv:.*]] = fir.convert %[[box]]
+ ! CHECK: %[[res:.*]] = fir.call @_QFtt1Pr(%[[conv]])
+ ! CHECK: %[[elem:.*]] = hlfir.designate %[[temp_decl]]#0 (%{{.*}})
+ ! CHECK: hlfir.assign %[[res]] to %[[elem]]
+ ! CHECK: hlfir.end_associate %[[assoc]]#1, %[[assoc]]#2
+ ! CHECK: }
+ ! CHECK: %[[expr2:.*]] = hlfir.as_expr %[[temp_decl]]#0
+ ! CHECK: %[[assoc2:.*]]:3 = hlfir.associate %[[expr2]]
! CHECK: fir.call @_FortranAioOutputDescriptor
- ! CHECK-NEXT: fir.freemem %[[temp3x]] : !fir.heap<!fir.array<3xf32>>
- ! CHECK-NEXT: fir.freemem %[[temp3arg]] : !fir.heap<!fir.array<3xf32>>
- ! CHECK-NEXT: fir.call @_FortranAioEndIoStatement
+ ! CHECK: hlfir.end_associate %[[assoc2]]#1, %[[assoc2]]#2
+ ! CHECK: hlfir.destroy %[[expr2]]
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print*, [(r([7.0]),i=1,3)]
contains
! CHECK-LABEL: func private @_QFtt1Pr
diff --git a/flang/test/Lower/array-user-def-assignments.f90 b/flang/test/Lower/array-user-def-assignments.f90
index e88bc2fb861ba..6e859e4f4fed3 100644
--- a/flang/test/Lower/array-user-def-assignments.f90
+++ b/flang/test/Lower/array-user-def-assignments.f90
@@ -1,5 +1,5 @@
! Test lower of elemental user defined assignments
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
module defined_assignments
type t
@@ -27,137 +27,64 @@ elemental subroutine assign_real_to_logical(a,b)
end module
! CHECK-LABEL: func @_QPtest_derived(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>> {fir.bindc_name = "x"}) {
-! CHECK: %[[C_100:[-0-9a-z_]+]] = arith.constant 100 : index
-! CHECK: %[[V_0:[0-9]+]] = fir.shape %[[C_100]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_1:[0-9]+]] = fir.array_load %arg0(%[[V_0]]) : (!fir.ref<!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>>, !fir.shape<1>) -> !fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>
-! CHECK: %[[C_100_i64:[-0-9a-z_]+]] = arith.constant 100 : i64
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_100_i64]] : (i64) -> index
-! CHECK: %[[C_m1_i64:[-0-9a-z_]+]] = arith.constant -1 : i64
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_m1_i64]] : (i64) -> index
-! CHECK: %[[C_1_i64:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_4:[0-9]+]] = fir.convert %[[C_1_i64]] : (i64) -> index
-! CHECK: %[[V_5:[0-9]+]] = fir.shape %[[C_100]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_6:[0-9]+]] = fir.slice %[[V_2]], %[[V_4]], %[[V_3:[0-9]+]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[V_7:[0-9]+]] = fir.array_load %arg0(%[[V_5]]) [%[[V_6]]] : (!fir.ref<!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_8:[0-9]+]] = arith.subi %[[C_100]], %[[C_1]] : index
-! CHECK: %[[V_9:[0-9]+]] = fir.do_loop %arg1 = %[[C_0]] to %[[V_8]] step %[[C_1]] unordered iter_args(%arg2 = %[[V_1]]) -> (!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>) {
-! CHECK: %[[V_10:[0-9]+]] = fir.array_access %[[V_7]], %arg1 : (!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>, index) -> !fir.ref<!fir.type<_QMdefined_assignmentsTt{i:i32}>>
-! CHECK: %[[V_11:[0-9]+]] = fir.no_reassoc %[[V_10:[0-9]+]] : !fir.ref<!fir.type<_QMdefined_assignmentsTt{i:i32}>>
-! CHECK: %[[V_12:[0-9]+]]:2 = fir.array_modify %arg2, %arg1 : (!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>, index) -> (!fir.ref<!fir.type<_QMdefined_assignmentsTt{i:i32}>>, !fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>)
-! CHECK: fir.call @_QPassign_t(%[[V_12]]#0, %[[V_11]]) fastmath<contract> : (!fir.ref<!fir.type<_QMdefined_assignmentsTt{i:i32}>>, !fir.ref<!fir.type<_QMdefined_assignmentsTt{i:i32}>>) -> ()
-! CHECK: fir.result %[[V_12]]#1 : !fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>> {fir.bindc_name = "x"}) {
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: hlfir.region_assign {
+! CHECK: %[[slice:.*]] = hlfir.designate %[[x]]#0 ({{.*}})
+! CHECK: hlfir.yield %[[slice]]
+! CHECK: } to {
+! CHECK: hlfir.yield %[[x]]#0
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.ref<!fir.type<_QMdefined_assignmentsTt{i:i32}>>) to (%[[lhs:.*]]: !fir.ref<!fir.type<_QMdefined_assignmentsTt{i:i32}>>) {
+! CHECK: fir.call @_QPassign_t(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_1]], %[[V_9]] to %arg0 : !fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>, !fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>, !fir.ref<!fir.array<100x!fir.type<_QMdefined_assignmentsTt{i:i32}>>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPtest_intrinsic(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "x"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca !fir.logical<4>
-! CHECK: %[[C_100:[-0-9a-z_]+]] = arith.constant 100 : index
-! CHECK: %[[V_1:[0-9]+]] = fir.shape %[[C_100]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_2:[0-9]+]] = fir.array_load %arg0(%[[V_1]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32>
-! CHECK: %[[C_100_i64:[-0-9a-z_]+]] = arith.constant 100 : i64
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_100_i64]] : (i64) -> index
-! CHECK: %[[C_m1_i64:[-0-9a-z_]+]] = arith.constant -1 : i64
-! CHECK: %[[V_4:[0-9]+]] = fir.convert %[[C_m1_i64]] : (i64) -> index
-! CHECK: %[[C_1_i64:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_5:[0-9]+]] = fir.convert %[[C_1_i64]] : (i64) -> index
-! CHECK: %[[V_6:[0-9]+]] = fir.shape %[[C_100]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_7:[0-9]+]] = fir.slice %[[V_3]], %[[V_5]], %[[V_4:[0-9]+]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[V_8:[0-9]+]] = fir.array_load %arg0(%[[V_6]]) [%[[V_7]]] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<100xf32>
-! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 0.000000e+00 : f32
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_9:[0-9]+]] = arith.subi %[[C_100]], %[[C_1]] : index
-! CHECK: %[[V_10:[0-9]+]] = fir.do_loop %arg1 = %[[C_0]] to %[[V_9]] step %[[C_1]] unordered iter_args(%arg2 = %[[V_2]]) -> (!fir.array<100xf32>) {
-! CHECK: %[[V_11:[0-9]+]] = fir.array_fetch %[[V_8]], %arg1 : (!fir.array<100xf32>, index) -> f32
-! CHECK: %[[V_12:[0-9]+]] = arith.cmpf olt, %[[V_11]], %[[C_st]] {{.*}} : f32
-! CHECK: %[[V_13:[0-9]+]]:2 = fir.array_modify %arg2, %arg1 : (!fir.array<100xf32>, index) -> (!fir.ref<f32>, !fir.array<100xf32>)
-! CHECK: %[[V_14:[0-9]+]] = fir.convert %[[V_12:[0-9]+]] : (i1) -> !fir.logical<4>
-! CHECK: fir.store %[[V_14]] to %[[V_0:[0-9]+]] : !fir.ref<!fir.logical<4>>
-! CHECK: fir.call @_QPassign_logical_to_real(%[[V_13]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<f32>, !fir.ref<!fir.logical<4>>) -> ()
-! CHECK: fir.result %[[V_13]]#1 : !fir.array<100xf32>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "x"}) {
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield %{{.*}} : !hlfir.expr<100x!fir.logical<4>>
+! CHECK: } to {
+! CHECK: hlfir.yield %[[x]]#0
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.logical<4>) to (%[[lhs:.*]]: !fir.ref<f32>) {
+! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[rhs]]
+! CHECK: fir.call @_QPassign_logical_to_real(%[[lhs]], %[[assoc]]#0)
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_2]], %[[V_10]] to %arg0 : !fir.array<100xf32>, !fir.array<100xf32>, !fir.ref<!fir.array<100xf32>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPtest_intrinsic_2(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "y"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca f32
-! CHECK: %[[C_100:[-0-9a-z_]+]] = arith.constant 100 : index
-! CHECK: %[[C_100_0:[-0-9a-z_]+]] = arith.constant 100 : index
-! CHECK: %[[V_1:[0-9]+]] = fir.shape %[[C_100]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_2:[0-9]+]] = fir.array_load %arg0(%[[V_1]]) : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<100x!fir.logical<4>>
-! CHECK: %[[V_3:[0-9]+]] = fir.shape %[[C_100_0]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_4:[0-9]+]] = fir.array_load %arg1(%[[V_3]]) : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> !fir.array<100xf32>
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_5:[0-9]+]] = arith.subi %[[C_100]], %[[C_1]] : index
-! CHECK: %[[V_6:[0-9]+]] = fir.do_loop %arg2 = %[[C_0]] to %[[V_5]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_2]]) -> (!fir.array<100x!fir.logical<4>>) {
-! CHECK: %[[V_7:[0-9]+]] = fir.array_fetch %[[V_4]], %arg2 : (!fir.array<100xf32>, index) -> f32
-! CHECK: %[[V_8:[0-9]+]] = fir.no_reassoc %[[V_7:[0-9]+]] : f32
-! CHECK: %[[V_9:[0-9]+]]:2 = fir.array_modify %arg3, %arg2 : (!fir.array<100x!fir.logical<4>>, index) -> (!fir.ref<!fir.logical<4>>, !fir.array<100x!fir.logical<4>>)
-! CHECK: fir.store %[[V_8]] to %[[V_0:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.call @_QPassign_real_to_logical(%[[V_9]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<!fir.logical<4>>, !fir.ref<f32>) -> ()
-! CHECK: fir.result %[[V_9]]#1 : !fir.array<100x!fir.logical<4>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "y"}) {
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield %[[y]]#0
+! CHECK: } to {
+! CHECK: hlfir.yield %[[x]]#0
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.ref<f32>) to (%[[lhs:.*]]: !fir.ref<!fir.logical<4>>) {
+! CHECK: fir.call @_QPassign_real_to_logical(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_2]], %[[V_6]] to %arg0 : !fir.array<100x!fir.logical<4>>, !fir.array<100x!fir.logical<4>>, !fir.ref<!fir.array<100x!fir.logical<4>>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPfrom_char(
-! CHECK-SAME: %arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i"}, %arg1: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_0:[0-9]+]]:3 = fir.box_dims %arg0, %[[C_0]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
-! CHECK: %[[V_1:[0-9]+]] = fir.array_load %arg0 : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK: %[[V_2:[0-9]+]] = fir.array_load %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.array<?x!fir.char<1,?>>
-! CHECK: %[[V_3:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = arith.divsi %[[V_3]], %[[C_1]] : index
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0_1:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_5:[0-9]+]] = arith.subi %[[V_0]]#1, %[[C_1_0]] : index
-! CHECK: %[[V_6:[0-9]+]] = fir.do_loop %arg2 = %[[C_0_1]] to %[[V_5]] step %[[C_1_0]] unordered iter_args(%arg3 = %[[V_1]]) -> (!fir.array<?xi32>) {
-! CHECK: %[[V_7:[0-9]+]] = fir.array_access %[[V_2]], %arg2 typeparams %[[V_4:[0-9]+]] : (!fir.array<?x!fir.char<1,?>>, index, index) -> !fir.ref<!fir.char<1,?>>
-! CHECK: %[[V_8:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index
-! CHECK: %[[V_9:[0-9]+]] = fir.no_reassoc %[[V_7:[0-9]+]] : !fir.ref<!fir.char<1,?>>
-! CHECK: %[[V_10:[0-9]+]]:2 = fir.array_modify %arg3, %arg2 : (!fir.array<?xi32>, index) -> (!fir.ref<i32>, !fir.array<?xi32>)
-! CHECK: %[[V_11:[0-9]+]] = fir.emboxchar %[[V_9]], %[[V_8:[0-9]+]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
-! CHECK: fir.call @_QPsfrom_char(%[[V_10]]#0, %[[V_11]]) fastmath<contract> : (!fir.ref<i32>, !fir.boxchar<1>) -> ()
-! CHECK: fir.result %[[V_10]]#1 : !fir.array<?xi32>
+! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i"}, %[[arg1:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
+! CHECK: %[[c:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: %[[i:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield %[[c]]#0
+! CHECK: } to {
+! CHECK: hlfir.yield %[[i]]#0
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.boxchar<1>) to (%[[lhs:.*]]: !fir.ref<i32>) {
+! CHECK: fir.call @_QPsfrom_char(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_1]], %[[V_6]] to %arg0 : !fir.array<?xi32>, !fir.array<?xi32>, !fir.box<!fir.array<?xi32>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPto_char(
-! CHECK-SAME: %arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i"}, %arg1: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_1:[0-9]+]]:3 = fir.box_dims %arg1, %[[C_0]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>, index) -> (index, index, index)
-! CHECK: %[[V_2:[0-9]+]] = fir.array_load %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.array<?x!fir.char<1,?>>
-! CHECK: %[[V_3:[0-9]+]] = fir.array_load %arg0 : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_4:[0-9]+]] = arith.subi %[[V_1]]#1, %[[C_1]] : index
-! CHECK: %[[V_5:[0-9]+]] = fir.do_loop %arg2 = %[[C_0_0]] to %[[V_4]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_2]]) -> (!fir.array<?x!fir.char<1,?>>) {
-! CHECK: %[[V_6:[0-9]+]] = fir.array_fetch %[[V_3]], %arg2 : (!fir.array<?xi32>, index) -> i32
-! CHECK: %[[V_7:[0-9]+]] = fir.no_reassoc %[[V_6:[0-9]+]] : i32
-! CHECK: %[[V_8:[0-9]+]]:2 = fir.array_modify %arg3, %arg2 : (!fir.array<?x!fir.char<1,?>>, index) -> (!fir.ref<!fir.char<1,?>>, !fir.array<?x!fir.char<1,?>>)
-! CHECK: %[[V_9:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index
-! CHECK: %[[V_10:[0-9]+]] = fir.emboxchar %[[V_8]]#0, %[[V_9:[0-9]+]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
-! CHECK: fir.store %[[V_7]] to %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: fir.call @_QPsto_char(%[[V_10]], %[[V_0]]) fastmath<contract> : (!fir.boxchar<1>, !fir.ref<i32>) -> ()
-! CHECK: fir.result %[[V_8]]#1 : !fir.array<?x!fir.char<1,?>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i"}, %[[arg1:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
+! CHECK: %[[c:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: %[[i:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield %[[i]]#0
+! CHECK: } to {
+! CHECK: hlfir.yield %[[c]]#0
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.ref<i32>) to (%[[lhs:.*]]: !fir.boxchar<1>) {
+! CHECK: fir.call @_QPsto_char(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_2]], %[[V_5]] to %arg1 : !fir.array<?x!fir.char<1,?>>, !fir.array<?x!fir.char<1,?>>, !fir.box<!fir.array<?x!fir.char<1,?>>>
-! CHECK: return
-! CHECK: }
subroutine test_derived(x)
use defined_assignments
@@ -207,266 +134,105 @@ elemental subroutine sto_char(a,b)
! -----------------------------------------------------------------------------
! CHECK-LABEL: func @_QPtest_in_forall_1(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca f32
-! CHECK: %[[V_1:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK: %[[C_10:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_10_0:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = fir.shape %[[C_10]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %arg0(%[[V_4]]) : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<10x!fir.logical<4>>
-! CHECK: %[[V_6:[0-9]+]] = fir.shape %[[C_10_0]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_7:[0-9]+]] = fir.array_load %arg1(%[[V_6]]) : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> !fir.array<10xf32>
-! CHECK: %[[V_8:[0-9]+]] = fir.do_loop %arg2 = %[[V_2]] to %[[V_3]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_5]]) -> (!fir.array<10x!fir.logical<4>>) {
-! CHECK: %[[V_9:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_9]] to %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_10:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_11:[0-9]+]] = fir.convert %[[V_10:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_12:[0-9]+]] = fir.convert %[[V_11:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_13:[0-9]+]] = arith.subi %[[V_12]], %[[C_1_1]] : index
-! CHECK: %[[V_14:[0-9]+]] = fir.array_fetch %[[V_7]], %[[V_13:[0-9]+]] : (!fir.array<10xf32>, index) -> f32
-! CHECK: %[[V_15:[0-9]+]] = fir.no_reassoc %[[V_14:[0-9]+]] : f32
-! CHECK: %[[C_1_2:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_16:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_17:[0-9]+]] = fir.convert %[[V_16:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_18:[0-9]+]] = fir.convert %[[V_17:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_19:[0-9]+]] = arith.subi %[[V_18]], %[[C_1_2]] : index
-! CHECK: %[[V_20:[0-9]+]]:2 = fir.array_modify %arg3, %[[V_19:[0-9]+]] : (!fir.array<10x!fir.logical<4>>, index) -> (!fir.ref<!fir.logical<4>>, !fir.array<10x!fir.logical<4>>)
-! CHECK: fir.store %[[V_15]] to %[[V_0:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.call @_QPassign_real_to_logical(%[[V_20]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<!fir.logical<4>>, !fir.ref<f32>) -> ()
-! CHECK: fir.result %[[V_20]]#1 : !fir.array<10x!fir.logical<4>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}) {
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.forall {{.*}} {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield {{.*}} : f32
+! CHECK: } to {
+! CHECK: hlfir.yield {{.*}} : !fir.ref<!fir.logical<4>>
+! CHECK: } user_defined_assign (%[[rhs:.*]]: f32) to (%[[lhs:.*]]: !fir.ref<!fir.logical<4>>) {
+! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[rhs]]
+! CHECK: fir.call @_QPassign_real_to_logical(%[[lhs]], %[[assoc]]#0)
+! CHECK: }
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_5]], %[[V_8]] to %arg0 : !fir.array<10x!fir.logical<4>>, !fir.array<10x!fir.logical<4>>, !fir.ref<!fir.array<10x!fir.logical<4>>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPtest_in_forall_2(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca !fir.logical<4>
-! CHECK: %[[V_1:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK: %[[C_10:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = fir.shape %[[C_10]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %arg1(%[[V_4]]) : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> !fir.array<10xf32>
-! CHECK: %[[V_6:[0-9]+]] = fir.do_loop %arg2 = %[[V_2]] to %[[V_3]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_5]]) -> (!fir.array<10xf32>) {
-! CHECK: %[[V_7:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_7]] to %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_8:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_9:[0-9]+]] = fir.convert %[[V_8:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_10:[0-9]+]] = fir.convert %[[V_9:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_11:[0-9]+]] = arith.subi %[[V_10]], %[[C_1_0]] : index
-! CHECK: %[[V_12:[0-9]+]] = fir.array_fetch %[[V_5]], %[[V_11:[0-9]+]] : (!fir.array<10xf32>, index) -> f32
-! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 0.000000e+00 : f32
-! CHECK: %[[V_13:[0-9]+]] = arith.cmpf olt, %[[V_12]], %[[C_st]] {{.*}} : f32
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_14:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_15:[0-9]+]] = fir.convert %[[V_14:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_16:[0-9]+]] = fir.convert %[[V_15:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_17:[0-9]+]] = arith.subi %[[V_16]], %[[C_1_1]] : index
-! CHECK: %[[V_18:[0-9]+]]:2 = fir.array_modify %arg3, %[[V_17:[0-9]+]] : (!fir.array<10xf32>, index) -> (!fir.ref<f32>, !fir.array<10xf32>)
-! CHECK: %[[V_19:[0-9]+]] = fir.convert %[[V_13:[0-9]+]] : (i1) -> !fir.logical<4>
-! CHECK: fir.store %[[V_19]] to %[[V_0:[0-9]+]] : !fir.ref<!fir.logical<4>>
-! CHECK: fir.call @_QPassign_logical_to_real(%[[V_18]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<f32>, !fir.ref<!fir.logical<4>>) -> ()
-! CHECK: fir.result %[[V_18]]#1 : !fir.array<10xf32>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}) {
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.forall {{.*}} {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield {{.*}} : i1
+! CHECK: } to {
+! CHECK: hlfir.yield {{.*}} : !fir.ref<f32>
+! CHECK: } user_defined_assign (%[[rhs:.*]]: i1) to (%[[lhs:.*]]: !fir.ref<f32>) {
+! CHECK: %[[cast:.*]] = fir.convert %[[rhs]]
+! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[cast]]
+! CHECK: fir.call @_QPassign_logical_to_real(%[[lhs]], %[[assoc]]#0)
+! CHECK: }
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_5]], %[[V_6]] to %arg1 : !fir.array<10xf32>, !fir.array<10xf32>, !fir.ref<!fir.array<10xf32>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPtest_intrinsic_where_1(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}, %arg2: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "l"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca f32
-! CHECK: %[[C_10:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_10_0:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_10_1:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_10_2:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[V_1:[0-9]+]] = fir.shape %[[C_10]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_2:[0-9]+]] = fir.array_load %arg2(%[[V_1]]) : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<10x!fir.logical<4>>
-! CHECK: %[[V_3:[0-9]+]] = fir.allocmem !fir.array<10x!fir.logical<4>>
-! CHECK: %[[V_4:[0-9]+]] = fir.shape %[[C_10_2]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %[[V_3]](%[[V_4]]) : (!fir.heap<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<10x!fir.logical<4>>
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_6:[0-9]+]] = arith.subi %[[C_10_2]], %[[C_1]] : index
-! CHECK: %[[V_7:[0-9]+]] = fir.do_loop %arg3 = %[[C_0]] to %[[V_6]] step %[[C_1]] unordered iter_args(%arg4 = %[[V_5]]) -> (!fir.array<10x!fir.logical<4>>) {
-! CHECK: %[[V_15:[0-9]+]] = fir.array_fetch %[[V_2]], %arg3 : (!fir.array<10x!fir.logical<4>>, index) -> !fir.logical<4>
-! CHECK: %[[V_16:[0-9]+]] = fir.array_update %arg4, %[[V_15]], %arg3 : (!fir.array<10x!fir.logical<4>>, !fir.logical<4>, index) -> !fir.array<10x!fir.logical<4>>
-! CHECK: fir.result %[[V_16:[0-9]+]] : !fir.array<10x!fir.logical<4>>
-! CHECK: }
-! CHECK: fir.array_merge_store %[[V_5]], %[[V_7]] to %[[V_3:[0-9]+]] : !fir.array<10x!fir.logical<4>>, !fir.array<10x!fir.logical<4>>, !fir.heap<!fir.array<10x!fir.logical<4>>>
-! CHECK: %[[V_8:[0-9]+]] = fir.shape %[[C_10_2]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_9:[0-9]+]] = fir.shape %[[C_10_0]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_10:[0-9]+]] = fir.array_load %arg0(%[[V_9]]) : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<10x!fir.logical<4>>
-! CHECK: %[[V_11:[0-9]+]] = fir.shape %[[C_10_1]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_12:[0-9]+]] = fir.array_load %arg1(%[[V_11]]) : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> !fir.array<10xf32>
-! CHECK: %[[C_1_3:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0_4:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_13:[0-9]+]] = arith.subi %[[C_10_0]], %[[C_1_3]] : index
-! CHECK: %[[V_14:[0-9]+]] = fir.do_loop %arg3 = %[[C_0_4]] to %[[V_13]] step %[[C_1_3]] unordered iter_args(%arg4 = %[[V_10]]) -> (!fir.array<10x!fir.logical<4>>) {
-! CHECK: %[[C_1_5:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_15:[0-9]+]] = arith.addi %arg3, %[[C_1_5]] : index
-! CHECK: %[[V_16:[0-9]+]] = fir.array_coor %[[V_3]](%[[V_8]]) %[[V_15:[0-9]+]] : (!fir.heap<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>, index) -> !fir.ref<!fir.logical<4>>
-! CHECK: %[[V_17:[0-9]+]] = fir.load %[[V_16:[0-9]+]] : !fir.ref<!fir.logical<4>>
-! CHECK: %[[V_18:[0-9]+]] = fir.convert %[[V_17:[0-9]+]] : (!fir.logical<4>) -> i1
-! CHECK: %[[V_19:[0-9]+]] = fir.if %[[V_18]] -> (!fir.array<10x!fir.logical<4>>) {
-! CHECK: %[[V_20:[0-9]+]] = fir.array_fetch %[[V_12]], %arg3 : (!fir.array<10xf32>, index) -> f32
-! CHECK: %[[V_21:[0-9]+]] = fir.no_reassoc %[[V_20:[0-9]+]] : f32
-! CHECK: %[[V_22:[0-9]+]]:2 = fir.array_modify %arg4, %arg3 : (!fir.array<10x!fir.logical<4>>, index) -> (!fir.ref<!fir.logical<4>>, !fir.array<10x!fir.logical<4>>)
-! CHECK: fir.store %[[V_21]] to %[[V_0:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.call @_QPassign_real_to_logical(%[[V_22]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<!fir.logical<4>>, !fir.ref<f32>) -> ()
-! CHECK: fir.result %[[V_22]]#1 : !fir.array<10x!fir.logical<4>>
-! CHECK: } else {
-! CHECK: fir.result %arg4 : !fir.array<10x!fir.logical<4>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}, %[[arg2:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "l"}) {
+! CHECK: %[[l:.*]]:2 = hlfir.declare %[[arg2]]
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.where {
+! CHECK: hlfir.yield %[[l]]#0
+! CHECK: } do {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield %[[y]]#0
+! CHECK: } to {
+! CHECK: hlfir.yield %[[x]]#0
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.ref<f32>) to (%[[lhs:.*]]: !fir.ref<!fir.logical<4>>) {
+! CHECK: fir.call @_QPassign_real_to_logical(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.result %[[V_19:[0-9]+]] : !fir.array<10x!fir.logical<4>>
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_10]], %[[V_14]] to %arg0 : !fir.array<10x!fir.logical<4>>, !fir.array<10x!fir.logical<4>>, !fir.ref<!fir.array<10x!fir.logical<4>>>
-! CHECK: fir.freemem %[[V_3:[0-9]+]] : !fir.heap<!fir.array<10x!fir.logical<4>>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPtest_intrinsic_where_2(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}, %arg2: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "l"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca !fir.logical<4>
-! CHECK: %[[C_10:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_10_0:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_10_1:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[V_1:[0-9]+]] = fir.shape %[[C_10]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_2:[0-9]+]] = fir.array_load %arg2(%[[V_1]]) : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<10x!fir.logical<4>>
-! CHECK: %[[V_3:[0-9]+]] = fir.allocmem !fir.array<10x!fir.logical<4>>
-! CHECK: %[[V_4:[0-9]+]] = fir.shape %[[C_10_1]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %[[V_3]](%[[V_4]]) : (!fir.heap<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<10x!fir.logical<4>>
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_6:[0-9]+]] = arith.subi %[[C_10_1]], %[[C_1]] : index
-! CHECK: %[[V_7:[0-9]+]] = fir.do_loop %arg3 = %[[C_0]] to %[[V_6]] step %[[C_1]] unordered iter_args(%arg4 = %[[V_5]]) -> (!fir.array<10x!fir.logical<4>>) {
-! CHECK: %[[V_15:[0-9]+]] = fir.array_fetch %[[V_2]], %arg3 : (!fir.array<10x!fir.logical<4>>, index) -> !fir.logical<4>
-! CHECK: %[[V_16:[0-9]+]] = fir.array_update %arg4, %[[V_15]], %arg3 : (!fir.array<10x!fir.logical<4>>, !fir.logical<4>, index) -> !fir.array<10x!fir.logical<4>>
-! CHECK: fir.result %[[V_16:[0-9]+]] : !fir.array<10x!fir.logical<4>>
-! CHECK: }
-! CHECK: fir.array_merge_store %[[V_5]], %[[V_7]] to %[[V_3:[0-9]+]] : !fir.array<10x!fir.logical<4>>, !fir.array<10x!fir.logical<4>>, !fir.heap<!fir.array<10x!fir.logical<4>>>
-! CHECK: %[[V_8:[0-9]+]] = fir.shape %[[C_10_1]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_9:[0-9]+]] = fir.shape %[[C_10_0]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_10:[0-9]+]] = fir.array_load %arg1(%[[V_9]]) : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> !fir.array<10xf32>
-! CHECK: %[[V_11:[0-9]+]] = fir.shape %[[C_10_0]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_12:[0-9]+]] = fir.array_load %arg1(%[[V_11]]) : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> !fir.array<10xf32>
-! CHECK: %[[C_st:[-0-9a-z_]+]] = arith.constant 0.000000e+00 : f32
-! CHECK: %[[C_1_2:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0_3:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_13:[0-9]+]] = arith.subi %[[C_10_0]], %[[C_1_2]] : index
-! CHECK: %[[V_14:[0-9]+]] = fir.do_loop %arg3 = %[[C_0_3]] to %[[V_13]] step %[[C_1_2]] unordered iter_args(%arg4 = %[[V_10]]) -> (!fir.array<10xf32>) {
-! CHECK: %[[C_1_4:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_15:[0-9]+]] = arith.addi %arg3, %[[C_1_4]] : index
-! CHECK: %[[V_16:[0-9]+]] = fir.array_coor %[[V_3]](%[[V_8]]) %[[V_15:[0-9]+]] : (!fir.heap<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>, index) -> !fir.ref<!fir.logical<4>>
-! CHECK: %[[V_17:[0-9]+]] = fir.load %[[V_16:[0-9]+]] : !fir.ref<!fir.logical<4>>
-! CHECK: %[[V_18:[0-9]+]] = fir.convert %[[V_17:[0-9]+]] : (!fir.logical<4>) -> i1
-! CHECK: %[[V_19:[0-9]+]] = fir.if %[[V_18]] -> (!fir.array<10xf32>) {
-! CHECK: %[[V_20:[0-9]+]] = fir.array_fetch %[[V_12]], %arg3 : (!fir.array<10xf32>, index) -> f32
-! CHECK: %[[V_21:[0-9]+]] = arith.cmpf olt, %[[V_20]], %[[C_st]] {{.*}} : f32
-! CHECK: %[[V_22:[0-9]+]]:2 = fir.array_modify %arg4, %arg3 : (!fir.array<10xf32>, index) -> (!fir.ref<f32>, !fir.array<10xf32>)
-! CHECK: %[[V_23:[0-9]+]] = fir.convert %[[V_21:[0-9]+]] : (i1) -> !fir.logical<4>
-! CHECK: fir.store %[[V_23]] to %[[V_0:[0-9]+]] : !fir.ref<!fir.logical<4>>
-! CHECK: fir.call @_QPassign_logical_to_real(%[[V_22]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<f32>, !fir.ref<!fir.logical<4>>) -> ()
-! CHECK: fir.result %[[V_22]]#1 : !fir.array<10xf32>
-! CHECK: } else {
-! CHECK: fir.result %arg4 : !fir.array<10xf32>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}, %[[arg2:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "l"}) {
+! CHECK: %[[l:.*]]:2 = hlfir.declare %[[arg2]]
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.where {
+! CHECK: hlfir.yield %[[l]]#0
+! CHECK: } do {
+! CHECK: hlfir.region_assign {
+! CHECK: %[[res:.*]] = hlfir.elemental %{{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<4>> {
+! CHECK: hlfir.yield_element
+! CHECK: }
+! CHECK: hlfir.yield %[[res]] : !hlfir.expr<10x!fir.logical<4>> cleanup {
+! CHECK: hlfir.destroy %[[res]]
+! CHECK: }
+! CHECK: } to {
+! CHECK: hlfir.yield %[[y]]#0
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.logical<4>) to (%[[lhs:.*]]: !fir.ref<f32>) {
+! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[rhs]]
+! CHECK: fir.call @_QPassign_logical_to_real(%[[lhs]], %[[assoc]]#0)
! CHECK: }
-! CHECK: fir.result %[[V_19:[0-9]+]] : !fir.array<10xf32>
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_10]], %[[V_14]] to %arg1 : !fir.array<10xf32>, !fir.array<10xf32>, !fir.ref<!fir.array<10xf32>>
-! CHECK: fir.freemem %[[V_3:[0-9]+]] : !fir.heap<!fir.array<10x!fir.logical<4>>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPtest_scalar_func_but_not_elemental(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "y"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32
-! CHECK: %[[V_1:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK: %[[C_100:[-0-9a-z_]+]] = arith.constant 100 : index
-! CHECK: %[[C_100_0:[-0-9a-z_]+]] = arith.constant 100 : index
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = fir.shape %[[C_100]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %arg0(%[[V_4]]) : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<100x!fir.logical<4>>
-! CHECK: %[[V_6:[0-9]+]] = fir.shape %[[C_100_0]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_7:[0-9]+]] = fir.array_load %arg1(%[[V_6]]) : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>) -> !fir.array<100xi32>
-! CHECK: %[[V_8:[0-9]+]] = fir.do_loop %arg2 = %[[V_2]] to %[[V_3]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_5]]) -> (!fir.array<100x!fir.logical<4>>) {
-! CHECK: %[[V_9:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_9]] to %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_10:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_11:[0-9]+]] = fir.convert %[[V_10:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_12:[0-9]+]] = fir.convert %[[V_11:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_13:[0-9]+]] = arith.subi %[[V_12]], %[[C_1_1]] : index
-! CHECK: %[[V_14:[0-9]+]] = fir.array_fetch %[[V_7]], %[[V_13:[0-9]+]] : (!fir.array<100xi32>, index) -> i32
-! CHECK: %[[V_15:[0-9]+]] = fir.no_reassoc %[[V_14:[0-9]+]] : i32
-! CHECK: %[[C_1_2:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_16:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_17:[0-9]+]] = fir.convert %[[V_16:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_18:[0-9]+]] = fir.convert %[[V_17:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_19:[0-9]+]] = arith.subi %[[V_18]], %[[C_1_2]] : index
-! CHECK: %[[V_20:[0-9]+]]:2 = fir.array_modify %arg3, %[[V_19:[0-9]+]] : (!fir.array<100x!fir.logical<4>>, index) -> (!fir.ref<!fir.logical<4>>, !fir.array<100x!fir.logical<4>>)
-! CHECK: fir.store %[[V_15]] to %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: fir.call @_QPassign_integer_to_logical(%[[V_20]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<!fir.logical<4>>, !fir.ref<i32>) -> ()
-! CHECK: fir.result %[[V_20]]#1 : !fir.array<100x!fir.logical<4>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "y"}) {
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.forall {{.*}} {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield {{.*}} : i32
+! CHECK: } to {
+! CHECK: hlfir.yield {{.*}} : !fir.ref<!fir.logical<4>>
+! CHECK: } user_defined_assign (%[[rhs:.*]]: i32) to (%[[lhs:.*]]: !fir.ref<!fir.logical<4>>) {
+! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[rhs]]
+! CHECK: fir.call @_QPassign_integer_to_logical(%[[lhs]], %[[assoc]]#0)
+! CHECK: }
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_5]], %[[V_8]] to %arg0 : !fir.array<100x!fir.logical<4>>, !fir.array<100x!fir.logical<4>>, !fir.ref<!fir.array<100x!fir.logical<4>>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPtest_in_forall_with_cleanup(
-! CHECK-SAME: %arg0: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca !fir.box<!fir.heap<f32>> {bindc_name = ".result"}
-! CHECK: %[[V_1:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK: %[[C_10:[-0-9a-z_]+]] = arith.constant 10 : index
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = fir.shape %[[C_10]] : (index) -> !fir.shape<1>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %arg0(%[[V_4]]) : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> !fir.array<10x!fir.logical<4>>
-! CHECK: %[[V_6:[0-9]+]] = fir.do_loop %arg2 = %[[V_2]] to %[[V_3]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_5]]) -> (!fir.array<10x!fir.logical<4>>) {
-! CHECK: %[[V_7:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_7]] to %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_8:[0-9]+]] = fir.call @_QPreturns_alloc(%[[V_1]]) proc_attrs<pure> fastmath<contract> : (!fir.ref<i32>) -> !fir.box<!fir.heap<f32>>
-! CHECK: fir.save_result %[[V_8]] to %[[V_0:[0-9]+]] : !fir.box<!fir.heap<f32>>, !fir.ref<!fir.box<!fir.heap<f32>>>
-! CHECK: %[[V_9:[0-9]+]] = fir.load %[[V_0:[0-9]+]] : !fir.ref<!fir.box<!fir.heap<f32>>>
-! CHECK: %[[V_10:[0-9]+]] = fir.box_addr %[[V_9:[0-9]+]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_11:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_12:[0-9]+]] = fir.convert %[[V_11:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_13:[0-9]+]] = fir.convert %[[V_12:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_14:[0-9]+]] = arith.subi %[[V_13]], %[[C_1_0]] : index
-! CHECK: %[[V_15:[0-9]+]]:2 = fir.array_modify %arg3, %[[V_14:[0-9]+]] : (!fir.array<10x!fir.logical<4>>, index) -> (!fir.ref<!fir.logical<4>>, !fir.array<10x!fir.logical<4>>)
-! CHECK: %[[V_16:[0-9]+]] = fir.convert %[[V_10:[0-9]+]] : (!fir.heap<f32>) -> !fir.ref<f32>
-! CHECK: fir.call @_QPassign_real_to_logical(%[[V_15]]#0, %[[V_16]]) fastmath<contract> : (!fir.ref<!fir.logical<4>>, !fir.ref<f32>) -> ()
-! CHECK: %[[V_17:[0-9]+]] = fir.load %[[V_0:[0-9]+]] : !fir.ref<!fir.box<!fir.heap<f32>>>
-! CHECK: %[[V_18:[0-9]+]] = fir.box_addr %[[V_17:[0-9]+]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>
-! CHECK: %[[V_19:[0-9]+]] = fir.convert %[[V_18:[0-9]+]] : (!fir.heap<f32>) -> i64
-! CHECK: %[[C_0_i64:[-0-9a-z_]+]] = arith.constant 0 : i64
-! CHECK: %[[V_20:[0-9]+]] = arith.cmpi ne, %[[V_19]], %[[C_0_i64]] : i64
-! CHECK: fir.if %[[V_20]] {
-! CHECK: fir.freemem %[[V_18:[0-9]+]] : !fir.heap<f32>
+! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.ref<!fir.array<10xf32>> {fir.bindc_name = "y"}) {
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.forall {{.*}} {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield {{.*}} : f32 cleanup {
+! CHECK: }
+! CHECK: } to {
+! CHECK: hlfir.yield {{.*}} : !fir.ref<!fir.logical<4>>
+! CHECK: } user_defined_assign (%[[rhs:.*]]: f32) to (%[[lhs:.*]]: !fir.ref<!fir.logical<4>>) {
+! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[rhs]]
+! CHECK: fir.call @_QPassign_real_to_logical(%[[lhs]], %[[assoc]]#0)
! CHECK: }
-! CHECK: fir.result %[[V_15]]#1 : !fir.array<10x!fir.logical<4>>
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_5]], %[[V_6]] to %arg0 : !fir.array<10x!fir.logical<4>>, !fir.array<10x!fir.logical<4>>, !fir.ref<!fir.array<10x!fir.logical<4>>>
-! CHECK: return
-! CHECK: }
subroutine test_in_forall_1(x, y)
use defined_assignments
@@ -525,298 +291,53 @@ pure function returns_alloc(i)
end subroutine
! CHECK-LABEL: func @_QPtest_forall_array(
-! CHECK-SAME: %arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: !fir.box<!fir.array<?x?xf32>> {fir.bindc_name = "y"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca f32
-! CHECK: %[[V_1:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = fir.array_load %arg0 : (!fir.box<!fir.array<?x?x!fir.logical<4>>>) -> !fir.array<?x?x!fir.logical<4>>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %arg1 : (!fir.box<!fir.array<?x?xf32>>) -> !fir.array<?x?xf32>
-! CHECK: %[[V_6:[0-9]+]] = fir.do_loop %arg2 = %[[V_2]] to %[[V_3]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_4]]) -> (!fir.array<?x?x!fir.logical<4>>) {
-! CHECK: %[[V_7:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_7]] to %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_8:[0-9]+]]:3 = fir.box_dims %arg0, %[[C_1_0]] : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, index) -> (index, index, index)
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_9:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_10:[0-9]+]] = fir.convert %[[V_9:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_11:[0-9]+]] = fir.convert %[[V_10:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_12:[0-9]+]] = arith.subi %[[V_11]], %[[C_1_1]] : index
-! CHECK: %[[C_1_i64:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_13:[0-9]+]] = fir.convert %[[C_1_i64]] : (i64) -> index
-! CHECK: %[[V_14:[0-9]+]] = arith.addi %[[C_1_1]], %[[V_8]]#1 : index
-! CHECK: %[[V_15:[0-9]+]] = arith.subi %[[V_14]], %[[C_1_1]] : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_16:[0-9]+]] = arith.subi %[[V_15]], %[[C_1_1]] : index
-! CHECK: %[[V_17:[0-9]+]] = arith.addi %[[V_16]], %[[V_13:[0-9]+]] : index
-! CHECK: %[[V_18:[0-9]+]] = arith.divsi %[[V_17]], %[[V_13:[0-9]+]] : index
-! CHECK: %[[V_19:[0-9]+]] = arith.cmpi sgt, %[[V_18]], %[[C_0]] : index
-! CHECK: %[[V_20:[0-9]+]] = arith.select %[[V_19]], %[[V_18]], %[[C_0]] : index
-! CHECK: %[[C_1_2:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_21:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_22:[0-9]+]] = fir.convert %[[V_21:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_23:[0-9]+]] = fir.convert %[[V_22:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_24:[0-9]+]] = arith.subi %[[V_23]], %[[C_1_2]] : index
-! CHECK: %[[C_1_i64_3:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_25:[0-9]+]] = fir.convert %[[C_1_i64_3]] : (i64) -> index
-! CHECK: %[[C_1_4:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0_5:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_26:[0-9]+]] = arith.subi %[[V_20]], %[[C_1_4]] : index
-! CHECK: %[[V_27:[0-9]+]] = fir.do_loop %arg4 = %[[C_0_5]] to %[[V_26]] step %[[C_1_4]] unordered iter_args(%arg5 = %arg3) -> (!fir.array<?x?x!fir.logical<4>>) {
-! CHECK: %[[V_28:[0-9]+]] = arith.subi %[[C_1_2]], %[[C_1_2]] : index
-! CHECK: %[[V_29:[0-9]+]] = arith.muli %arg4, %[[V_25:[0-9]+]] : index
-! CHECK: %[[V_30:[0-9]+]] = arith.addi %[[V_28]], %[[V_29:[0-9]+]] : index
-! CHECK: %[[V_31:[0-9]+]] = fir.array_fetch %[[V_5]], %[[V_24]], %[[V_30:[0-9]+]] : (!fir.array<?x?xf32>, index, index) -> f32
-! CHECK: %[[V_32:[0-9]+]] = fir.no_reassoc %[[V_31:[0-9]+]] : f32
-! CHECK: %[[V_33:[0-9]+]] = arith.subi %[[C_1_1]], %[[C_1_1]] : index
-! CHECK: %[[V_34:[0-9]+]] = arith.muli %arg4, %[[V_13:[0-9]+]] : index
-! CHECK: %[[V_35:[0-9]+]] = arith.addi %[[V_33]], %[[V_34:[0-9]+]] : index
-! CHECK: %[[V_36:[0-9]+]]:2 = fir.array_modify %arg5, %[[V_12]], %[[V_35:[0-9]+]] : (!fir.array<?x?x!fir.logical<4>>, index, index) -> (!fir.ref<!fir.logical<4>>, !fir.array<?x?x!fir.logical<4>>)
-! CHECK: fir.store %[[V_32]] to %[[V_0:[0-9]+]] : !fir.ref<f32>
-! CHECK: fir.call @_QPassign_real_to_logical(%[[V_36]]#0, %[[V_0]]) fastmath<contract> : (!fir.ref<!fir.logical<4>>, !fir.ref<f32>) -> ()
-! CHECK: fir.result %[[V_36]]#1 : !fir.array<?x?x!fir.logical<4>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %[[arg1:.*]]: !fir.box<!fir.array<?x?xf32>> {fir.bindc_name = "y"}) {
+! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: %[[y:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: hlfir.forall {{.*}} {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield {{.*}} : !fir.box<!fir.array<?xf32>>
+! CHECK: } to {
+! CHECK: hlfir.yield {{.*}} : !fir.box<!fir.array<?x!fir.logical<4>>>
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.ref<f32>) to (%[[lhs:.*]]: !fir.ref<!fir.logical<4>>) {
+! CHECK: fir.call @_QPassign_real_to_logical(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.result %[[V_27:[0-9]+]] : !fir.array<?x?x!fir.logical<4>>
-! CHECK: }
-! CHECK: fir.array_merge_store %[[V_4]], %[[V_6]] to %arg0 : !fir.array<?x?x!fir.logical<4>>, !fir.array<?x?x!fir.logical<4>>, !fir.box<!fir.array<?x?x!fir.logical<4>>>
-! CHECK: return
-! CHECK: }
-
-subroutine test_forall_array(x, y)
- use defined_assignments
- logical :: x(:, :)
- real :: y(:, :)
- forall (i=1:10) x(i, :) = y(i, :)
-end subroutine
-
-! CHECK-LABEL: func @_QPfrom_char_forall(
-! CHECK-SAME: %arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i"}, %arg1: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_3:[0-9]+]] = fir.array_load %arg0 : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK: %[[V_4:[0-9]+]] = fir.array_load %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.array<?x!fir.char<1,?>>
-! CHECK: %[[V_5:[0-9]+]] = fir.do_loop %arg2 = %[[V_1]] to %[[V_2]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_3]]) -> (!fir.array<?xi32>) {
-! CHECK: %[[V_6:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_6]] to %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_7:[0-9]+]] = fir.load %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_8:[0-9]+]] = fir.convert %[[V_7:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_9:[0-9]+]] = fir.convert %[[V_8:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_10:[0-9]+]] = arith.subi %[[V_9]], %[[C_1_0]] : index
-! CHECK: %[[V_11:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_12:[0-9]+]] = arith.divsi %[[V_11]], %[[C_1_1]] : index
-! CHECK: %[[V_13:[0-9]+]] = fir.array_access %[[V_4]], %[[V_10]] typeparams %[[V_12:[0-9]+]] : (!fir.array<?x!fir.char<1,?>>, index, index) -> !fir.ref<!fir.char<1,?>>
-! CHECK: %[[V_14:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index
-! CHECK: %[[V_15:[0-9]+]] = fir.no_reassoc %[[V_13:[0-9]+]] : !fir.ref<!fir.char<1,?>>
-! CHECK: %[[C_1_2:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_16:[0-9]+]] = fir.load %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_17:[0-9]+]] = fir.convert %[[V_16:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_18:[0-9]+]] = fir.convert %[[V_17:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_19:[0-9]+]] = arith.subi %[[V_18]], %[[C_1_2]] : index
-! CHECK: %[[V_20:[0-9]+]]:2 = fir.array_modify %arg3, %[[V_19:[0-9]+]] : (!fir.array<?xi32>, index) -> (!fir.ref<i32>, !fir.array<?xi32>)
-! CHECK: %[[V_21:[0-9]+]] = fir.emboxchar %[[V_15]], %[[V_14:[0-9]+]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
-! CHECK: fir.call @_QPsfrom_char(%[[V_20]]#0, %[[V_21]]) fastmath<contract> : (!fir.ref<i32>, !fir.boxchar<1>) -> ()
-! CHECK: fir.result %[[V_20]]#1 : !fir.array<?xi32>
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_3]], %[[V_5]] to %arg0 : !fir.array<?xi32>, !fir.array<?xi32>, !fir.box<!fir.array<?xi32>>
-! CHECK: return
-! CHECK: }
-
-! CHECK-LABEL: func @_QPto_char_forall(
-! CHECK-SAME: %arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "i"}, %arg1: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32
-! CHECK: %[[V_1:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = fir.array_load %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> !fir.array<?x!fir.char<1,?>>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %arg0 : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK: %[[V_6:[0-9]+]] = fir.do_loop %arg2 = %[[V_2]] to %[[V_3]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_4]]) -> (!fir.array<?x!fir.char<1,?>>) {
-! CHECK: %[[V_7:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_7]] to %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_8:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_9:[0-9]+]] = fir.convert %[[V_8:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_10:[0-9]+]] = fir.convert %[[V_9:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_11:[0-9]+]] = arith.subi %[[V_10]], %[[C_1_0]] : index
-! CHECK: %[[V_12:[0-9]+]] = fir.array_fetch %[[V_5]], %[[V_11:[0-9]+]] : (!fir.array<?xi32>, index) -> i32
-! CHECK: %[[V_13:[0-9]+]] = fir.no_reassoc %[[V_12:[0-9]+]] : i32
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_14:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_15:[0-9]+]] = fir.convert %[[V_14:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_16:[0-9]+]] = fir.convert %[[V_15:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_17:[0-9]+]] = arith.subi %[[V_16]], %[[C_1_1]] : index
-! CHECK: %[[V_18:[0-9]+]]:2 = fir.array_modify %arg3, %[[V_17:[0-9]+]] : (!fir.array<?x!fir.char<1,?>>, index) -> (!fir.ref<!fir.char<1,?>>, !fir.array<?x!fir.char<1,?>>)
-! CHECK: %[[V_19:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x!fir.char<1,?>>>) -> index
-! CHECK: %[[V_20:[0-9]+]] = fir.emboxchar %[[V_18]]#0, %[[V_19:[0-9]+]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
-! CHECK: fir.store %[[V_13]] to %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: fir.call @_QPsto_char(%[[V_20]], %[[V_0]]) fastmath<contract> : (!fir.boxchar<1>, !fir.ref<i32>) -> ()
-! CHECK: fir.result %[[V_18]]#1 : !fir.array<?x!fir.char<1,?>>
-! CHECK: }
-! CHECK: fir.array_merge_store %[[V_4]], %[[V_6]] to %arg1 : !fir.array<?x!fir.char<1,?>>, !fir.array<?x!fir.char<1,?>>, !fir.box<!fir.array<?x!fir.char<1,?>>>
-! CHECK: return
-! CHECK: }
-
-subroutine from_char_forall(i, c)
- interface assignment(=)
- elemental subroutine sfrom_char(a,b)
- integer, intent(out) :: a
- character(*),intent(in) :: b
- end subroutine
- end interface
- integer :: i(:)
- character(*) :: c(:)
- forall (j=1:10) i(j) = c(j)
-end subroutine
-
-subroutine to_char_forall(i, c)
- interface assignment(=)
- elemental subroutine sto_char(a,b)
- character(*), intent(out) :: a
- integer,intent(in) :: b
- end subroutine
- end interface
- integer :: i(:)
- character(*) :: c(:)
- forall (j=1:10) c(j) = i(j)
-end subroutine
! CHECK-LABEL: func @_QPfrom_char_forall_array(
-! CHECK-SAME: %arg0: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "i"}, %arg1: !fir.box<!fir.array<?x?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_1:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_3:[0-9]+]] = fir.array_load %arg0 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.array<?x?xi32>
-! CHECK: %[[V_4:[0-9]+]] = fir.array_load %arg1 : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>) -> !fir.array<?x?x!fir.char<1,?>>
-! CHECK: %[[V_5:[0-9]+]] = fir.do_loop %arg2 = %[[V_1]] to %[[V_2]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_3]]) -> (!fir.array<?x?xi32>) {
-! CHECK: %[[V_6:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_6]] to %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_7:[0-9]+]]:3 = fir.box_dims %arg0, %[[C_1_0]] : (!fir.box<!fir.array<?x?xi32>>, index) -> (index, index, index)
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_8:[0-9]+]] = fir.load %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_9:[0-9]+]] = fir.convert %[[V_8:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_10:[0-9]+]] = fir.convert %[[V_9:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_11:[0-9]+]] = arith.subi %[[V_10]], %[[C_1_1]] : index
-! CHECK: %[[C_1_i64:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_12:[0-9]+]] = fir.convert %[[C_1_i64]] : (i64) -> index
-! CHECK: %[[V_13:[0-9]+]] = arith.addi %[[C_1_1]], %[[V_7]]#1 : index
-! CHECK: %[[V_14:[0-9]+]] = arith.subi %[[V_13]], %[[C_1_1]] : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_15:[0-9]+]] = arith.subi %[[V_14]], %[[C_1_1]] : index
-! CHECK: %[[V_16:[0-9]+]] = arith.addi %[[V_15]], %[[V_12:[0-9]+]] : index
-! CHECK: %[[V_17:[0-9]+]] = arith.divsi %[[V_16]], %[[V_12:[0-9]+]] : index
-! CHECK: %[[V_18:[0-9]+]] = arith.cmpi sgt, %[[V_17]], %[[C_0]] : index
-! CHECK: %[[V_19:[0-9]+]] = arith.select %[[V_18]], %[[V_17]], %[[C_0]] : index
-! CHECK: %[[C_1_2:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_20:[0-9]+]] = fir.load %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_21:[0-9]+]] = fir.convert %[[V_20:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_22:[0-9]+]] = fir.convert %[[V_21:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_23:[0-9]+]] = arith.subi %[[V_22]], %[[C_1_2]] : index
-! CHECK: %[[C_1_i64_3:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_24:[0-9]+]] = fir.convert %[[C_1_i64_3]] : (i64) -> index
-! CHECK: %[[C_1_4:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0_5:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_25:[0-9]+]] = arith.subi %[[V_19]], %[[C_1_4]] : index
-! CHECK: %[[V_26:[0-9]+]] = fir.do_loop %arg4 = %[[C_0_5]] to %[[V_25]] step %[[C_1_4]] unordered iter_args(%arg5 = %arg3) -> (!fir.array<?x?xi32>) {
-! CHECK: %[[V_27:[0-9]+]] = arith.subi %[[C_1_2]], %[[C_1_2]] : index
-! CHECK: %[[V_28:[0-9]+]] = arith.muli %arg4, %[[V_24:[0-9]+]] : index
-! CHECK: %[[V_29:[0-9]+]] = arith.addi %[[V_27]], %[[V_28:[0-9]+]] : index
-! CHECK: %[[V_30:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>) -> index
-! CHECK: %[[C_1_6:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_31:[0-9]+]] = arith.divsi %[[V_30]], %[[C_1_6]] : index
-! CHECK: %[[V_32:[0-9]+]] = fir.array_access %[[V_4]], %[[V_23]], %[[V_29]] typeparams %[[V_31:[0-9]+]] : (!fir.array<?x?x!fir.char<1,?>>, index, index, index) -> !fir.ref<!fir.char<1,?>>
-! CHECK: %[[V_33:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>) -> index
-! CHECK: %[[V_34:[0-9]+]] = fir.no_reassoc %[[V_32:[0-9]+]] : !fir.ref<!fir.char<1,?>>
-! CHECK: %[[V_35:[0-9]+]] = arith.subi %[[C_1_1]], %[[C_1_1]] : index
-! CHECK: %[[V_36:[0-9]+]] = arith.muli %arg4, %[[V_12:[0-9]+]] : index
-! CHECK: %[[V_37:[0-9]+]] = arith.addi %[[V_35]], %[[V_36:[0-9]+]] : index
-! CHECK: %[[V_38:[0-9]+]]:2 = fir.array_modify %arg5, %[[V_11]], %[[V_37:[0-9]+]] : (!fir.array<?x?xi32>, index, index) -> (!fir.ref<i32>, !fir.array<?x?xi32>)
-! CHECK: %[[V_39:[0-9]+]] = fir.emboxchar %[[V_34]], %[[V_33:[0-9]+]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
-! CHECK: fir.call @_QPsfrom_char(%[[V_38]]#0, %[[V_39]]) fastmath<contract> : (!fir.ref<i32>, !fir.boxchar<1>) -> ()
-! CHECK: fir.result %[[V_38]]#1 : !fir.array<?x?xi32>
+! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "i"}, %[[arg1:.*]]: !fir.box<!fir.array<?x?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
+! CHECK: %[[c:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: %[[i:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: hlfir.forall {{.*}} {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield {{.*}} : !fir.box<!fir.array<?x!fir.char<1,?>>>
+! CHECK: } to {
+! CHECK: hlfir.yield {{.*}} : !fir.box<!fir.array<?xi32>>
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.boxchar<1>) to (%[[lhs:.*]]: !fir.ref<i32>) {
+! CHECK: fir.call @_QPsfrom_char(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.result %[[V_26:[0-9]+]] : !fir.array<?x?xi32>
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_3]], %[[V_5]] to %arg0 : !fir.array<?x?xi32>, !fir.array<?x?xi32>, !fir.box<!fir.array<?x?xi32>>
-! CHECK: return
-! CHECK: }
! CHECK-LABEL: func @_QPto_char_forall_array(
-! CHECK-SAME: %arg0: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "i"}, %arg1: !fir.box<!fir.array<?x?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
-! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32
-! CHECK: %[[V_1:[0-9]+]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
-! CHECK: %[[C_1_i32:[-0-9a-z_]+]] = arith.constant 1 : i32
-! CHECK: %[[V_2:[0-9]+]] = fir.convert %[[C_1_i32]] : (i32) -> index
-! CHECK: %[[C_10_i32:[-0-9a-z_]+]] = arith.constant 10 : i32
-! CHECK: %[[V_3:[0-9]+]] = fir.convert %[[C_10_i32]] : (i32) -> index
-! CHECK: %[[C_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_4:[0-9]+]] = fir.array_load %arg1 : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>) -> !fir.array<?x?x!fir.char<1,?>>
-! CHECK: %[[V_5:[0-9]+]] = fir.array_load %arg0 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.array<?x?xi32>
-! CHECK: %[[V_6:[0-9]+]] = fir.do_loop %arg2 = %[[V_2]] to %[[V_3]] step %[[C_1]] unordered iter_args(%arg3 = %[[V_4]]) -> (!fir.array<?x?x!fir.char<1,?>>) {
-! CHECK: %[[V_7:[0-9]+]] = fir.convert %arg2 : (index) -> i32
-! CHECK: fir.store %[[V_7]] to %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[C_1_0:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_8:[0-9]+]]:3 = fir.box_dims %arg1, %[[C_1_0]] : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>, index) -> (index, index, index)
-! CHECK: %[[C_1_1:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_9:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_10:[0-9]+]] = fir.convert %[[V_9:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_11:[0-9]+]] = fir.convert %[[V_10:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_12:[0-9]+]] = arith.subi %[[V_11]], %[[C_1_1]] : index
-! CHECK: %[[C_1_i64:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_13:[0-9]+]] = fir.convert %[[C_1_i64]] : (i64) -> index
-! CHECK: %[[V_14:[0-9]+]] = arith.addi %[[C_1_1]], %[[V_8]]#1 : index
-! CHECK: %[[V_15:[0-9]+]] = arith.subi %[[V_14]], %[[C_1_1]] : index
-! CHECK: %[[C_0:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_16:[0-9]+]] = arith.subi %[[V_15]], %[[C_1_1]] : index
-! CHECK: %[[V_17:[0-9]+]] = arith.addi %[[V_16]], %[[V_13:[0-9]+]] : index
-! CHECK: %[[V_18:[0-9]+]] = arith.divsi %[[V_17]], %[[V_13:[0-9]+]] : index
-! CHECK: %[[V_19:[0-9]+]] = arith.cmpi sgt, %[[V_18]], %[[C_0]] : index
-! CHECK: %[[V_20:[0-9]+]] = arith.select %[[V_19]], %[[V_18]], %[[C_0]] : index
-! CHECK: %[[C_1_2:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[V_21:[0-9]+]] = fir.load %[[V_1:[0-9]+]] : !fir.ref<i32>
-! CHECK: %[[V_22:[0-9]+]] = fir.convert %[[V_21:[0-9]+]] : (i32) -> i64
-! CHECK: %[[V_23:[0-9]+]] = fir.convert %[[V_22:[0-9]+]] : (i64) -> index
-! CHECK: %[[V_24:[0-9]+]] = arith.subi %[[V_23]], %[[C_1_2]] : index
-! CHECK: %[[C_1_i64_3:[-0-9a-z_]+]] = arith.constant 1 : i64
-! CHECK: %[[V_25:[0-9]+]] = fir.convert %[[C_1_i64_3]] : (i64) -> index
-! CHECK: %[[C_1_4:[-0-9a-z_]+]] = arith.constant 1 : index
-! CHECK: %[[C_0_5:[-0-9a-z_]+]] = arith.constant 0 : index
-! CHECK: %[[V_26:[0-9]+]] = arith.subi %[[V_20]], %[[C_1_4]] : index
-! CHECK: %[[V_27:[0-9]+]] = fir.do_loop %arg4 = %[[C_0_5]] to %[[V_26]] step %[[C_1_4]] unordered iter_args(%arg5 = %arg3) -> (!fir.array<?x?x!fir.char<1,?>>) {
-! CHECK: %[[V_28:[0-9]+]] = arith.subi %[[C_1_2]], %[[C_1_2]] : index
-! CHECK: %[[V_29:[0-9]+]] = arith.muli %arg4, %[[V_25:[0-9]+]] : index
-! CHECK: %[[V_30:[0-9]+]] = arith.addi %[[V_28]], %[[V_29:[0-9]+]] : index
-! CHECK: %[[V_31:[0-9]+]] = fir.array_fetch %[[V_5]], %[[V_24]], %[[V_30:[0-9]+]] : (!fir.array<?x?xi32>, index, index) -> i32
-! CHECK: %[[V_32:[0-9]+]] = fir.no_reassoc %[[V_31:[0-9]+]] : i32
-! CHECK: %[[V_33:[0-9]+]] = arith.subi %[[C_1_1]], %[[C_1_1]] : index
-! CHECK: %[[V_34:[0-9]+]] = arith.muli %arg4, %[[V_13:[0-9]+]] : index
-! CHECK: %[[V_35:[0-9]+]] = arith.addi %[[V_33]], %[[V_34:[0-9]+]] : index
-! CHECK: %[[V_36:[0-9]+]]:2 = fir.array_modify %arg5, %[[V_12]], %[[V_35:[0-9]+]] : (!fir.array<?x?x!fir.char<1,?>>, index, index) -> (!fir.ref<!fir.char<1,?>>, !fir.array<?x?x!fir.char<1,?>>)
-! CHECK: %[[V_37:[0-9]+]] = fir.box_elesize %arg1 : (!fir.box<!fir.array<?x?x!fir.char<1,?>>>) -> index
-! CHECK: %[[V_38:[0-9]+]] = fir.emboxchar %[[V_36]]#0, %[[V_37:[0-9]+]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
-! CHECK: fir.store %[[V_32]] to %[[V_0:[0-9]+]] : !fir.ref<i32>
-! CHECK: fir.call @_QPsto_char(%[[V_38]], %[[V_0]]) fastmath<contract> : (!fir.boxchar<1>, !fir.ref<i32>) -> ()
-! CHECK: fir.result %[[V_36]]#1 : !fir.array<?x?x!fir.char<1,?>>
+! CHECK-SAME: %[[arg0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "i"}, %[[arg1:.*]]: !fir.box<!fir.array<?x?x!fir.char<1,?>>> {fir.bindc_name = "c"}) {
+! CHECK: %[[c:.*]]:2 = hlfir.declare %[[arg1]]
+! CHECK: %[[i:.*]]:2 = hlfir.declare %[[arg0]]
+! CHECK: hlfir.forall {{.*}} {
+! CHECK: hlfir.region_assign {
+! CHECK: hlfir.yield {{.*}} : !fir.box<!fir.array<?xi32>>
+! CHECK: } to {
+! CHECK: hlfir.yield {{.*}} : !fir.box<!fir.array<?x!fir.char<1,?>>>
+! CHECK: } user_defined_assign (%[[rhs:.*]]: !fir.ref<i32>) to (%[[lhs:.*]]: !fir.boxchar<1>) {
+! CHECK: fir.call @_QPsto_char(%[[lhs]], %[[rhs]])
! CHECK: }
-! CHECK: fir.result %[[V_27:[0-9]+]] : !fir.array<?x?x!fir.char<1,?>>
! CHECK: }
-! CHECK: fir.array_merge_store %[[V_4]], %[[V_6]] to %arg1 : !fir.array<?x?x!fir.char<1,?>>, !fir.array<?x?x!fir.char<1,?>>, !fir.box<!fir.array<?x?x!fir.char<1,?>>>
-! CHECK: return
-! CHECK: }
+
+subroutine test_forall_array(x, y)
+ use defined_assignments
+ logical :: x(:, :)
+ real :: y(:, :)
+ forall (i=1:10) x(i, :) = y(i, :)
+end subroutine
subroutine from_char_forall_array(i, c)
interface assignment(=)
@@ -854,4 +375,4 @@ pure subroutine assign_array(a,b)
logical :: x(10, 10)
integer :: y(10, 10)
! forall(i=1:10) x(i, :) = y(i, :)
-end subroutine
+end subroutine
\ No newline at end of file
diff --git a/flang/test/Lower/array.f90 b/flang/test/Lower/array.f90
index cd12d7f851e67..f2dfbea9a084f 100644
--- a/flang/test/Lower/array.f90
+++ b/flang/test/Lower/array.f90
@@ -1,23 +1,32 @@
-! RUN: bbc -hlfir=false -o - %s | FileCheck %s
+! RUN: bbc -emit-hlfir -o - %s | FileCheck %s
! CHECK-LABEL: fir.global @block_
-! CHECK-DAG: %[[VAL_1:.*]] = arith.constant 1.000000e+00 : f32
-! CHECK-DAG: %[[VAL_2:.*]] = arith.constant 2.400000e+00 : f32
-! CHECK-DAG: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32
! CHECK: %[[VAL_4:.*]] = fir.zero_bits tuple<!fir.array<5x5xf32>>
! CHECK: %[[VAL_5:.*]] = fir.undefined !fir.array<5x5xf32>
-! CHECK: %[[VAL_6:.*]] = fir.insert_on_range %[[VAL_5]], %[[VAL_1]] from (0, 0) to (1, 0) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_7:.*]] = fir.insert_on_range %[[VAL_6]], %[[VAL_3]] from (2, 0) to (4, 0) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_8:.*]] = fir.insert_on_range %[[VAL_7]], %[[VAL_1]] from (0, 1) to (1, 1) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_9:.*]] = fir.insert_value %[[VAL_8]], %[[VAL_3]], [2 : index, 1 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_10:.*]] = fir.insert_value %[[VAL_9]], %[[VAL_2]], [3 : index, 1 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_11:.*]] = fir.insert_value %[[VAL_10]], %[[VAL_3]], [4 : index, 1 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_12:.*]] = fir.insert_on_range %[[VAL_11]], %[[VAL_1]] from (0, 2) to (1, 2) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_13:.*]] = fir.insert_value %[[VAL_12]], %[[VAL_3]], [2 : index, 2 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_14:.*]] = fir.insert_value %[[VAL_13]], %[[VAL_2]], [3 : index, 2 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_15:.*]] = fir.insert_on_range %[[VAL_14]], %[[VAL_3]] from (4, 2) to (2, 3) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_16:.*]] = fir.insert_value %[[VAL_15]], %[[VAL_2]], [3 : index, 3 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
-! CHECK: %[[VAL_17:.*]] = fir.insert_on_range %[[VAL_16]], %[[VAL_3]] from (4, 3) to (4, 4) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C1:.*]] = arith.constant 1.000000e+00 : f32
+! CHECK: %[[VAL_6:.*]] = fir.insert_on_range %[[VAL_5]], %[[C1]] from (0, 0) to (1, 0) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C0:.*]] = arith.constant 0.000000e+00 : f32
+! CHECK: %[[VAL_7:.*]] = fir.insert_on_range %[[VAL_6]], %[[C0]] from (2, 0) to (4, 0) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C1_2:.*]] = arith.constant 1.000000e+00 : f32
+! CHECK: %[[VAL_8:.*]] = fir.insert_on_range %[[VAL_7]], %[[C1_2]] from (0, 1) to (1, 1) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C0_2:.*]] = arith.constant 0.000000e+00 : f32
+! CHECK: %[[VAL_9:.*]] = fir.insert_value %[[VAL_8]], %[[C0_2]], [2 : index, 1 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C24:.*]] = arith.constant 2.400000e+00 : f32
+! CHECK: %[[VAL_10:.*]] = fir.insert_value %[[VAL_9]], %[[C24]], [3 : index, 1 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C0_3:.*]] = arith.constant 0.000000e+00 : f32
+! CHECK: %[[VAL_11:.*]] = fir.insert_value %[[VAL_10]], %[[C0_3]], [4 : index, 1 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C1_3:.*]] = arith.constant 1.000000e+00 : f32
+! CHECK: %[[VAL_12:.*]] = fir.insert_on_range %[[VAL_11]], %[[C1_3]] from (0, 2) to (1, 2) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C0_4:.*]] = arith.constant 0.000000e+00 : f32
+! CHECK: %[[VAL_13:.*]] = fir.insert_value %[[VAL_12]], %[[C0_4]], [2 : index, 2 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C24_2:.*]] = arith.constant 2.400000e+00 : f32
+! CHECK: %[[VAL_14:.*]] = fir.insert_value %[[VAL_13]], %[[C24_2]], [3 : index, 2 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C0_5:.*]] = arith.constant 0.000000e+00 : f32
+! CHECK: %[[VAL_15:.*]] = fir.insert_on_range %[[VAL_14]], %[[C0_5]] from (4, 2) to (2, 3) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C24_3:.*]] = arith.constant 2.400000e+00 : f32
+! CHECK: %[[VAL_16:.*]] = fir.insert_value %[[VAL_15]], %[[C24_3]], [3 : index, 3 : index] : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
+! CHECK: %[[C0_6:.*]] = arith.constant 0.000000e+00 : f32
+! CHECK: %[[VAL_17:.*]] = fir.insert_on_range %[[VAL_16]], %[[C0_6]] from (4, 3) to (4, 4) : (!fir.array<5x5xf32>, f32) -> !fir.array<5x5xf32>
! CHECK: %[[VAL_18:.*]] = fir.insert_value %[[VAL_4]], %[[VAL_17]], [0 : index] : (tuple<!fir.array<5x5xf32>>, !fir.array<5x5xf32>) -> tuple<!fir.array<5x5xf32>>
! CHECK: fir.has_value %[[VAL_18]] : tuple<!fir.array<5x5xf32>>
@@ -35,63 +44,67 @@ subroutine s(i,j,k,ii,jj,kk,a1,a2,a3,a4,a5,a6,a7)
integer a6(6:i,j:*)
real a7(i:70,7:j,k:80)
- ! CHECK-LABEL: BeginExternalListOutput
- ! CHECK-DAG: fir.load %arg3 :
- ! CHECK-DAG: %[[i1:.*]] = arith.subi %{{.*}}, %[[one:c1.*]] :
- ! CHECK: fir.load %arg4 :
- ! CHECK: %[[j1:.*]] = arith.subi %{{.*}}, %[[one]] :
- ! CHECK: fir.coordinate_of %arg6, %[[i1]], %[[j1]] :
- ! CHECK-LABEL: EndIoStatement
+ ! CHECK-LABEL: @_QPs
+ ! CHECK: %[[a1:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEa1"}
+ ! CHECK: %[[a2:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEa2"}
+ ! CHECK: %[[a3:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEa3"}
+ ! CHECK: %[[a4:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEa4"}
+ ! CHECK: %[[ii:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEii"}
+ ! CHECK: %[[jj:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEjj"}
+ ! CHECK: %[[kk:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEkk"}
+ ! CHECK: %[[a5:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEa5"}
+ ! CHECK: %[[a6:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEa6"}
+ ! CHECK: %[[a7:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFsEa7"}
+
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
+ ! CHECK: %[[ii_val:.*]] = fir.load %[[ii]]#0
+ ! CHECK: %[[jj_val:.*]] = fir.load %[[jj]]#0
+ ! CHECK: %[[addr:.*]] = hlfir.designate %[[a1]]#0 ({{.*}}, {{.*}})
+ ! CHECK: %[[val:.*]] = fir.load %[[addr]]
+ ! CHECK: fir.call @_FortranAioOutputReal32({{.*}}, %[[val]])
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print *, a1(ii,jj)
- ! CHECK-LABEL: BeginExternalListOutput
- ! CHECK: fir.coordinate_of %{{[0-9]+}}, %{{[0-9]+}} : {{.*}} -> !fir.ref<i32>
- ! CHECK-LABEL: EndIoStatement
+
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
+ ! CHECK: %[[addr:.*]] = hlfir.designate %[[a2]]#0 ({{.*}}, {{.*}})
+ ! CHECK: %[[val:.*]] = fir.load %[[addr]]
+ ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[val]])
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print *, a2(ii,jj)
- ! CHECK-LABEL: BeginExternalListOutput
- ! CHECK-DAG: fir.load %arg3 :
- ! CHECK-DAG: %[[cc2:.*]] = fir.convert %c2{{.*}} :
- ! CHECK: %[[i2:.*]] = arith.subi %{{.*}}, %[[cc2]] :
- ! CHECK-DAG: fir.load %arg4 :
- ! CHECK-DAG: %[[cc3:.*]] = fir.convert %c3{{.*}} :
- ! CHECK: %[[j2:.*]] = arith.subi %{{.*}}, %[[cc3]] :
- ! CHECK: fir.coordinate_of %arg8, %[[i2]], %[[j2]] :
- ! CHECK-LABEL: EndIoStatement
+
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
+ ! CHECK: %[[addr:.*]] = hlfir.designate %[[a3]]#0 ({{.*}}, {{.*}})
+ ! CHECK: %[[val:.*]] = fir.load %[[addr]]
+ ! CHECK: fir.call @_FortranAioOutputReal32({{.*}}, %[[val]])
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print *, a3(ii,jj)
- ! CHECK-LABEL: BeginExternalListOutput
- ! CHECK-LABEL: EndIoStatement
+
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
+ ! CHECK: %[[addr:.*]] = hlfir.designate %[[a4]]#0 ({{.*}}, {{.*}})
+ ! CHECK: %[[val:.*]] = fir.load %[[addr]]
+ ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[val]])
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print *, a4(ii,jj)
- ! CHECK-LABEL: BeginExternalListOutput
- ! CHECK: fir.load %arg5 :
- ! CHECK: %[[x5:.*]] = arith.subi %{{.*}}, %{{.*}} :
- ! CHECK: fir.coordinate_of %arg10, %[[x5]] :
- ! CHECK-LABEL: EndIoStatement
+
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
+ ! CHECK: %[[addr:.*]] = hlfir.designate %[[a5]]#0 ({{.*}})
+ ! CHECK: %[[val:.*]] = fir.load %[[addr]]
+ ! CHECK: fir.call @_FortranAioOutputReal32({{.*}}, %[[val]])
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print *, a5(kk)
- ! CHECK-LABEL: BeginExternalListOutput
- ! CHECK: %[[a6:.*]] = fir.convert %arg11 : {{.*}} -> !fir.ref<!fir.array<?xi32>>
- ! CHECK: fir.load %arg3 :
- ! CHECK-DAG: %[[x6:.*]] = arith.subi %{{.*}}, %{{.*}} :
- ! CHECK-DAG: fir.load %arg4 :
- ! CHECK: %[[y6:.*]] = arith.subi %{{.*}}, %{{.*}} :
- ! CHECK: %[[z6:.*]] = arith.muli %{{.}}, %[[y6]] :
- ! CHECK: %[[w6:.*]] = arith.addi %[[z6]], %[[x6]] :
- ! CHECK: fir.coordinate_of %[[a6]], %[[w6]] :
- ! CHECK-LABEL: EndIoStatement
+
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
+ ! CHECK: %[[addr:.*]] = hlfir.designate %[[a6]]#0 ({{.*}}, {{.*}})
+ ! CHECK: %[[val:.*]] = fir.load %[[addr]]
+ ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[val]])
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print *, a6(ii, jj)
- ! CHECK-LABEL: BeginExternalListOutput
- ! CHECK: %[[a7:.*]] = fir.convert %arg12 : {{.*}} -> !fir.ref<!fir.array<?xf32>>
- ! CHECK: fir.load %arg5 :
- ! CHECK-DAG: %[[x7:.*]] = arith.subi %{{.*}}, %{{.*}} :
- ! CHECK-DAG: fir.load %arg4 :
- ! CHECK: %[[y7:.*]] = arith.subi %{{.*}}, %{{.*}} :
- ! CHECK: %[[z7:.*]] = arith.muli %[[u7:.*]], %[[y7]] :
- ! CHECK: %[[w7:.*]] = arith.addi %[[z7]], %[[x7]] :
- ! CHECK-DAG: %[[v7:.*]] = arith.muli %[[u7]], %{{.*}} :
- ! CHECK-DAG: fir.load %arg3 :
- ! CHECK: %[[r7:.*]] = arith.subi %{{.*}}, %{{.*}} :
- ! CHECK: %[[s7:.*]] = arith.muli %[[v7]], %[[r7]] :
- ! CHECK: %[[t7:.*]] = arith.addi %[[s7]], %[[w7]] :
- ! CHECK: fir.coordinate_of %[[a7]], %[[t7]] :
- ! CHECK-LABEL: EndIoStatement
+
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
+ ! CHECK: %[[addr:.*]] = hlfir.designate %[[a7]]#0 ({{.*}}, {{.*}}, {{.*}})
+ ! CHECK: %[[val:.*]] = fir.load %[[addr]]
+ ! CHECK: fir.call @_FortranAioOutputReal32({{.*}}, %[[val]])
+ ! CHECK: fir.call @_FortranAioEndIoStatement
print *, a7(kk, jj, ii)
end subroutine s
>From 47e95de1703c27ee6859bbc11d3d29f94a52482d Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Wed, 14 Jan 2026 10:24:50 -0500
Subject: [PATCH 2/2] Per PR review discussion, don't need -fwrapv for this
test
---
flang/test/Lower/array-expression-assumed-size.f90 | 3 ---
1 file changed, 3 deletions(-)
diff --git a/flang/test/Lower/array-expression-assumed-size.f90 b/flang/test/Lower/array-expression-assumed-size.f90
index 29962c8ec3cf1..fdaf9a5d53aad 100644
--- a/flang/test/Lower/array-expression-assumed-size.f90
+++ b/flang/test/Lower/array-expression-assumed-size.f90
@@ -1,7 +1,4 @@
! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
-! RUN: bbc -emit-hlfir -fwrapv %s -o - | FileCheck %s
-! Note: with the old lowering, -fwrapv made a differents in FIR output.
-! With lowering to HLFIR, there's no difference at HLFIR level.
subroutine assumed_size_test(a)
integer :: a(10,*)
More information about the flang-commits
mailing list