[flang-commits] [flang] a58268a - [flang][NFC] Converted five tests from old lowering to new lowering (part 16) (#180866)

via flang-commits flang-commits at lists.llvm.org
Wed Feb 11 06:29:04 PST 2026


Author: Eugene Epshteyn
Date: 2026-02-11T09:28:59-05:00
New Revision: a58268a77cdbfeb0b71f3e76d169ddd7edf7a4df

URL: https://github.com/llvm/llvm-project/commit/a58268a77cdbfeb0b71f3e76d169ddd7edf7a4df
DIFF: https://github.com/llvm/llvm-project/commit/a58268a77cdbfeb0b71f3e76d169ddd7edf7a4df.diff

LOG: [flang][NFC] Converted five tests from old lowering to new lowering (part 16) (#180866)

Tests converted from test/Lower: fail_image.f90,
test/Lower/forall: array-constructor.f90, array-pointer.f90,
array-subscripts.f90, character-1.f90

Added: 
    

Modified: 
    flang/test/Lower/fail_image.f90
    flang/test/Lower/forall/array-constructor.f90
    flang/test/Lower/forall/array-pointer.f90
    flang/test/Lower/forall/array-subscripts.f90
    flang/test/Lower/forall/character-1.f90

Removed: 
    


################################################################################
diff  --git a/flang/test/Lower/fail_image.f90 b/flang/test/Lower/fail_image.f90
index 08be8e19402d2..ae5152907c2ba 100644
--- a/flang/test/Lower/fail_image.f90
+++ b/flang/test/Lower/fail_image.f90
@@ -1,20 +1,23 @@
-! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
-! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
 
-! CHECK-LABEL: func @_QPfail_image_test
+! CHECK-LABEL: func.func @_QPfail_image_test(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "fail"}) {
 subroutine fail_image_test(fail)
   logical :: fail
-! CHECK:  cond_br {{.*}}, ^[[BB1:.*]], ^[[BB2:.*]]
+! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]]
+! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<!fir.logical<4>>
+! CHECK:  %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (!fir.logical<4>) -> i1
+! CHECK:  cf.cond_br %[[VAL_3]], ^[[BB1:.*]], ^[[BB2:.*]]
 ! CHECK: ^[[BB1]]:
   if (fail) then
-! CHECK: fir.call @_FortranAFailImageStatement() {{.*}}:
+! CHECK: fir.call @_FortranAFailImageStatement() {{.*}}: () -> ()
 ! CHECK-NEXT:  fir.unreachable
    FAIL IMAGE
   end if
 ! CHECK: ^[[BB2]]:
-! CHECK-NEXT:  br ^[[BB3:.*]]
-! CHECK-NEXT: ^[[BB3]]
+! CHECK-NEXT:  cf.br ^[[BB3:.*]]
+! CHECK-NEXT: ^[[BB3]]:
 ! CHECK-NEXT:  return
   return
 end subroutine
-! CHECK-LABEL: func private @_FortranAFailImageStatement() attributes {fir.runtime}
+! CHECK-LABEL: func.func private @_FortranAFailImageStatement() attributes {fir.runtime}

diff  --git a/flang/test/Lower/forall/array-constructor.f90 b/flang/test/Lower/forall/array-constructor.f90
index 6b6b46fdd4688..a48404dfc9b29 100644
--- a/flang/test/Lower/forall/array-constructor.f90
+++ b/flang/test/Lower/forall/array-constructor.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
 
 subroutine ac1(arr,n)
   integer :: arr(:), n
@@ -12,120 +12,56 @@ pure integer function func(a)
   end function func
 end subroutine ac1
 
-! CHECK-LABEL: func @_QPac1(
-! CHECK-SAME:               %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arr"},
-! CHECK-SAME:               %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "n"}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca index {bindc_name = ".buff.pos"}
-! CHECK:         %[[VAL_3:.*]] = fir.alloca index {bindc_name = ".buff.size"}
-! CHECK:         %[[VAL_4:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_5:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
-! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index
-! CHECK:         %[[VAL_9:.*]] = arith.constant 2 : i32
-! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index
-! CHECK:         %[[VAL_11:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_12:.*]] = fir.do_loop %[[VAL_13:.*]] = %[[VAL_6]] to %[[VAL_8]] step %[[VAL_10]] unordered iter_args(%[[VAL_14:.*]] = %[[VAL_11]]) -> (!fir.array<?xi32>) {
-! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_13]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_15]] to %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_16:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_17:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (i32) -> i64
-! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i64) -> index
-! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index
-! CHECK:           %[[VAL_22:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_23:.*]] = arith.constant 2 : i32
-! CHECK:           %[[VAL_24:.*]] = arith.addi %[[VAL_22]], %[[VAL_23]] : i32
-! CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i32) -> i64
-! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i64) -> index
-! CHECK:           %[[VAL_27:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_28:.*]] = arith.subi %[[VAL_26]], %[[VAL_19]] : index
-! CHECK:           %[[VAL_29:.*]] = arith.addi %[[VAL_28]], %[[VAL_21]] : index
-! CHECK:           %[[VAL_30:.*]] = arith.divsi %[[VAL_29]], %[[VAL_21]] : index
-! CHECK:           %[[VAL_31:.*]] = arith.cmpi sgt, %[[VAL_30]], %[[VAL_27]] : index
-! CHECK:           %[[VAL_32:.*]] = arith.select %[[VAL_31]], %[[VAL_30]], %[[VAL_27]] : index
-! CHECK:           %[[VAL_33:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_34:.*]] = arith.constant 0 : index
-! CHECK:           fir.store %[[VAL_34]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_35:.*]] = fir.allocmem !fir.array<1xi32>
-! CHECK:           %[[VAL_36:.*]] = arith.constant 1 : index
-! CHECK:           fir.store %[[VAL_36]] to %[[VAL_3]] : !fir.ref<index>
-! CHECK:           %[[VAL_37:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_38:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_39:.*]] = fir.zero_bits !fir.ref<!fir.array<1xi32>>
-! CHECK:           %[[VAL_40:.*]] = fir.coordinate_of %[[VAL_39]], %[[VAL_38]] : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32>
-! CHECK:           %[[VAL_41:.*]] = fir.convert %[[VAL_40]] : (!fir.ref<i32>) -> index
-! CHECK:           %[[VAL_42:.*]] = fir.load %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_43:.*]] = fir.load %[[VAL_3]] : !fir.ref<index>
-! CHECK:           %[[VAL_44:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_45:.*]] = arith.addi %[[VAL_42]], %[[VAL_44]] : index
-! CHECK:           %[[VAL_46:.*]] = arith.cmpi sle, %[[VAL_43]], %[[VAL_45]] : index
-! CHECK:           %[[VAL_47:.*]] = fir.if %[[VAL_46]] -> (!fir.heap<!fir.array<1xi32>>) {
-! CHECK:             %[[VAL_48:.*]] = arith.constant 2 : index
-! CHECK:             %[[VAL_49:.*]] = arith.muli %[[VAL_45]], %[[VAL_48]] : index
-! CHECK:             fir.store %[[VAL_49]] to %[[VAL_3]] : !fir.ref<index>
-! CHECK:             %[[VAL_50:.*]] = arith.muli %[[VAL_49]], %[[VAL_41]] : index
-! CHECK:             %[[VAL_51:.*]] = fir.convert %[[VAL_35]] : (!fir.heap<!fir.array<1xi32>>) -> !fir.ref<i8>
-! CHECK:             %[[VAL_52:.*]] = fir.convert %[[VAL_50]] : (index) -> i64
-! CHECK:             %[[VAL_53:.*]] = fir.call @realloc(%[[VAL_51]], %[[VAL_52]]) {{.*}}: (!fir.ref<i8>, i64) -> !fir.ref<i8>
-! CHECK:             %[[VAL_54:.*]] = fir.convert %[[VAL_53]] : (!fir.ref<i8>) -> !fir.heap<!fir.array<1xi32>>
-! CHECK:             fir.result %[[VAL_54]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           } else {
-! CHECK:             fir.result %[[VAL_35]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           }
-! CHECK:           %[[VAL_55:.*]] = fir.coordinate_of %[[VAL_56:.*]], %[[VAL_42]] : (!fir.heap<!fir.array<1xi32>>, index) -> !fir.ref<i32>
-! CHECK:           fir.store %[[VAL_37]] to %[[VAL_55]] : !fir.ref<i32>
-! CHECK:           fir.store %[[VAL_45]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_57:.*]] = fir.load %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_58:.*]] = fir.shape %[[VAL_57]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_59:.*]] = fir.array_load %[[VAL_56]](%[[VAL_58]]) : (!fir.heap<!fir.array<1xi32>>, !fir.shape<1>) -> !fir.array<1xi32>
-! CHECK:           %[[VAL_60:.*]] = fir.allocmem !fir.array<1xi32>
-! CHECK:           %[[VAL_61:.*]] = fir.shape %[[VAL_33]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_62:.*]] = fir.array_load %[[VAL_60]](%[[VAL_61]]) : (!fir.heap<!fir.array<1xi32>>, !fir.shape<1>) -> !fir.array<1xi32>
-! CHECK:           %[[VAL_63:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_64:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_65:.*]] = arith.subi %[[VAL_33]], %[[VAL_63]] : index
-! CHECK:           %[[VAL_66:.*]] = fir.do_loop %[[VAL_67:.*]] = %[[VAL_64]] to %[[VAL_65]] step %[[VAL_63]] unordered iter_args(%[[VAL_68:.*]] = %[[VAL_62]]) -> (!fir.array<1xi32>) {
-! CHECK:             %[[VAL_69:.*]] = fir.array_fetch %[[VAL_59]], %[[VAL_67]] : (!fir.array<1xi32>, index) -> i32
-! CHECK:             %[[VAL_70:.*]] = fir.array_update %[[VAL_68]], %[[VAL_69]], %[[VAL_67]] : (!fir.array<1xi32>, i32, index) -> !fir.array<1xi32>
-! CHECK:             fir.result %[[VAL_70]] : !fir.array<1xi32>
-! CHECK:           }
-! CHECK:           fir.array_merge_store %[[VAL_62]], %[[VAL_71:.*]] to %[[VAL_60]] : !fir.array<1xi32>, !fir.array<1xi32>, !fir.heap<!fir.array<1xi32>>
-! CHECK:           %[[VAL_72:.*]] = fir.shape %[[VAL_33]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_73:.*]] = fir.embox %[[VAL_60]](%[[VAL_72]]) : (!fir.heap<!fir.array<1xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<1xi32>>
-! CHECK:           %[[VAL_74:.*]] = fir.convert %[[VAL_73]] : (!fir.box<!fir.array<1xi32>>) -> !fir.box<!fir.array<?xi32>>
-! CHECK:           %[[VAL_75:.*]] = fir.call @_QFac1Pfunc(%[[VAL_74]]) {{.*}}: (!fir.box<!fir.array<?xi32>>) -> i32
-! CHECK:           %[[VAL_76:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_77:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_78:.*]] = arith.subi %[[VAL_32]], %[[VAL_76]] : index
-! CHECK:           %[[VAL_79:.*]] = fir.do_loop %[[VAL_80:.*]] = %[[VAL_77]] to %[[VAL_78]] step %[[VAL_76]] unordered iter_args(%[[VAL_81:.*]] = %[[VAL_14]]) -> (!fir.array<?xi32>) {
-! CHECK:             %[[VAL_82:.*]] = arith.subi %[[VAL_19]], %[[VAL_16]] : index
-! CHECK:             %[[VAL_83:.*]] = arith.muli %[[VAL_80]], %[[VAL_21]] : index
-! CHECK:             %[[VAL_84:.*]] = arith.addi %[[VAL_82]], %[[VAL_83]] : index
-! CHECK:             %[[VAL_85:.*]] = fir.array_update %[[VAL_81]], %[[VAL_75]], %[[VAL_84]] : (!fir.array<?xi32>, i32, index) -> !fir.array<?xi32>
-! CHECK:             fir.result %[[VAL_85]] : !fir.array<?xi32>
-! CHECK:           }
-! CHECK:           fir.freemem %[[VAL_60]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           fir.freemem %[[VAL_56]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           fir.result %[[VAL_86:.*]] : !fir.array<?xi32>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_11]], %[[VAL_87:.*]] to %[[VAL_0]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.box<!fir.array<?xi32>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPac1(
+! CHECK-SAME: %[[ARR_ARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}, %[[N_ARG:.*]]: !fir.ref<i32> {{.*}}) {
+! CHECK: %[[ARR:.*]]:2 = hlfir.declare %[[ARR_ARG]]
+! CHECK: %[[N:.*]]:2 = hlfir.declare %[[N_ARG]]
+! CHECK: %[[C1_I32:.*]] = arith.constant 1 : i32
+! CHECK: %[[N_VAL:.*]] = fir.load %[[N]]#0 : !fir.ref<i32>
+! CHECK: %[[C2_I32:.*]] = arith.constant 2 : i32
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield %[[C1_I32]] : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield %[[N_VAL]] : i32
+! CHECK: } step {
+! CHECK:   hlfir.yield %[[C2_I32]] : i32
+! CHECK: }  (%[[I_VAL:.*]]: i32) {
+! CHECK:   %[[I_REF:.*]] = hlfir.forall_index "i" %[[I_VAL]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[C1_IDX:.*]] = arith.constant 1 : index
+! CHECK:     %[[TMP:.*]] = fir.allocmem !fir.array<1xi32>
+! CHECK:     %[[SHAPE:.*]] = fir.shape %[[C1_IDX]] : (index) -> !fir.shape<1>
+! CHECK:     %[[TMP_DECL:.*]]:2 = hlfir.declare %[[TMP]](%[[SHAPE]])
+! CHECK:     %[[I_VAL_LOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>
+! CHECK:     %[[DSG:.*]] = hlfir.designate %[[TMP_DECL]]#0 ({{.*}})  : (!fir.heap<!fir.array<1xi32>>, index) -> !fir.ref<i32>
+! CHECK:     hlfir.assign %[[I_VAL_LOAD]] to %[[DSG]] : i32, !fir.ref<i32>
+! CHECK:     %[[EXPR:.*]] = hlfir.as_expr %[[TMP_DECL]]#0 move %{{.*}} : (!fir.heap<!fir.array<1xi32>>, i1) -> !hlfir.expr<1xi32>
+! CHECK:     %[[ASSOC:.*]]:3 = hlfir.associate %[[EXPR]](%[[SHAPE]])
+! CHECK:     %[[BOX:.*]] = fir.embox %[[ASSOC]]#0(%[[SHAPE]])
+! CHECK:     %[[CONV:.*]] = fir.convert %[[BOX]] : (!fir.box<!fir.array<1xi32>>) -> !fir.box<!fir.array<?xi32>>
+! CHECK:     %[[RES:.*]] = fir.call @_QFac1Pfunc(%[[CONV]]) {{.*}} : (!fir.box<!fir.array<?xi32>>) -> i32
+! CHECK:     hlfir.yield %[[RES]] : i32 cleanup {
+! CHECK:       hlfir.end_associate %[[ASSOC]]#1, %[[ASSOC]]#2
+! CHECK:       hlfir.destroy %[[EXPR]]
+! CHECK:     }
+! CHECK:   } to {
+! CHECK:     %[[LB:.*]] = fir.convert %{{.*}} : (i64) -> index
+! CHECK:     %[[UB:.*]] = fir.convert %{{.*}} : (i64) -> index
+! CHECK:     %[[DSG_LHS:.*]] = hlfir.designate %[[ARR]]#0 (%[[LB]]:%[[UB]]:{{.*}})  shape {{.*}} : (!fir.box<!fir.array<?xi32>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<?xi32>>
+! CHECK:     hlfir.yield %[[DSG_LHS]] : !fir.box<!fir.array<?xi32>>
+! CHECK:   }
+! CHECK: }
 
-! CHECK-LABEL: func private @_QFac1Pfunc(
-! CHECK-SAME:                    %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"}) -> i32 {{.*}} {
-! CHECK:         %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "func", uniq_name = "_QFac1FfuncEfunc"}
-! CHECK:         %[[VAL_2:.*]] = arith.constant 1 : i64
-! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i64
-! CHECK:         %[[VAL_4:.*]] = arith.subi %[[VAL_2]], %[[VAL_3]] : i64
-! CHECK:         %[[VAL_5:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_4]] : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>
-! CHECK:         %[[VAL_6:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
-! CHECK:         fir.store %[[VAL_6]] to %[[VAL_1]] : !fir.ref<i32>
-! CHECK:         %[[VAL_7:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
-! CHECK:         return %[[VAL_7]] : i32
-! CHECK:       }
+! CHECK-LABEL: func.func private @_QFac1Pfunc(
+! CHECK-SAME: %[[A_ARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}) -> i32
+! CHECK-SAME: attributes {
+! CHECK: %[[A:.*]]:2 = hlfir.declare %[[A_ARG]]
+! CHECK: %[[C1:.*]] = arith.constant 1 : index
+! CHECK: %[[DSG:.*]] = hlfir.designate %[[A]]#0 (%[[C1]])  : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>
+! CHECK: %[[VAL:.*]] = fir.load %[[DSG]] : !fir.ref<i32>
+! CHECK: hlfir.assign %[[VAL]] to %{{.*}}#0 : i32, !fir.ref<i32>
+! CHECK: %[[RET:.*]] = fir.load %{{.*}}#0 : !fir.ref<i32>
+! CHECK: return %[[RET]] : i32
 
 subroutine ac2(arr,n)
   integer :: arr(:), n
@@ -140,148 +76,40 @@ pure function func(a)
   end function func
 end subroutine ac2
 
-! CHECK-LABEL: func @_QPac2(
-! CHECK-SAME:               %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arr"},
-! CHECK-SAME:               %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "n"}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = ".result"}
-! CHECK:         %[[VAL_3:.*]] = fir.alloca index {bindc_name = ".buff.pos"}
-! CHECK:         %[[VAL_4:.*]] = fir.alloca index {bindc_name = ".buff.size"}
-! CHECK:         %[[VAL_5:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_6:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
-! CHECK:         %[[VAL_8:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
-! CHECK:         %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i32) -> index
-! CHECK:         %[[VAL_10:.*]] = arith.constant 2 : i32
-! CHECK:         %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i32) -> index
-! CHECK:         %[[VAL_12:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_13:.*]] = fir.do_loop %[[VAL_14:.*]] = %[[VAL_7]] to %[[VAL_9]] step %[[VAL_11]] unordered iter_args(%[[VAL_15:.*]] = %[[VAL_12]]) -> (!fir.array<?xi32>) {
-! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_14]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_16]] to %[[VAL_5]] : !fir.ref<i32>
-! CHECK:           %[[VAL_17:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_5]] : !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.constant 1 : i64
-! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i64) -> index
-! CHECK:           %[[VAL_23:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
-! CHECK:           %[[VAL_24:.*]] = arith.constant 2 : i32
-! CHECK:           %[[VAL_25:.*]] = arith.addi %[[VAL_23]], %[[VAL_24]] : i32
-! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> 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_20]] : index
-! CHECK:           %[[VAL_30:.*]] = arith.addi %[[VAL_29]], %[[VAL_22]] : index
-! CHECK:           %[[VAL_31:.*]] = arith.divsi %[[VAL_30]], %[[VAL_22]] : 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:.*]] = arith.constant 0 : index
-! CHECK:           fir.store %[[VAL_35]] to %[[VAL_3]] : !fir.ref<index>
-! CHECK:           %[[VAL_36:.*]] = fir.allocmem !fir.array<1xi32>
-! CHECK:           %[[VAL_37:.*]] = arith.constant 1 : index
-! CHECK:           fir.store %[[VAL_37]] to %[[VAL_4]] : !fir.ref<index>
-! CHECK:           %[[VAL_38:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
-! CHECK:           %[[VAL_39:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_40:.*]] = fir.zero_bits !fir.ref<!fir.array<1xi32>>
-! CHECK:           %[[VAL_41:.*]] = fir.coordinate_of %[[VAL_40]], %[[VAL_39]] : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32>
-! CHECK:           %[[VAL_42:.*]] = fir.convert %[[VAL_41]] : (!fir.ref<i32>) -> index
-! CHECK:           %[[VAL_43:.*]] = fir.load %[[VAL_3]] : !fir.ref<index>
-! CHECK:           %[[VAL_44:.*]] = fir.load %[[VAL_4]] : !fir.ref<index>
-! CHECK:           %[[VAL_45:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_46:.*]] = arith.addi %[[VAL_43]], %[[VAL_45]] : index
-! CHECK:           %[[VAL_47:.*]] = arith.cmpi sle, %[[VAL_44]], %[[VAL_46]] : index
-! CHECK:           %[[VAL_48:.*]] = fir.if %[[VAL_47]] -> (!fir.heap<!fir.array<1xi32>>) {
-! CHECK:             %[[VAL_49:.*]] = arith.constant 2 : index
-! CHECK:             %[[VAL_50:.*]] = arith.muli %[[VAL_46]], %[[VAL_49]] : index
-! CHECK:             fir.store %[[VAL_50]] to %[[VAL_4]] : !fir.ref<index>
-! CHECK:             %[[VAL_51:.*]] = arith.muli %[[VAL_50]], %[[VAL_42]] : index
-! CHECK:             %[[VAL_52:.*]] = fir.convert %[[VAL_36]] : (!fir.heap<!fir.array<1xi32>>) -> !fir.ref<i8>
-! CHECK:             %[[VAL_53:.*]] = fir.convert %[[VAL_51]] : (index) -> i64
-! CHECK:             %[[VAL_54:.*]] = fir.call @realloc(%[[VAL_52]], %[[VAL_53]]) {{.*}}: (!fir.ref<i8>, i64) -> !fir.ref<i8>
-! CHECK:             %[[VAL_55:.*]] = fir.convert %[[VAL_54]] : (!fir.ref<i8>) -> !fir.heap<!fir.array<1xi32>>
-! CHECK:             fir.result %[[VAL_55]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           } else {
-! CHECK:             fir.result %[[VAL_36]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           }
-! CHECK:           %[[VAL_56:.*]] = fir.coordinate_of %[[VAL_57:.*]], %[[VAL_43]] : (!fir.heap<!fir.array<1xi32>>, index) -> !fir.ref<i32>
-! CHECK:           fir.store %[[VAL_38]] to %[[VAL_56]] : !fir.ref<i32>
-! CHECK:           fir.store %[[VAL_46]] to %[[VAL_3]] : !fir.ref<index>
-! CHECK:           %[[VAL_58:.*]] = fir.load %[[VAL_3]] : !fir.ref<index>
-! CHECK:           %[[VAL_59:.*]] = fir.shape %[[VAL_58]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_60:.*]] = fir.array_load %[[VAL_57]](%[[VAL_59]]) : (!fir.heap<!fir.array<1xi32>>, !fir.shape<1>) -> !fir.array<1xi32>
-! CHECK:           %[[VAL_61:.*]] = fir.allocmem !fir.array<1xi32>
-! CHECK:           %[[VAL_62:.*]] = fir.shape %[[VAL_34]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_63:.*]] = fir.array_load %[[VAL_61]](%[[VAL_62]]) : (!fir.heap<!fir.array<1xi32>>, !fir.shape<1>) -> !fir.array<1xi32>
-! CHECK:           %[[VAL_64:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_65:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_66:.*]] = arith.subi %[[VAL_34]], %[[VAL_64]] : index
-! CHECK:           %[[VAL_67:.*]] = fir.do_loop %[[VAL_68:.*]] = %[[VAL_65]] to %[[VAL_66]] step %[[VAL_64]] unordered iter_args(%[[VAL_69:.*]] = %[[VAL_63]]) -> (!fir.array<1xi32>) {
-! CHECK:             %[[VAL_70:.*]] = fir.array_fetch %[[VAL_60]], %[[VAL_68]] : (!fir.array<1xi32>, index) -> i32
-! CHECK:             %[[VAL_71:.*]] = fir.array_update %[[VAL_69]], %[[VAL_70]], %[[VAL_68]] : (!fir.array<1xi32>, i32, index) -> !fir.array<1xi32>
-! CHECK:             fir.result %[[VAL_71]] : !fir.array<1xi32>
-! CHECK:           }
-! CHECK:           fir.array_merge_store %[[VAL_63]], %[[VAL_72:.*]] to %[[VAL_61]] : !fir.array<1xi32>, !fir.array<1xi32>, !fir.heap<!fir.array<1xi32>>
-! CHECK:           %[[VAL_73:.*]] = fir.shape %[[VAL_34]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_74:.*]] = fir.embox %[[VAL_61]](%[[VAL_73]]) : (!fir.heap<!fir.array<1xi32>>, !fir.shape<1>) -> !fir.box<!fir.array<1xi32>>
-! CHECK:           %[[VAL_75:.*]] = arith.constant 3 : i64
-! CHECK:           %[[VAL_76:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_77:.*]] = arith.subi %[[VAL_75]], %[[VAL_76]] : i64
-! CHECK:           %[[VAL_78:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_79:.*]] = arith.addi %[[VAL_77]], %[[VAL_78]] : i64
-! CHECK:           %[[VAL_80:.*]] = fir.convert %[[VAL_79]] : (i64) -> index
-! CHECK:           %[[C0:.*]] = arith.constant 0 : index
-! CHECK:           %[[CMPI:.*]] = arith.cmpi sgt, %[[VAL_80]], %[[C0]] : index
-! CHECK:           %[[SELECT:.*]] = arith.select %[[CMPI]], %[[VAL_80]], %[[C0]] : index
-! CHECK:           %[[VAL_82:.*]] = fir.shape %[[SELECT]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_81:.*]] = llvm.intr.stacksave : !llvm.ptr
-! CHECK:           %[[VAL_83:.*]] = fir.convert %[[VAL_74]] : (!fir.box<!fir.array<1xi32>>) -> !fir.box<!fir.array<?xi32>>
-! CHECK:           %[[VAL_84:.*]] = fir.call @_QFac2Pfunc(%[[VAL_83]]) {{.*}}: (!fir.box<!fir.array<?xi32>>) -> !fir.array<3xi32>
-! CHECK:           fir.save_result %[[VAL_84]] to %[[VAL_2]](%[[VAL_82]]) : !fir.array<3xi32>, !fir.ref<!fir.array<3xi32>>, !fir.shape<1>
-! CHECK:           %[[VAL_85:.*]] = fir.shape %[[SELECT]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_86:.*]] = fir.array_load %[[VAL_2]](%[[VAL_85]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.array<3xi32>
-! CHECK:           %[[VAL_87:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_88:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_89:.*]] = arith.subi %[[VAL_33]], %[[VAL_87]] : index
-! CHECK:           %[[VAL_90:.*]] = fir.do_loop %[[VAL_91:.*]] = %[[VAL_88]] to %[[VAL_89]] step %[[VAL_87]] unordered iter_args(%[[VAL_92:.*]] = %[[VAL_15]]) -> (!fir.array<?xi32>) {
-! CHECK:             %[[VAL_93:.*]] = fir.array_fetch %[[VAL_86]], %[[VAL_91]] : (!fir.array<3xi32>, index) -> i32
-! CHECK:             %[[VAL_94:.*]] = arith.subi %[[VAL_20]], %[[VAL_17]] : index
-! CHECK:             %[[VAL_95:.*]] = arith.muli %[[VAL_91]], %[[VAL_22]] : index
-! CHECK:             %[[VAL_96:.*]] = arith.addi %[[VAL_94]], %[[VAL_95]] : index
-! CHECK:             %[[VAL_97:.*]] = fir.array_update %[[VAL_92]], %[[VAL_93]], %[[VAL_96]] : (!fir.array<?xi32>, i32, index) -> !fir.array<?xi32>
-! CHECK:             fir.result %[[VAL_97]] : !fir.array<?xi32>
-! CHECK:           }
-! CHECK:           llvm.intr.stackrestore %[[VAL_81]] : !llvm.ptr
-! CHECK:           fir.freemem %[[VAL_61]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           fir.freemem %[[VAL_57]] : !fir.heap<!fir.array<1xi32>>
-! CHECK:           fir.result %[[VAL_98:.*]] : !fir.array<?xi32>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_12]], %[[VAL_99:.*]] to %[[VAL_0]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.box<!fir.array<?xi32>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPac2(
+! CHECK-SAME: %[[ARR_ARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}, %[[N_ARG:.*]]: !fir.ref<i32> {{.*}}) {
+! CHECK: %[[ARR:.*]]:2 = hlfir.declare %[[ARR_ARG]]
+! CHECK: %[[N:.*]]:2 = hlfir.declare %[[N_ARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield %{{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield %{{.*}} : i32
+! CHECK: } step {
+! CHECK:   hlfir.yield %{{.*}} : i32
+! CHECK: }  (%[[I_VAL:.*]]: i32) {
+! CHECK:   %[[I_REF:.*]] = hlfir.forall_index "i" %[[I_VAL]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[EVAL:.*]] = hlfir.eval_in_mem {{.*}} -> !hlfir.expr<3xi32> {
+! CHECK:     ^bb0(%[[RES_REF:.*]]: !fir.ref<!fir.array<3xi32>>):
+! CHECK:       %[[CALL_RES:.*]] = fir.call @_QFac2Pfunc(%{{.*}}) {{.*}} : (!fir.box<!fir.array<?xi32>>) -> !fir.array<3xi32>
+! CHECK:       fir.save_result %[[CALL_RES]] to %[[RES_REF]]({{.*}})
+! CHECK:     }
+! CHECK:     hlfir.yield %[[EVAL]] : !hlfir.expr<3xi32> cleanup {
+! CHECK:       hlfir.destroy %[[EVAL]]
+! CHECK:     }
+! CHECK:   } to {
+! CHECK:     %[[LB:.*]] = fir.convert %{{.*}} : (i64) -> index
+! CHECK:     %[[UB:.*]] = fir.convert %{{.*}} : (i64) -> index
+! CHECK:     %[[DSG_LHS:.*]] = hlfir.designate %[[ARR]]#0 (%[[LB]]:%[[UB]]:{{.*}})  shape {{.*}} : (!fir.box<!fir.array<?xi32>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<?xi32>>
+! CHECK:     hlfir.yield %[[DSG_LHS]] : !fir.box<!fir.array<?xi32>>
+! CHECK:   }
+! CHECK: }
 
-! CHECK-LABEL: func private @_QFac2Pfunc(
-! CHECK-SAME:                    %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"}) -> !fir.array<3xi32> {{.*}} {
-! CHECK:         %[[VAL_1:.*]] = arith.constant 3 : index
-! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "func", uniq_name = "_QFac2FfuncEfunc"}
-! CHECK:         %[[VAL_3:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>
-! CHECK:         %[[VAL_4:.*]] = fir.array_load %[[VAL_2]](%[[VAL_3]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.array<3xi32>
-! CHECK:         %[[VAL_5:.*]] = arith.constant 1 : i64
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i64) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : i64
-! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i64) -> index
-! CHECK:         %[[VAL_9:.*]] = arith.constant 3 : i64
-! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i64) -> index
-! CHECK:         %[[VAL_11:.*]] = fir.slice %[[VAL_6]], %[[VAL_10]], %[[VAL_8]] : (index, index, index) -> !fir.slice<1>
-! CHECK:         %[[VAL_12:.*]] = fir.array_load %[[VAL_0]] {{\[}}%[[VAL_11]]] : (!fir.box<!fir.array<?xi32>>, !fir.slice<1>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_13:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_14:.*]] = arith.constant 0 : index
-! CHECK:         %[[VAL_15:.*]] = arith.subi %[[VAL_1]], %[[VAL_13]] : index
-! CHECK:         %[[VAL_16:.*]] = fir.do_loop %[[VAL_17:.*]] = %[[VAL_14]] to %[[VAL_15]] step %[[VAL_13]] unordered iter_args(%[[VAL_18:.*]] = %[[VAL_4]]) -> (!fir.array<3xi32>) {
-! CHECK:           %[[VAL_19:.*]] = fir.array_fetch %[[VAL_12]], %[[VAL_17]] : (!fir.array<?xi32>, index) -> i32
-! CHECK:           %[[VAL_20:.*]] = fir.array_update %[[VAL_18]], %[[VAL_19]], %[[VAL_17]] : (!fir.array<3xi32>, i32, index) -> !fir.array<3xi32>
-! CHECK:           fir.result %[[VAL_20]] : !fir.array<3xi32>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_4]], %[[VAL_21:.*]] to %[[VAL_2]] : !fir.array<3xi32>, !fir.array<3xi32>, !fir.ref<!fir.array<3xi32>>
-! CHECK:         %[[VAL_22:.*]] = fir.load %[[VAL_2]] : !fir.ref<!fir.array<3xi32>>
-! CHECK:         return %[[VAL_22]] : !fir.array<3xi32>
-! CHECK:       }
+! CHECK-LABEL: func.func private @_QFac2Pfunc(
+! CHECK-SAME: %[[A_ARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}) -> !fir.array<3xi32>
+! CHECK-SAME: attributes {
+! CHECK: %[[A:.*]]:2 = hlfir.declare %[[A_ARG]]
+! CHECK: %[[DSG:.*]] = hlfir.designate %[[A]]#0 ({{.*}})  shape %{{.*}} : (!fir.box<!fir.array<?xi32>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<3xi32>>
+! CHECK: hlfir.assign %[[DSG]] to %{{.*}}#0 : !fir.box<!fir.array<3xi32>>, !fir.ref<!fir.array<3xi32>>
+! CHECK: %[[RES:.*]] = fir.load %{{.*}}#0 : !fir.ref<!fir.array<3xi32>>
+! CHECK: return %[[RES]] : !fir.array<3xi32>

diff  --git a/flang/test/Lower/forall/array-pointer.f90 b/flang/test/Lower/forall/array-pointer.f90
index 6b8c5648af29e..35dfa3d435888 100644
--- a/flang/test/Lower/forall/array-pointer.f90
+++ b/flang/test/Lower/forall/array-pointer.f90
@@ -6,7 +6,7 @@
 ! is a pointer to an array of T and never an array of pointer to T in
 ! Fortran.
 
-! RUN: bbc --use-desc-for-alloc=false -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
 
 module array_of_pointer_test
   type t
@@ -56,42 +56,32 @@ subroutine s1(x,y)
   end forall
 end subroutine s1
 
-! CHECK-LABEL: func @_QPs1(
-! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y"}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
-! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
-! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
-! CHECK:           %[[VAL_19:.*]] = fir.array_fetch %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> i32
-! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
-! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index
-! CHECK:           %[[VAL_24:.*]] = arith.subi %[[VAL_23]], %[[VAL_20]] : index
-! CHECK:           %[[VAL_25:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
-! CHECK:           %[[VAL_26:.*]] = fir.array_access %[[VAL_12]], %[[VAL_24]], %[[VAL_25]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
-! CHECK:           %[[VAL_27:.*]] = fir.load %[[VAL_26]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
-! CHECK:           %[[VAL_28:.*]] = fir.box_addr %[[VAL_27]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
-! CHECK:           fir.store %[[VAL_19]] to %[[VAL_28]] : !fir.ptr<i32>
-! CHECK:           %[[VAL_29:.*]] = fir.array_amend %[[VAL_12]], %[[VAL_26]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           fir.result %[[VAL_29]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_30:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs1(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {{.*}}, %[[YARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[Y]]#0 (%[[IIDX]])
+! CHECK:     %[[YIVAL:.*]] = fir.load %[[YI]] : !fir.ref<i32>
+! CHECK:     hlfir.yield %[[YIVAL]] : i32
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     %[[IPBOX:.*]] = fir.load %[[XIIP]]
+! CHECK:     %[[IPADDR:.*]] = fir.box_addr %[[IPBOX]]
+! CHECK:     hlfir.yield %[[IPADDR]] : !fir.ptr<i32>
+! CHECK:   }
+! CHECK: }
 
 subroutine s1_1(x,y)
   use array_of_pointer_test
@@ -104,46 +94,32 @@ subroutine s1_1(x,y)
   end forall
 end subroutine s1_1
 
-! CHECK-LABEL: func @_QPs1_1(
-! CHECK-SAME:                %[[VAL_0:.*]]: !fir.ref<!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>> {fir.bindc_name = "y"}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = arith.constant 10 : index
-! CHECK:         %[[VAL_4:.*]] = arith.constant 10 : index
-! CHECK:         %[[VAL_5:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index
-! CHECK:         %[[VAL_9:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_10:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
-! CHECK:         %[[VAL_11:.*]] = fir.array_load %[[VAL_0]](%[[VAL_10]]) : (!fir.ref<!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>, !fir.shape<1>) -> !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         %[[VAL_12:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
-! CHECK:         %[[VAL_13:.*]] = fir.array_load %[[VAL_1]](%[[VAL_12]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
-! CHECK:         %[[VAL_14:.*]] = fir.do_loop %[[VAL_15:.*]] = %[[VAL_6]] to %[[VAL_8]] step %[[VAL_9]] unordered iter_args(%[[VAL_16:.*]] = %[[VAL_11]]) -> (!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_17]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_18:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
-! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index
-! CHECK:           %[[VAL_22:.*]] = arith.subi %[[VAL_21]], %[[VAL_18]] : index
-! CHECK:           %[[VAL_23:.*]] = fir.array_fetch %[[VAL_13]], %[[VAL_22]] : (!fir.array<10xi32>, index) -> i32
-! CHECK:           %[[VAL_24:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_25:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> i64
-! CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i64) -> index
-! CHECK:           %[[VAL_28:.*]] = arith.subi %[[VAL_27]], %[[VAL_24]] : index
-! CHECK:           %[[VAL_29:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
-! CHECK:           %[[VAL_30:.*]] = fir.array_access %[[VAL_16]], %[[VAL_28]], %[[VAL_29]] : (!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
-! CHECK:           %[[VAL_31:.*]] = fir.load %[[VAL_30]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
-! CHECK:           %[[VAL_32:.*]] = fir.box_addr %[[VAL_31]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
-! CHECK:           fir.store %[[VAL_23]] to %[[VAL_32]] : !fir.ptr<i32>
-! CHECK:           %[[VAL_33:.*]] = fir.array_amend %[[VAL_16]], %[[VAL_30]] : (!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           fir.result %[[VAL_33]] : !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_11]], %[[VAL_34:.*]] to %[[VAL_0]] : !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.ref<!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs1_1(
+! CHECK-SAME: %[[XARG:.*]]: !fir.ref<!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {{.*}}, %[[YARG:.*]]: !fir.ref<!fir.array<10xi32>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[Y]]#0 (%[[IIDX]])
+! CHECK:     %[[YIVAL:.*]] = fir.load %[[YI]] : !fir.ref<i32>
+! CHECK:     hlfir.yield %[[YIVAL]] : i32
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     %[[IPBOX:.*]] = fir.load %[[XIIP]]
+! CHECK:     %[[IPADDR:.*]] = fir.box_addr %[[IPBOX]]
+! CHECK:     hlfir.yield %[[IPADDR]] : !fir.ptr<i32>
+! CHECK:   }
+! CHECK: }
 
 ! Dependent type assignment, TODO
 !subroutine s1_2(x,y,l)
@@ -168,40 +144,30 @@ subroutine s2(x,y)
   end forall
 end subroutine s2
 
-! CHECK-LABEL: func @_QPs2(
-! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
-! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
-! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
-! CHECK:           %[[VAL_19:.*]] = fir.array_access %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
-! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK:           %[[VAL_21:.*]] = fir.embox %[[VAL_20]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
-! CHECK:           %[[VAL_22:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_23:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i32) -> i64
-! CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i64) -> index
-! CHECK:           %[[VAL_26:.*]] = arith.subi %[[VAL_25]], %[[VAL_22]] : index
-! CHECK:           %[[VAL_27:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
-! CHECK:           %[[VAL_28:.*]] = fir.array_update %[[VAL_12]], %[[VAL_21]], %[[VAL_26]], %[[VAL_27]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           fir.result %[[VAL_28]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_29:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs2(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {{.*}}, %[[YARG:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[Y]]#0 (%[[IIDX]])
+! CHECK:     %[[YIBOX:.*]] = fir.embox %[[YI]] : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
+! CHECK:     hlfir.yield %[[YIBOX]] : !fir.box<!fir.ptr<i32>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     hlfir.yield %[[XIIP]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK:   }
+! CHECK: }
 
 subroutine s2_1(x,y)
   use array_of_pointer_test
@@ -214,43 +180,31 @@ subroutine s2_1(x,y)
   end forall
 end subroutine s2_1
 
-! CHECK-LABEL: func @_QPs2_1(
-! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "y"}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
-! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         %[[VAL_9:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
-! CHECK:         %[[VAL_10:.*]] = arith.constant 0 : index
-! CHECK:         %[[VAL_11:.*]]:3 = fir.box_dims %[[VAL_9]], %[[VAL_10]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_12:.*]] = fir.shift %[[VAL_11]]#0 : (index) -> !fir.shift<1>
-! CHECK:         %[[VAL_13:.*]] = fir.array_load %[[VAL_9]](%[[VAL_12]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_14:.*]] = fir.do_loop %[[VAL_15:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_16:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_17]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_2]] : !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_11]]#0 : index
-! CHECK:           %[[VAL_22:.*]] = fir.array_access %[[VAL_13]], %[[VAL_21]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
-! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK:           %[[VAL_24:.*]] = fir.embox %[[VAL_23]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
-! CHECK:           %[[VAL_25:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_26:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i32) -> i64
-! CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index
-! CHECK:           %[[VAL_29:.*]] = arith.subi %[[VAL_28]], %[[VAL_25]] : index
-! CHECK:           %[[VAL_30:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
-! CHECK:           %[[VAL_31:.*]] = fir.array_update %[[VAL_16]], %[[VAL_24]], %[[VAL_29]], %[[VAL_30]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           fir.result %[[VAL_31]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_32:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs2_1(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {{.*}}, %[[YARG:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[YBOX:.*]] = fir.load %[[Y]]#0
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[YBOX]] (%[[IIDX]])
+! CHECK:     %[[YIBOX:.*]] = fir.embox %[[YI]] : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
+! CHECK:     hlfir.yield %[[YIBOX]] : !fir.box<!fir.ptr<i32>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     hlfir.yield %[[XIIP]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK:   }
+! CHECK: }
 
 subroutine s2_2(x,y)
   use array_of_pointer_test
@@ -263,44 +217,31 @@ subroutine s2_2(x,y)
   end forall
 end subroutine s2_2
 
-! CHECK-LABEL: func @_QPs2_2(
-! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {fir.bindc_name = "y", fir.target}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
-! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         %[[VAL_9:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
-! CHECK:         %[[VAL_10:.*]] = arith.constant 0 : index
-! CHECK:         %[[VAL_11:.*]]:3 = fir.box_dims %[[VAL_9]], %[[VAL_10]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_12:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
-! CHECK:         %[[VAL_13:.*]] = fir.shape_shift %[[VAL_11]]#0, %[[VAL_11]]#1 : (index, index) -> !fir.shapeshift<1>
-! CHECK:         %[[VAL_14:.*]] = fir.array_load %[[VAL_12]](%[[VAL_13]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shapeshift<1>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
-! CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_16]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_18]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
-! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index
-! CHECK:           %[[VAL_22:.*]] = arith.subi %[[VAL_21]], %[[VAL_11]]#0 : index
-! CHECK:           %[[VAL_23:.*]] = fir.array_access %[[VAL_14]], %[[VAL_22]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
-! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK:           %[[VAL_25:.*]] = fir.embox %[[VAL_24]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
-! CHECK:           %[[VAL_26:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_27:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i32) -> i64
-! CHECK:           %[[VAL_29:.*]] = fir.convert %[[VAL_28]] : (i64) -> index
-! CHECK:           %[[VAL_30:.*]] = arith.subi %[[VAL_29]], %[[VAL_26]] : index
-! CHECK:           %[[VAL_31:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
-! CHECK:           %[[VAL_32:.*]] = fir.array_update %[[VAL_17]], %[[VAL_25]], %[[VAL_30]], %[[VAL_31]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           fir.result %[[VAL_32]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_33:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs2_2(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {{.*}}, %[[YARG:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[YBOX:.*]] = fir.load %[[Y]]#0
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[YBOX]] (%[[IIDX]])
+! CHECK:     %[[YIBOX:.*]] = fir.embox %[[YI]] : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
+! CHECK:     hlfir.yield %[[YIBOX]] : !fir.box<!fir.ptr<i32>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     hlfir.yield %[[XIIP]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK:   }
+! CHECK: }
 
 subroutine s2_3(x)
   use array_of_pointer_test
@@ -315,47 +256,32 @@ subroutine s2_3(x)
   ! x's pointers will remain associated, and may point to deallocated y.
 end subroutine s2_3
 
-! CHECK-LABEL: func @_QPs2_3(
-! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"}) {
-! CHECK:         %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = fir.alloca !fir.heap<!fir.array<?xi32>> {uniq_name = "_QFs2_3Ey.addr"}
-! CHECK:         %[[VAL_4:.*]] = fir.alloca index {uniq_name = "_QFs2_3Ey.lb0"}
-! CHECK:         %[[VAL_5:.*]] = fir.alloca index {uniq_name = "_QFs2_3Ey.ext0"}
-! CHECK:         %[[VAL_6:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
-! CHECK:         fir.store %[[VAL_6]] to %[[VAL_3]] : !fir.ref<!fir.heap<!fir.array<?xi32>>>
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index
-! CHECK:         %[[VAL_9:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index
-! CHECK:         %[[VAL_11:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_12:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         %[[VAL_13:.*]] = fir.load %[[VAL_4]] : !fir.ref<index>
-! CHECK:         %[[VAL_14:.*]] = fir.load %[[VAL_5]] : !fir.ref<index>
-! CHECK:         %[[VAL_15:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.heap<!fir.array<?xi32>>>
-! CHECK:         %[[VAL_16:.*]] = fir.shape_shift %[[VAL_13]], %[[VAL_14]] : (index, index) -> !fir.shapeshift<1>
-! CHECK:         %[[VAL_17:.*]] = fir.array_load %[[VAL_15]](%[[VAL_16]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shapeshift<1>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_18:.*]] = fir.do_loop %[[VAL_19:.*]] = %[[VAL_8]] to %[[VAL_10]] step %[[VAL_11]] unordered iter_args(%[[VAL_20:.*]] = %[[VAL_12]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
-! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_19]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_21]] to %[[VAL_1]] : !fir.ref<i32>
-! CHECK:           %[[VAL_22:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
-! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i32) -> i64
-! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i64) -> index
-! CHECK:           %[[VAL_25:.*]] = arith.subi %[[VAL_24]], %[[VAL_13]] : index
-! CHECK:           %[[VAL_26:.*]] = fir.array_access %[[VAL_17]], %[[VAL_25]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
-! CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK:           %[[VAL_28:.*]] = fir.embox %[[VAL_27]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
-! CHECK:           %[[VAL_29:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_30:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
-! CHECK:           %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i32) -> i64
-! CHECK:           %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i64) -> index
-! CHECK:           %[[VAL_33:.*]] = arith.subi %[[VAL_32]], %[[VAL_29]] : index
-! CHECK:           %[[VAL_34:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
-! CHECK:           %[[VAL_35:.*]] = fir.array_update %[[VAL_20]], %[[VAL_28]], %[[VAL_33]], %[[VAL_34]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           fir.result %[[VAL_35]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_12]], %[[VAL_36:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs2_3(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[YALLOC:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YALLOC]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[YBOX:.*]] = fir.load %[[Y]]#0
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[YBOX]] (%[[IIDX]])
+! CHECK:     %[[YIBOX:.*]] = fir.embox %[[YI]] : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
+! CHECK:     hlfir.yield %[[YIBOX]] : !fir.box<!fir.ptr<i32>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     hlfir.yield %[[XIIP]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK:   }
+! CHECK: }
 
 ! Dependent type - TODO
 !subroutine s2_4(x,y,l)
@@ -380,42 +306,33 @@ subroutine s3(x,y)
   end forall
 end subroutine s3
 
-! CHECK-LABEL: func @_QPs3(
-! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y"}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
-! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
-! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>) {
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
-! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
-! CHECK:           %[[VAL_19:.*]] = fir.array_fetch %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> i32
-! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
-! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index
-! CHECK:           %[[VAL_24:.*]] = arith.subi %[[VAL_23]], %[[VAL_20]] : index
-! CHECK:           %[[VAL_25:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>
-! CHECK:           %[[VAL_27:.*]] = fir.array_access %[[VAL_12]], %[[VAL_24]], %[[VAL_25]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
-! CHECK:           %[[VAL_28:.*]] = fir.load %[[VAL_27]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
-! CHECK:           %[[VAL_29:.*]] = fir.coordinate_of %[[VAL_28]], v : (!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>) -> !fir.ref<i32>
-! CHECK:           fir.store %[[VAL_19]] to %[[VAL_29]] : !fir.ref<i32>
-! CHECK:           %[[VAL_30:.*]] = fir.array_amend %[[VAL_12]], %[[VAL_27]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
-! CHECK:           fir.result %[[VAL_30]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_31:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs3(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{{.*}}>>> {{.*}}, %[[YARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[Y]]#0 (%[[IIDX]])
+! CHECK:     %[[YIVAL:.*]] = fir.load %[[YI]] : !fir.ref<i32>
+! CHECK:     hlfir.yield %[[YIVAL]] : i32
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     %[[IPBOX:.*]] = fir.load %[[XIIP]]
+! CHECK:     %[[IPADDR:.*]] = fir.box_addr %[[IPBOX]]
+! CHECK:     %[[V:.*]] = hlfir.designate %[[IPADDR]]{"v"}
+! CHECK:     hlfir.yield %[[V]] : !fir.ref<i32>
+! CHECK:   }
+! CHECK: }
 
 subroutine s3_1(x,y)
   use array_of_pointer_test
@@ -428,42 +345,33 @@ subroutine s3_1(x,y)
   end forall
 end subroutine s3_1
 
-! CHECK-LABEL: func @_QPs3_1(
-! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:                %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y"}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
-! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
-! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>) {
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
-! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
-! CHECK:           %[[VAL_19:.*]] = fir.array_fetch %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> i32
-! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
-! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index
-! CHECK:           %[[VAL_24:.*]] = arith.subi %[[VAL_23]], %[[VAL_20]] : index
-! CHECK:           %[[VAL_25:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>
-! CHECK:           %[[VAL_27:.*]] = fir.array_access %[[VAL_12]], %[[VAL_24]], %[[VAL_25]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
-! CHECK:           %[[VAL_28:.*]] = fir.load %[[VAL_27]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
-! CHECK:           %[[VAL_29:.*]] = fir.coordinate_of %[[VAL_28]], v : (!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>) -> !fir.ref<i32>
-! CHECK:           fir.store %[[VAL_19]] to %[[VAL_29]] : !fir.ref<i32>
-! CHECK:           %[[VAL_30:.*]] = fir.array_amend %[[VAL_12]], %[[VAL_27]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
-! CHECK:           fir.result %[[VAL_30]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_31:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs3_1(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{{.*}}>>> {{.*}}, %[[YARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[Y]]#0 (%[[IIDX]])
+! CHECK:     %[[YIVAL:.*]] = fir.load %[[YI]] : !fir.ref<i32>
+! CHECK:     hlfir.yield %[[YIVAL]] : i32
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     %[[IPBOX:.*]] = fir.load %[[XIIP]]
+! CHECK:     %[[IPADDR:.*]] = fir.box_addr %[[IPBOX]]
+! CHECK:     %[[V:.*]] = hlfir.designate %[[IPADDR]]{"v"}
+! CHECK:     hlfir.yield %[[V]] : !fir.ref<i32>
+! CHECK:   }
+! CHECK: }
 
 ! Slice a target array and assign the box to a pointer of rank-1 field.
 ! RHS is an array section. Hits a TODO.
@@ -478,6 +386,14 @@ subroutine s4(x,y)
   end forall
 end subroutine s4
 
+! CHECK-LABEL: func.func @_QPs4(
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK: }
+
 ! Most other Fortran implementations cannot compile the following 2 cases, s5
 ! and s5_1.
 subroutine s5(x,y,z,n1,n2)
@@ -492,51 +408,35 @@ subroutine s5(x,y,z,n1,n2)
   end forall
 end subroutine s5
 
-! CHECK-LABEL: func @_QPs5(
-! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>> {fir.bindc_name = "y"},
-! CHECK-SAME:              %[[VAL_2:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "z", fir.target},
-! CHECK-SAME:              %[[VAL_3:.*]]: !fir.ref<i32> {fir.bindc_name = "n1"},
-! CHECK-SAME:              %[[VAL_4:.*]]: !fir.ref<i32> {fir.bindc_name = "n2"}) {
-! CHECK:         %[[VAL_5:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_6:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
-! CHECK:         %[[VAL_8:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i32) -> index
-! CHECK:         %[[VAL_10:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_11:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>
-! CHECK:         %[[VAL_12:.*]] = fir.array_load %[[VAL_2]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
-! CHECK:         %[[VAL_13:.*]] = fir.do_loop %[[VAL_14:.*]] = %[[VAL_7]] to %[[VAL_9]] step %[[VAL_10]] unordered iter_args(%[[VAL_15:.*]] = %[[VAL_11]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>) {
-! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_14]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_16]] to %[[VAL_5]] : !fir.ref<i32>
-! CHECK:           %[[VAL_17:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i64
-! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
-! CHECK:           %[[VAL_23:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_24:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
-! CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i32) -> i64
-! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i64) -> index
-! CHECK:           %[[VAL_27:.*]] = arith.subi %[[VAL_26]], %[[VAL_23]] : index
-! CHECK:           %[[VAL_28:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>
-! CHECK:           %[[VAL_29:.*]] = fir.array_fetch %[[VAL_12]], %[[VAL_27]], %[[VAL_28]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, index, !fir.field) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
-! CHECK:           %[[VAL_30:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_31:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
-! CHECK:           %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i32) -> i64
-! CHECK:           %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (i64) -> index
-! CHECK:           %[[VAL_34:.*]] = arith.subi %[[VAL_33]], %[[VAL_30]] : index
-! CHECK:           %[[VAL_35:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>
-! CHECK:           %[[VAL_36:.*]] = fir.convert %[[VAL_29]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.box<!fir.ptr<!fir.array<?x?xi32>>>
-! CHECK:           %[[VAL_37:.*]] = fir.shape_shift %[[VAL_17]], %[[VAL_19]], %[[VAL_20]], %[[VAL_22]] : (i64, i64, i64, i64) -> !fir.shapeshift<2>
-! CHECK:           %[[VAL_38:.*]] = fir.rebox %[[VAL_36]](%[[VAL_37]]) : (!fir.box<!fir.ptr<!fir.array<?x?xi32>>>, !fir.shapeshift<2>) -> !fir.box<!fir.ptr<!fir.array<?x?xi32>>>
-! CHECK:           %[[VAL_39:.*]] = fir.array_update %[[VAL_15]], %[[VAL_38]], %[[VAL_34]], %[[VAL_35]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.box<!fir.ptr<!fir.array<?x?xi32>>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>
-! CHECK:           fir.result %[[VAL_39]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_11]], %[[VAL_40:.*]] to %[[VAL_1]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs5(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{{.*}}>>> {{.*}}, %[[YARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{{.*}}>>> {{.*}}, %[[ZARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{{.*}}>>> {{.*}}, %[[N1ARG:.*]]: !fir.ref<i32> {{.*}}, %[[N2ARG:.*]]: !fir.ref<i32> {{.*}}) {
+! CHECK: %[[N1:.*]]:2 = hlfir.declare %[[N1ARG]]
+! CHECK: %[[N2:.*]]:2 = hlfir.declare %[[N2ARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: %[[Z:.*]]:2 = hlfir.declare %[[ZARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[ZI:.*]] = hlfir.designate %[[Z]]#0 (%[[IIDX]])
+! CHECK:     %[[ZIIP:.*]] = hlfir.designate %[[ZI]]{"ip"}
+! CHECK:     %[[IPBOX:.*]] = fir.load %[[ZIIP]]
+! CHECK:     %{{.*}} = fir.shape_shift {{.*}} : (index, index, index, index) -> !fir.shapeshift<2>
+! CHECK:     %[[REBOX:.*]] = fir.rebox %[[IPBOX]]({{.*}})
+! CHECK:     hlfir.yield %[[REBOX]] : !fir.box<!fir.ptr<!fir.array<?x?xi32>>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[YI:.*]] = hlfir.designate %[[Y]]#0 (%[[IIDX]])
+! CHECK:     %[[YIIP:.*]] = hlfir.designate %[[YI]]{"ip"}
+! CHECK:     hlfir.yield %[[YIIP]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x?xi32>>>>
+! CHECK:   }
+! CHECK: }
 
 ! RHS is an array section. Hits a TODO.
 subroutine s5_1(x,y,z,n1,n2)
@@ -551,6 +451,14 @@ subroutine s5_1(x,y,z,n1,n2)
   end forall
 end subroutine s5_1
 
+! CHECK-LABEL: func.func @_QPs5_1(
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK: }
+
 subroutine s6(x,y)
   use array_of_pointer_test
   type(tv) :: x(:)
@@ -562,61 +470,47 @@ subroutine s6(x,y)
   end forall
 end subroutine s6
 
-! CHECK-LABEL: func @_QPs6(
-! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target}) {
-! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
-! CHECK:         %[[VAL_3:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> index
-! CHECK:         %[[VAL_6:.*]] = arith.constant 10 : i32
-! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
-! CHECK:         %[[VAL_8:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_9:.*]] = arith.constant 2 : i32
-! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index
-! CHECK:         %[[VAL_11:.*]] = arith.constant 20 : i32
-! CHECK:         %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i32) -> index
-! CHECK:         %[[VAL_13:.*]] = arith.constant 2 : i32
-! CHECK:         %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i32) -> index
-! CHECK:         %[[VAL_15:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
-! CHECK:         %[[VAL_16:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_17:.*]] = fir.do_loop %[[VAL_18:.*]] = %[[VAL_5]] to %[[VAL_7]] step %[[VAL_8]] unordered iter_args(%[[VAL_19:.*]] = %[[VAL_15]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>) {
-! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_18]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_20]] to %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_21:.*]] = fir.do_loop %[[VAL_22:.*]] = %[[VAL_10]] to %[[VAL_12]] step %[[VAL_14]] unordered iter_args(%[[VAL_23:.*]] = %[[VAL_19]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>) {
-! CHECK:             %[[VAL_24:.*]] = fir.convert %[[VAL_22]] : (index) -> i32
-! CHECK:             fir.store %[[VAL_24]] to %[[VAL_2]] : !fir.ref<i32>
-! CHECK:             %[[VAL_25:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_26:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:             %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i32) -> i64
-! CHECK:             %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index
-! CHECK:             %[[VAL_29:.*]] = arith.subi %[[VAL_28]], %[[VAL_25]] : index
-! CHECK:             %[[VAL_30:.*]] = fir.array_fetch %[[VAL_16]], %[[VAL_29]] : (!fir.array<?xi32>, index) -> i32
-! CHECK:             %[[VAL_31:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_32:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:             %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (i32) -> i64
-! CHECK:             %[[VAL_34:.*]] = fir.convert %[[VAL_33]] : (i64) -> index
-! CHECK:             %[[VAL_35:.*]] = arith.subi %[[VAL_34]], %[[VAL_31]] : index
-! CHECK:             %[[VAL_36:.*]] = fir.field_index jp, !fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>
-! CHECK:             %[[VAL_37:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:             %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i32) -> i64
-! CHECK:             %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (i64) -> index
-! CHECK:             %[[VAL_40:.*]] = arith.subi %[[VAL_39]], %[[VAL_31]] : index
-! CHECK:             %[[VAL_43:.*]] = fir.array_access %[[VAL_23]], %[[VAL_35]], %[[VAL_36]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>>
-! CHECK:             %[[VAL_44:.*]] = fir.load %[[VAL_43]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>>
-! CHECK:             %[[VAL_45:.*]] = fir.coordinate_of %[[VAL_44]], %[[VAL_40]] : (!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>, index) -> !fir.ref<!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
-! CHECK:             %[[VAL_46:.*]] = fir.coordinate_of %[[VAL_45]], ip : (!fir.ref<!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
-! CHECK:             %[[VAL_47:.*]] = fir.load %[[VAL_46]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
-! CHECK:             %[[VAL_48:.*]] = fir.coordinate_of %[[VAL_47]], v : (!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>) -> !fir.ref<i32>
-! CHECK:             fir.store %[[VAL_30]] to %[[VAL_48]] : !fir.ref<i32>
-! CHECK:             %[[VAL_49:.*]] = fir.array_amend %[[VAL_23]], %[[VAL_43]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
-! CHECK:             fir.result %[[VAL_49]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
-! CHECK:           }
-! CHECK:           fir.result %[[VAL_50:.*]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_15]], %[[VAL_51:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs6(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{{.*}}>>> {{.*}}, %[[YARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}) {
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.forall lb {
+! CHECK:     hlfir.yield {{.*}} : i32
+! CHECK:   } ub {
+! CHECK:     hlfir.yield {{.*}} : i32
+! CHECK:   } step {
+! CHECK:     hlfir.yield {{.*}} : i32
+! CHECK:   }  (%[[JARG:.*]]: i32) {
+! CHECK:     %[[J:.*]] = hlfir.forall_index "j" %[[JARG]] : (i32) -> !fir.ref<i32>
+! CHECK:     hlfir.region_assign {
+! CHECK:       %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:       %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:       %[[YI:.*]] = hlfir.designate %[[Y]]#0 (%[[IIDX]])
+! CHECK:       %[[YIVAL:.*]] = fir.load %[[YI]] : !fir.ref<i32>
+! CHECK:       hlfir.yield %[[YIVAL]] : i32
+! CHECK:     } to {
+! CHECK:       %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:       %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:       %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:       %[[XIJP:.*]] = hlfir.designate %[[XI]]{"jp"}
+! CHECK:       %[[JPBOX:.*]] = fir.load %[[XIJP]]
+! CHECK:       %[[JVAL:.*]] = fir.load %[[J]] : !fir.ref<i32>
+! CHECK:       %[[JIDX:.*]] = fir.convert %[[JVAL]] : (i32) -> i64
+! CHECK:       %[[XIJPJ:.*]] = hlfir.designate %[[JPBOX]] (%[[JIDX]])
+! CHECK:       %[[XIJPJIP:.*]] = hlfir.designate %[[XIJPJ]]{"ip"}
+! CHECK:       %[[IPBOX:.*]] = fir.load %[[XIJPJIP]]
+! CHECK:       %[[IPADDR:.*]] = fir.box_addr %[[IPBOX]]
+! CHECK:       %[[V:.*]] = hlfir.designate %[[IPADDR]]{"v"}
+! CHECK:       hlfir.yield %[[V]] : !fir.ref<i32>
+! CHECK:     }
+! CHECK:   }
+! CHECK: }
 
 subroutine s7(x,y,n)
   use array_of_pointer_test
@@ -628,53 +522,39 @@ subroutine s7(x,y,n)
   end forall
 end subroutine s7
 
-! CHECK-LABEL: func @_QPs7(
-! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target},
-! CHECK-SAME:              %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "n"}) {
-! CHECK:         %[[VAL_3:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> index
-! CHECK:         %[[VAL_6:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
-! CHECK:         %[[VAL_8:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         %[[VAL_10:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
-! CHECK:         %[[VAL_11:.*]] = fir.do_loop %[[VAL_12:.*]] = %[[VAL_5]] to %[[VAL_7]] step %[[VAL_8]] unordered iter_args(%[[VAL_13:.*]] = %[[VAL_9]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
-! CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_12]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_14]] to %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_15:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_16:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:           %[[VAL_17:.*]] = arith.constant 1 : i32
-! CHECK:           %[[VAL_18:.*]] = arith.addi %[[VAL_16]], %[[VAL_17]] : i32
-! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_20:.*]] = arith.subi %[[VAL_18]], %[[VAL_19]] : i32
-! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i32) -> i64
-! CHECK:           %[[VAL_22:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_23:.*]] = arith.subi %[[VAL_21]], %[[VAL_22]] : i64
-! CHECK:           %[[VAL_24:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_23]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>, i64) -> !fir.ref<!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           %[[VAL_26:.*]] = fir.coordinate_of %[[VAL_24]], ip : (!fir.ref<!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
-! CHECK:           %[[VAL_27:.*]] = fir.load %[[VAL_26]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
-! CHECK:           %[[VAL_28:.*]] = fir.box_addr %[[VAL_27]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
-! CHECK:           %[[VAL_29:.*]] = fir.load %[[VAL_28]] : !fir.ptr<i32>
-! CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> i64
-! CHECK:           %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i64) -> index
-! CHECK:           %[[VAL_32:.*]] = arith.subi %[[VAL_31]], %[[VAL_15]] : index
-! CHECK:           %[[VAL_33:.*]] = fir.array_access %[[VAL_10]], %[[VAL_32]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
-! CHECK:           %[[VAL_34:.*]] = fir.convert %[[VAL_33]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK:           %[[VAL_35:.*]] = fir.embox %[[VAL_34]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
-! CHECK:           %[[VAL_36:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_37:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i32) -> i64
-! CHECK:           %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (i64) -> index
-! CHECK:           %[[VAL_40:.*]] = arith.subi %[[VAL_39]], %[[VAL_36]] : index
-! CHECK:           %[[VAL_41:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
-! CHECK:           %[[VAL_42:.*]] = fir.array_update %[[VAL_13]], %[[VAL_35]], %[[VAL_40]], %[[VAL_41]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:           fir.result %[[VAL_42]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_9]], %[[VAL_43:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs7(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {{.*}}, %[[YARG:.*]]: !fir.box<!fir.array<?xi32>> {{.*}}, %[[NARG:.*]]: !fir.ref<i32> {{.*}}) {
+! CHECK: %[[N:.*]]:2 = hlfir.declare %[[NARG]]
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[NVAL:.*]] = fir.load %[[N]]#0
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]]
+! CHECK:     %[[IDX:.*]] = arith.subi {{.*}}, %[[IVAL]]
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IDX]] : (i32) -> i64
+! CHECK:     %[[XNI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XNIIP:.*]] = hlfir.designate %[[XNI]]{"ip"}
+! CHECK:     %[[IPBOX:.*]] = fir.load %[[XNIIP]]
+! CHECK:     %[[IPADDR:.*]] = fir.box_addr %[[IPBOX]]
+! CHECK:     %[[VAL:.*]] = fir.load %[[IPADDR]]
+! CHECK:     %[[VAL64:.*]] = fir.convert %[[VAL]] : (i32) -> i64
+! CHECK:     %[[YV:.*]] = hlfir.designate %[[Y]]#0 (%[[VAL64]])
+! CHECK:     %[[YVBOX:.*]] = fir.embox %[[YV]] : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
+! CHECK:     hlfir.yield %[[YVBOX]] : !fir.box<!fir.ptr<i32>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     hlfir.yield %[[XIIP]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK:   }
+! CHECK: }
 
 subroutine s8(x,y,n)
   use array_of_pointer_test
@@ -685,41 +565,33 @@ subroutine s8(x,y,n)
   end forall
 end subroutine s8
 
-! CHECK-LABEL: func @_QPs8(
-! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:              %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "y"},
-! CHECK-SAME:              %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "n"}) {
-! CHECK:         %[[VAL_3:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> index
-! CHECK:         %[[VAL_6:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
-! CHECK:         %[[VAL_8:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
-! CHECK:         %[[VAL_10:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
-! CHECK:         %[[VAL_11:.*]] = arith.constant 0 : index
-! CHECK:         %[[VAL_12:.*]]:3 = fir.box_dims %[[VAL_10]], %[[VAL_11]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_13:.*]] = fir.shift %[[VAL_12]]#0 : (index) -> !fir.shift<1>
-! CHECK:         %[[VAL_14:.*]] = fir.do_loop %[[VAL_15:.*]] = %[[VAL_5]] to %[[VAL_7]] step %[[VAL_8]] unordered iter_args(%[[VAL_16:.*]] = %[[VAL_9]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>) {
-! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_17]] to %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i64
-! CHECK:           %[[VAL_20:.*]] = fir.rebox %[[VAL_10]](%[[VAL_13]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
-! CHECK:           %[[VAL_21:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_22:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i32) -> i64
-! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i64) -> index
-! CHECK:           %[[VAL_25:.*]] = arith.subi %[[VAL_24]], %[[VAL_21]] : index
-! CHECK:           %[[VAL_26:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>
-! CHECK:           %[[VAL_27:.*]] = fir.shift %[[VAL_19]] : (i64) -> !fir.shift<1>
-! CHECK:           %[[VAL_28:.*]] = fir.rebox %[[VAL_20]](%[[VAL_27]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
-! CHECK:           %[[VAL_29:.*]] = fir.array_update %[[VAL_16]], %[[VAL_28]], %[[VAL_25]], %[[VAL_26]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.ptr<!fir.array<?xi32>>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
-! CHECK:           fir.result %[[VAL_29]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_9]], %[[VAL_30:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs8(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{{.*}}>>> {{.*}}, %[[YARG:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {{.*}}, %[[NARG:.*]]: !fir.ref<i32> {{.*}}) {
+! CHECK: %[[N:.*]]:2 = hlfir.declare %[[NARG]]
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[YBOX:.*]] = fir.load %[[Y]]#0
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[IEXT:.*]] = fir.convert %[[IIDX]] : (i64) -> index
+! CHECK:     %[[SHIFT:.*]] = fir.shift %[[IEXT]] : (index) -> !fir.shift<1>
+! CHECK:     %[[REBOX:.*]] = fir.rebox %[[YBOX]](%[[SHIFT]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
+! CHECK:     hlfir.yield %[[REBOX]] : !fir.box<!fir.ptr<!fir.array<?xi32>>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     hlfir.yield %[[XIIP]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
+! CHECK:   }
+! CHECK: }
 
 subroutine s8_1(x,y,n1,n2)
   use array_of_pointer_test
@@ -730,48 +602,39 @@ subroutine s8_1(x,y,n1,n2)
   end forall
 end subroutine s8_1
 
-! CHECK-LABEL: func @_QPs8_1(
-! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "x"},
-! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "y"},
-! CHECK-SAME:                %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "n1"},
-! CHECK-SAME:                %[[VAL_3:.*]]: !fir.ref<i32> {fir.bindc_name = "n2"}) {
-! CHECK:         %[[VAL_4:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
-! CHECK:         %[[VAL_5:.*]] = arith.constant 1 : i32
-! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
-! CHECK:         %[[VAL_7:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index
-! CHECK:         %[[VAL_9:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_10:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
-! CHECK:         %[[VAL_11:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
-! CHECK:         %[[VAL_12:.*]] = arith.constant 0 : index
-! CHECK:         %[[VAL_13:.*]]:3 = fir.box_dims %[[VAL_11]], %[[VAL_12]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_14:.*]] = fir.shift %[[VAL_13]]#0 : (index) -> !fir.shift<1>
-! CHECK:         %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_6]] to %[[VAL_8]] step %[[VAL_9]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_10]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>) {
-! CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_16]] : (index) -> i32
-! CHECK:           fir.store %[[VAL_18]] to %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
-! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-! CHECK:           %[[VAL_22:.*]] = arith.constant 1 : i32
-! CHECK:           %[[VAL_23:.*]] = arith.addi %[[VAL_21]], %[[VAL_22]] : i32
-! CHECK:           %[[VAL_24:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_25:.*]] = arith.addi %[[VAL_23]], %[[VAL_24]] : i32
-! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> i64
-! CHECK:           %[[VAL_27:.*]] = fir.rebox %[[VAL_11]](%[[VAL_14]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
-! CHECK:           %[[VAL_28:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_29:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
-! CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> i64
-! CHECK:           %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i64) -> index
-! CHECK:           %[[VAL_32:.*]] = arith.subi %[[VAL_31]], %[[VAL_28]] : index
-! CHECK:           %[[VAL_33:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>
-! CHECK:           %[[VAL_34:.*]] = fir.shape_shift %[[VAL_20]], %[[VAL_26]] : (i64, i64) -> !fir.shapeshift<1>
-! CHECK:           %[[VAL_35:.*]] = fir.rebox %[[VAL_27]](%[[VAL_34]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shapeshift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
-! CHECK:           %[[VAL_36:.*]] = fir.array_update %[[VAL_17]], %[[VAL_35]], %[[VAL_32]], %[[VAL_33]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.ptr<!fir.array<?xi32>>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
-! CHECK:           fir.result %[[VAL_36]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
-! CHECK:         }
-! CHECK:         fir.array_merge_store %[[VAL_10]], %[[VAL_37:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>
-! CHECK:         return
-! CHECK:       }
+! CHECK-LABEL: func.func @_QPs8_1(
+! CHECK-SAME: %[[XARG:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{{.*}}>>> {{.*}}, %[[YARG:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {{.*}}, %[[N1ARG:.*]]: !fir.ref<i32> {{.*}}, %[[N2ARG:.*]]: !fir.ref<i32> {{.*}}) {
+! CHECK: %[[N1:.*]]:2 = hlfir.declare %[[N1ARG]]
+! CHECK: %[[N2:.*]]:2 = hlfir.declare %[[N2ARG]]
+! CHECK: %[[X:.*]]:2 = hlfir.declare %[[XARG]]
+! CHECK: %[[Y:.*]]:2 = hlfir.declare %[[YARG]]
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK:   %[[I:.*]] = hlfir.forall_index "i" %[[IARG]] : (i32) -> !fir.ref<i32>
+! CHECK:   hlfir.region_assign {
+! CHECK:     %[[YBOX:.*]] = fir.load %[[Y]]#0
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[LB:.*]] = fir.convert %[[IIDX]] : (i64) -> index
+! CHECK:     %[[IVAL2:.*]] = fir.load %[[I]]
+! CHECK:     %[[UB:.*]] = fir.convert {{.*}} : (i64) -> index
+! CHECK:     %[[DIFF:.*]] = arith.subi %[[UB]], %[[LB]]
+! CHECK:     %[[DIFFP1:.*]] = arith.addi %[[DIFF]], {{.*}}
+! CHECK:     %[[EXTENT:.*]] = arith.select {{.*}}, %[[DIFFP1]], {{.*}}
+! CHECK:     %[[SHAPE:.*]] = fir.shape_shift %[[LB]], %[[EXTENT]]
+! CHECK:     %[[REBOX:.*]] = fir.rebox %[[YBOX]](%[[SHAPE]])
+! CHECK:     hlfir.yield %[[REBOX]] : !fir.box<!fir.ptr<!fir.array<?xi32>>>
+! CHECK:   } to {
+! CHECK:     %[[IVAL:.*]] = fir.load %[[I]] : !fir.ref<i32>
+! CHECK:     %[[IIDX:.*]] = fir.convert %[[IVAL]] : (i32) -> i64
+! CHECK:     %[[XI:.*]] = hlfir.designate %[[X]]#0 (%[[IIDX]])
+! CHECK:     %[[XIIP:.*]] = hlfir.designate %[[XI]]{"ip"}
+! CHECK:     hlfir.yield %[[XIIP]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
+! CHECK:   }
+! CHECK: }
 
 subroutine s8_2(x,y,n)
   use array_of_pointer_test
@@ -782,6 +645,14 @@ subroutine s8_2(x,y,n)
   end forall
 end subroutine s8_2
 
+! CHECK-LABEL: func.func @_QPs8_2(
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK: }
+
 subroutine s8_3(x,y,n1,n2)
   use array_of_pointer_test
   type(ta) x(:)
@@ -791,6 +662,14 @@ subroutine s8_3(x,y,n1,n2)
   end forall
 end subroutine s8_3
 
+! CHECK-LABEL: func.func @_QPs8_3(
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK: }
+
 subroutine s8_4(x,y,n)
   use array_of_pointer_test
   type(ta) x(:)
@@ -800,6 +679,14 @@ subroutine s8_4(x,y,n)
   end forall
 end subroutine s8_4
 
+! CHECK-LABEL: func.func @_QPs8_4(
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK: }
+
 subroutine s8_5(x,y,n1,n2)
   use array_of_pointer_test
   type(ta) x(:)
@@ -808,3 +695,11 @@ subroutine s8_5(x,y,n1,n2)
 !     x(i)%ip(i:n2+1+i) => y
   end forall
 end subroutine s8_5
+
+! CHECK-LABEL: func.func @_QPs8_5(
+! CHECK: hlfir.forall lb {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: } ub {
+! CHECK:   hlfir.yield {{.*}} : i32
+! CHECK: }  (%[[IARG:.*]]: i32) {
+! CHECK: }

diff  --git a/flang/test/Lower/forall/array-subscripts.f90 b/flang/test/Lower/forall/array-subscripts.f90
index 60bac87c7ae54..67acd8c3ab3f3 100644
--- a/flang/test/Lower/forall/array-subscripts.f90
+++ b/flang/test/Lower/forall/array-subscripts.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
 
   ! Make sure we use array values for subscripts that are arrays on the lhs so
   ! that copy-in/copy-out works correctly.
@@ -8,14 +8,26 @@
   end forall
 end
 
-! CHECK-LABEL: func @_QQmain
-! CHECK: %[[a:.*]] = fir.address_of(@_QFEa) : !fir.ref<!fir.array<4x4xi32>>
-! CHECK: %[[a1:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<4x4xi32>>, !fir.shape<2>) -> !fir.array<4x4xi32>
-! CHECK: %[[a2:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<4x4xi32>>, !fir.shape<2>) -> !fir.array<4x4xi32>
-! CHECK: %[[a3:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<4x4xi32>>, !fir.shape<2>) -> !fir.array<4x4xi32>
-! CHECK: %[[av:.*]] = fir.do_loop
-! CHECK: fir.do_loop
-! CHECK: = fir.array_fetch %[[a2]], %{{.*}}, %{{.*}} : (!fir.array<4x4xi32>, index, index) -> i32
-! CHECK: = fir.array_fetch %[[a3]], %{{.*}}, %{{.*}} : (!fir.array<4x4xi32>, index, index) -> i32
-! CHECK: = fir.array_update %{{.*}}, %{{.*}}, %{{.*}} : (!fir.array<4x4xi32>, i32, index, index) -> !fir.array<4x4xi32>
-! CHECK: fir.array_merge_store %[[a1]], %[[av]] to %[[a]] : !fir.array<4x4xi32>, !fir.array<4x4xi32>, !fir.ref<!fir.array<4x4xi32>>
+! CHECK-LABEL: func.func @_QQmain() {
+! CHECK: %[[A_ADDR:.*]] = fir.address_of(@_QFEa) : !fir.ref<!fir.array<4x4xi32>>
+! CHECK: %[[A:.*]]:2 = hlfir.declare %[[A_ADDR]]
+! CHECK: hlfir.forall lb {
+! CHECK: hlfir.yield %{{.*}} : i32
+! CHECK: } ub {
+! CHECK: hlfir.yield %{{.*}} : i32
+! CHECK: }  (%[[I_ARG:.*]]: i32) {
+! CHECK:   %[[I_REF:.*]] = hlfir.forall_index "i" %[[I_ARG]]
+! CHECK:   hlfir.forall lb {
+! CHECK:   hlfir.yield %{{.*}} : i32
+! CHECK:   } ub {
+! CHECK:   hlfir.yield %{{.*}} : i32
+! CHECK:   }  (%[[J_ARG:.*]]: i32) {
+! CHECK:     %[[J_REF:.*]] = hlfir.forall_index "j" %[[J_ARG]]
+! CHECK:     hlfir.region_assign {
+! CHECK:       hlfir.yield %{{.*}} : i32
+! CHECK:     } to {
+! CHECK:       hlfir.designate %[[A]]#0 ({{.*}}, {{.*}})
+! CHECK:       hlfir.yield %{{.*}} : !fir.ref<i32>
+! CHECK:     }
+! CHECK:   }
+! CHECK: }

diff  --git a/flang/test/Lower/forall/character-1.f90 b/flang/test/Lower/forall/character-1.f90
index d1e12a8dbdfec..414e48332f0ad 100644
--- a/flang/test/Lower/forall/character-1.f90
+++ b/flang/test/Lower/forall/character-1.f90
@@ -1,5 +1,5 @@
-! RUN: bbc -hlfir=false %s -o - | tco | FileCheck %s
-! RUN: %flang -emit-llvm -flang-deprecated-no-hlfir -S -mmlir -disable-external-name-interop %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s --check-prefix=HLFIR
+! RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM
 ! Test from Fortran source through to LLVM IR.
 ! UNSUPPORTED: system-windows
 ! Disabled on 32-bit targets due to the additional `trunc` opcodes required
@@ -21,18 +21,24 @@ subroutine sub(x)
   end subroutine sub
 end program test
 
-! CHECK-LABEL: define internal void @_QFPsub(
-! CHECK-SAME:    ptr {{[^%]*}}%[[arg:.*]])
-! CHECK: %[[extent:.*]] = getelementptr { {{.*}}, [1 x [3 x i64]] }, ptr %[[arg]], i32 0, i32 7, i64 0, i32 1
-! CHECK: %[[extval:.*]] = load i64, ptr %[[extent]]
-! CHECK: %[[elesize:.*]] = getelementptr { {{.*}}, [1 x [3 x i64]] }, ptr %[[arg]], i32 0, i32 1
-! CHECK: %[[esval:.*]] = load i64, ptr %[[elesize]]
-! CHECK: %[[mul:.*]] = mul i64 1, %[[esval]]
-! CHECK: %[[mul2:.*]] = mul i64 %[[mul]], %[[extval]]
-! CHECK: %[[cmp:.*]] = icmp sgt i64 %[[mul2]], 0
-! CHECK: %[[size:.*]] = select i1 %[[cmp]], i64 %[[mul2]], i64 1
-! CHECK: %[[buff:.*]] = call ptr @malloc(i64 %[[size]])
-! CHECK: %[[to:.*]] = getelementptr i8, ptr %[[buff]], i64 %
-! CHECK: call void @llvm.memmove.p0.p0.i64(ptr %[[to]], ptr %{{.*}}, i64 %{{.*}}, i1 false)
-! CHECK: call void @free(ptr %[[buff]])
-! CHECK: call ptr @_FortranAioBeginExternalListOutput
+! HLFIR-LABEL: func.func private @_QFPsub(
+! HLFIR: hlfir.forall lb {
+! HLFIR: hlfir.yield %{{.*}} : i32
+! HLFIR: } ub {
+! HLFIR: hlfir.yield %{{.*}} : i32
+! HLFIR: }  (%[[I_ARG:.*]]: i32) {
+! HLFIR:   %[[I_REF:.*]] = hlfir.forall_index "i" %[[I_ARG]]
+! HLFIR:   hlfir.region_assign {
+! HLFIR:     hlfir.designate {{.*}} substr {{.*}}
+! HLFIR:     hlfir.yield %{{.*}}
+! HLFIR:   } to {
+! HLFIR:     hlfir.designate {{.*}} substr {{.*}}
+! HLFIR:     hlfir.yield %{{.*}}
+! HLFIR:   }
+
+! LLVM-LABEL: define internal void @_QFPsub(
+! LLVM: call ptr @_FortranACreateValueStack
+! LLVM: call void @_FortranAPushValue
+! LLVM: call void @_FortranAValueAt
+! LLVM: call void @_FortranAAssign
+! LLVM: call void @_FortranADestroyValueStack


        


More information about the flang-commits mailing list