[flang-commits] [flang] [flang][NFC] Converted five tests from old lowering to new lowering (part 3) (PR #174345)

Eugene Epshteyn via flang-commits flang-commits at lists.llvm.org
Tue Jan 6 06:07:42 PST 2026


https://github.com/eugeneepshteyn updated https://github.com/llvm/llvm-project/pull/174345

>From 9c94fcf6ef9d385277d09368f36d520b6c4e5ecf Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Sun, 4 Jan 2026 15:09:12 -0500
Subject: [PATCH 1/4] [flang][NFC] Converted five tests from old lowering to
 new lowering (part 3)

Tests converted: always-execute-loop-body.f90, arithmetic-goto.f90, array-constructor-1.f90, array-constructor-index.f90, array-derived.f90
---
 flang/test/Lower/always-execute-loop-body.f90 |  17 +-
 flang/test/Lower/arithmetic-goto.f90          |  27 +-
 flang/test/Lower/array-constructor-1.f90      |   8 +-
 flang/test/Lower/array-constructor-index.f90  | 328 ++++--------------
 flang/test/Lower/array-derived.f90            | 219 ++++++------
 5 files changed, 205 insertions(+), 394 deletions(-)

diff --git a/flang/test/Lower/always-execute-loop-body.f90 b/flang/test/Lower/always-execute-loop-body.f90
index 30b70fb8b145e..f3628419abde2 100644
--- a/flang/test/Lower/always-execute-loop-body.f90
+++ b/flang/test/Lower/always-execute-loop-body.f90
@@ -1,5 +1,5 @@
-! RUN: bbc --always-execute-loop-body --emit-fir -hlfir=false %s -o - | FileCheck %s
-! RUN: %flang_fc1 -mmlir --always-execute-loop-body -emit-fir -flang-deprecated-no-hlfir %s -o - | FileCheck %s
+! RUN: bbc --always-execute-loop-body --emit-fir %s -o - | FileCheck %s
+! RUN: %flang_fc1 -mmlir --always-execute-loop-body -emit-fir %s -o - | FileCheck %s
 
 ! Given the flag `--always-execute-loop-body` the compiler emits an extra
 ! code to change to tripcount, test tries to verify the extra emitted FIR.
@@ -8,13 +8,14 @@
 subroutine some()
   integer :: i
 
-  ! CHECK: [[tripcount:%[0-9]+]] = arith.divsi
-  ! CHECK: [[one:%c1_i32[_0-9]*]] = arith.constant 1 : i32
-  ! CHECK: [[cmp:%[0-9]+]] = arith.cmpi slt, [[tripcount]], [[one]] : i32
-  ! CHECK: [[newtripcount:%[0-9]+]] = arith.select [[cmp]], [[one]], [[tripcount]] : i32
-  ! CHECK: fir.store [[newtripcount]] to %{{[0-9]+}} : !fir.ref<i32>
+  ! CHECK: %[[C1:.*]] = arith.constant 1 : i32
+  ! CHECK: %[[TRIP:.*]] = fir.alloca i32
+  ! CHECK: fir.store %[[C1]] to %[[TRIP]] : !fir.ref<i32>
+  ! CHECK: %[[LOADED_TRIP:.*]] = fir.load %[[TRIP]] : !fir.ref<i32>
+  ! CHECK: %[[CMP:.*]] = arith.cmpi sgt, %[[LOADED_TRIP]], %c0{{.*}} : i32
+  ! CHECK: cf.cond_br %[[CMP]]
   do i=4,1,1
     stop 2
   end do
   return
-end
+end
\ No newline at end of file
diff --git a/flang/test/Lower/arithmetic-goto.f90 b/flang/test/Lower/arithmetic-goto.f90
index 7b5288f727487..9fd6e4e6020e7 100644
--- a/flang/test/Lower/arithmetic-goto.f90
+++ b/flang/test/Lower/arithmetic-goto.f90
@@ -1,9 +1,12 @@
-! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
 
 ! CHECK-LABEL: func @_QPkagi
+! CHECK-SAME: %[[ARG0:[^:]+]]: !fir.ref<i32>
 function kagi(index)
-  ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "kagi"
-  ! CHECK:   %[[V_1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
+  ! CHECK:   %[[ARG0_D:[0-9]+]] = fir.declare %[[ARG0]]
+  ! CHECK:   %[[V_0_RAW:[0-9]+]] = fir.alloca i32 {bindc_name = "kagi"
+  ! CHECK:   %[[V_0:[0-9]+]] = fir.declare %[[V_0_RAW]]
+  ! CHECK:   %[[V_1:[0-9]+]] = fir.load %[[ARG0_D]] : !fir.ref<i32>
   ! CHECK:   %[[V_2:[0-9]+]] = arith.cmpi slt, %[[V_1]], %c0{{.*}} : i32
   ! CHECK:   cf.cond_br %[[V_2]], ^bb2, ^bb1
   ! CHECK: ^bb1:  // pred: ^bb0
@@ -29,17 +32,19 @@ function kagi(index)
 end
 
 ! CHECK-LABEL: func @_QPkagf
+! CHECK-SAME: %[[ARG0:[^:]+]]: !fir.ref<f32>
 function kagf(findex)
-  ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "kagf"
-  ! CHECK:   %[[V_1:[0-9]+]] = fir.load %arg0 : !fir.ref<f32>
-  ! CHECK:   %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<f32>
-  ! CHECK:   %[[V_3:[0-9]+]] = arith.addf %[[V_1]], %[[V_2]] {{.*}} : f32
+  ! CHECK:   %[[CST:.*]] = arith.constant 0.000000e+00 : f32
+  ! CHECK:   %[[ARG0_D:[0-9]+]] = fir.declare %[[ARG0]]
+  ! CHECK:   %[[V_0_RAW:[0-9]+]] = fir.alloca i32 {bindc_name = "kagf"
+  ! CHECK:   %[[V_0:[0-9]+]] = fir.declare %[[V_0_RAW]]
+  ! CHECK:   %[[V_1:[0-9]+]] = fir.load %[[ARG0_D]] : !fir.ref<f32>
+  ! CHECK:   %[[V_3:[0-9]+]] = arith.addf %[[V_1]], %[[V_1]] {{.*}} : f32
   ! CHECK:   %[[V_4:[0-9]+]] = arith.addf %[[V_3]], %[[V_3]] {{.*}} : f32
-  ! CHECK:   %cst = arith.constant 0.000000e+00 : f32
-  ! CHECK:   %[[V_5:[0-9]+]] = arith.cmpf olt, %[[V_4]], %cst {{.*}} : f32
+  ! CHECK:   %[[V_5:[0-9]+]] = arith.cmpf olt, %[[V_4]], %[[CST]] {{.*}} : f32
   ! CHECK:   cf.cond_br %[[V_5]], ^bb2, ^bb1
   ! CHECK: ^bb1:  // pred: ^bb0
-  ! CHECK:   %[[V_6:[0-9]+]] = arith.cmpf ogt, %[[V_4]], %cst {{.*}} : f32
+  ! CHECK:   %[[V_6:[0-9]+]] = arith.cmpf ogt, %[[V_4]], %[[CST]] {{.*}} : f32
   ! CHECK:   cf.cond_br %[[V_6]], ^bb4, ^bb3
   ! CHECK: ^bb2:  // pred: ^bb0
   ! CHECK:   fir.store %c1{{.*}} to %[[V_0]] : !fir.ref<i32>
@@ -72,4 +77,4 @@ function kagf(findex)
   print*, kagf(+0.0)
   print*, kagf(+1.0)
   print*, kagf(+2.0)
-end
+end
\ No newline at end of file
diff --git a/flang/test/Lower/array-constructor-1.f90 b/flang/test/Lower/array-constructor-1.f90
index a766357f588a6..e061f0be9ccdc 100644
--- a/flang/test/Lower/array-constructor-1.f90
+++ b/flang/test/Lower/array-constructor-1.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -hlfir=false -o - %s | FileCheck %s
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
 
 module units
   integer, parameter :: preconnected_unit(3) = [0, 5, 6]
@@ -6,11 +6,12 @@ module units
   ! CHECK-LABEL: _QMunitsPis_preconnected_unit
   logical function is_preconnected_unit(u)
   ! CHECK: [[units_ssa:%[0-9]+]] = fir.address_of(@_QMunitsECpreconnected_unit) : !fir.ref<!fir.array<3xi32>>
+  ! CHECK: [[units_decl:%[0-9]+]] = fir.declare [[units_ssa]]
     integer :: u
     integer :: i
     is_preconnected_unit = .true.
     do i = lbound(preconnected_unit,1), ubound(preconnected_unit,1)
-      ! CHECK: fir.coordinate_of [[units_ssa]]
+      ! CHECK: fir.array_coor [[units_decl]]
       if (preconnected_unit(i) == u) return
     end do
     is_preconnected_unit = .false.
@@ -30,7 +31,6 @@ subroutine zero
   complex, parameter :: a(0) = [(((k,k=1,10),j=-2,2,-1),i=2,-2,-2)]
   complex, parameter :: b(0) = [(7,i=3,-3)]
   ! CHECK: fir.address_of(@_QQro.0xz4.null.0) : !fir.ref<!fir.array<0xcomplex<f32>>>
-  ! CHECK-NOT: _QQro
   print*, '>', a, '<'
   print*, '>', b, '<'
 end
@@ -43,4 +43,4 @@ program prog
 
 ! CHECK: fir.global internal @_QFzeroECa constant : !fir.array<0xcomplex<f32>>
 ! CHECK:   %0 = fir.undefined !fir.array<0xcomplex<f32>>
-! CHECK:   fir.has_value %0 : !fir.array<0xcomplex<f32>>
+! CHECK:   fir.has_value %0 : !fir.array<0xcomplex<f32>>
\ No newline at end of file
diff --git a/flang/test/Lower/array-constructor-index.f90 b/flang/test/Lower/array-constructor-index.f90
index a8d330aea63dc..6b0fbf6ecc729 100644
--- a/flang/test/Lower/array-constructor-index.f90
+++ b/flang/test/Lower/array-constructor-index.f90
@@ -1,5 +1,5 @@
 ! Check that the implied-do index value is converted to proper type.
-! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
 
 function test1(k)
   integer*1 :: k
@@ -7,73 +7,23 @@ function test1(k)
   test1 = ([(i*k, integer(8)::i=1,4)])
 end function test1
 ! CHECK-LABEL:   func.func @_QPtest1(
-! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i8> {fir.bindc_name = "k"}) -> !fir.array<4xi8> {
-! CHECK:           %[[VAL_1:.*]] = fir.alloca index {bindc_name = ".buff.pos"}
-! CHECK:           %[[VAL_2:.*]] = fir.alloca index {bindc_name = ".buff.size"}
-! CHECK:           %[[VAL_3:.*]] = arith.constant 4 : index
-! CHECK:           %[[VAL_4:.*]] = fir.alloca !fir.array<4xi8> {bindc_name = "test1", uniq_name = "_QFtest1Etest1"}
-! CHECK:           %[[VAL_5:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_6:.*]] = fir.array_load %[[VAL_4]](%[[VAL_5]]) : (!fir.ref<!fir.array<4xi8>>, !fir.shape<1>) -> !fir.array<4xi8>
-! CHECK:           %[[VAL_7:.*]] = arith.constant 0 : index
-! CHECK:           fir.store %[[VAL_7]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_8:.*]] = fir.allocmem !fir.array<4xi64>
-! CHECK:           %[[VAL_9:.*]] = arith.constant 4 : index
-! CHECK:           fir.store %[[VAL_9]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
-! CHECK:           %[[VAL_12:.*]] = arith.constant 4 : i64
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i64) -> index
-! CHECK:           %[[VAL_16:.*]] = fir.do_loop %[[VAL_17:.*]] = %[[VAL_11]] to %[[VAL_13]] step %[[VAL_15]] iter_args(%[[VAL_18:.*]] = %[[VAL_8]]) -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
-! CHECK:             %[[VAL_20:.*]] = fir.load %[[VAL_0]] : !fir.ref<i8>
-! CHECK:             %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i8) -> i64
-! CHECK:             %[[VAL_22:.*]] = arith.muli %[[VAL_19]], %[[VAL_21]] : i64
-! CHECK:             %[[VAL_23:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_24:.*]] = fir.zero_bits !fir.ref<!fir.array<4xi64>>
-! CHECK:             %[[VAL_25:.*]] = fir.coordinate_of %[[VAL_24]], %[[VAL_23]] : (!fir.ref<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (!fir.ref<i64>) -> index
-! CHECK:             %[[VAL_27:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:             %[[VAL_28:.*]] = fir.load %[[VAL_2]] : !fir.ref<index>
-! CHECK:             %[[VAL_29:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_30:.*]] = arith.addi %[[VAL_27]], %[[VAL_29]] : index
-! CHECK:             %[[VAL_31:.*]] = arith.cmpi sle, %[[VAL_28]], %[[VAL_30]] : index
-! CHECK:             %[[VAL_32:.*]] = fir.if %[[VAL_31]] -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:               %[[VAL_33:.*]] = arith.constant 2 : index
-! CHECK:               %[[VAL_34:.*]] = arith.muli %[[VAL_30]], %[[VAL_33]] : index
-! CHECK:               fir.store %[[VAL_34]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:               %[[VAL_35:.*]] = arith.muli %[[VAL_34]], %[[VAL_26]] : index
-! CHECK:               %[[VAL_36:.*]] = fir.convert %[[VAL_18]] : (!fir.heap<!fir.array<4xi64>>) -> !fir.ref<i8>
-! CHECK:               %[[VAL_37:.*]] = fir.convert %[[VAL_35]] : (index) -> i64
-! CHECK:               %[[VAL_38:.*]] = fir.call @realloc(%[[VAL_36]], %[[VAL_37]]) fastmath<contract> : (!fir.ref<i8>, i64) -> !fir.ref<i8>
-! CHECK:               %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (!fir.ref<i8>) -> !fir.heap<!fir.array<4xi64>>
-! CHECK:               fir.result %[[VAL_39]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             } else {
-! CHECK:               fir.result %[[VAL_18]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             }
-! CHECK:             %[[VAL_40:.*]] = fir.coordinate_of %[[VAL_41:.*]], %[[VAL_27]] : (!fir.heap<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_22]] to %[[VAL_40]] : !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_30]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:             fir.result %[[VAL_41]] : !fir.heap<!fir.array<4xi64>>
+! CHECK-SAME:                        %[[ARG0:.*]]: !fir.ref<i8> {fir.bindc_name = "k"}) -> !fir.array<4xi8> {
+! CHECK:           %[[C1:.*]] = arith.constant 1 : index
+! CHECK:           %[[C4:.*]] = arith.constant 4 : index
+! CHECK:           %[[ARG0_D:.*]] = fir.declare %[[ARG0]]
+! CHECK:           %[[RES:.*]] = fir.alloca !fir.array<4xi8>
+! CHECK:           %[[SHAPE:.*]] = fir.shape %[[C4]]
+! CHECK:           %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]])
+! CHECK:           fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered {
+! CHECK:             %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64
+! CHECK:             %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref<i8>
+! CHECK:             %[[VAL_K_I64:.*]] = fir.convert %[[VAL_K]] : (i8) -> i64
+! CHECK:             %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K_I64]] : i64
+! CHECK:             %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64
+! CHECK:             %[[PROD_I8:.*]] = fir.convert %[[PROD_NO]] : (i64) -> i8
+! CHECK:             %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]]
+! CHECK:             fir.store %[[PROD_I8]] to %[[ADDR]] : !fir.ref<i8>
 ! CHECK:           }
-! CHECK:           %[[VAL_42:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_43:.*]] = fir.shape %[[VAL_42]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_44:.*]] = fir.array_load %[[VAL_45:.*]](%[[VAL_43]]) : (!fir.heap<!fir.array<4xi64>>, !fir.shape<1>) -> !fir.array<4xi64>
-! CHECK:           %[[VAL_46:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_47:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_48:.*]] = arith.subi %[[VAL_3]], %[[VAL_46]] : index
-! CHECK:           %[[VAL_49:.*]] = fir.do_loop %[[VAL_50:.*]] = %[[VAL_47]] to %[[VAL_48]] step %[[VAL_46]] unordered iter_args(%[[VAL_51:.*]] = %[[VAL_6]]) -> (!fir.array<4xi8>) {
-! CHECK:             %[[VAL_52:.*]] = fir.array_fetch %[[VAL_44]], %[[VAL_50]] : (!fir.array<4xi64>, index) -> i64
-! CHECK:             %[[VAL_53:.*]] = fir.no_reassoc %[[VAL_52]] : i64
-! CHECK:             %[[VAL_54:.*]] = fir.convert %[[VAL_53]] : (i64) -> i8
-! CHECK:             %[[VAL_55:.*]] = fir.array_update %[[VAL_51]], %[[VAL_54]], %[[VAL_50]] : (!fir.array<4xi8>, i8, index) -> !fir.array<4xi8>
-! CHECK:             fir.result %[[VAL_55]] : !fir.array<4xi8>
-! CHECK:           }
-! CHECK:           fir.array_merge_store %[[VAL_6]], %[[VAL_56:.*]] to %[[VAL_4]] : !fir.array<4xi8>, !fir.array<4xi8>, !fir.ref<!fir.array<4xi8>>
-! CHECK:           fir.freemem %[[VAL_45]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:           %[[VAL_57:.*]] = fir.load %[[VAL_4]] : !fir.ref<!fir.array<4xi8>>
-! CHECK:           return %[[VAL_57]] : !fir.array<4xi8>
 ! CHECK:         }
 
 function test2(k)
@@ -82,73 +32,23 @@ function test2(k)
   test2 = ([(i*k, integer(8)::i=1,4)])
 end function test2
 ! CHECK-LABEL:   func.func @_QPtest2(
-! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i16> {fir.bindc_name = "k"}) -> !fir.array<4xi16> {
-! CHECK:           %[[VAL_1:.*]] = fir.alloca index {bindc_name = ".buff.pos"}
-! CHECK:           %[[VAL_2:.*]] = fir.alloca index {bindc_name = ".buff.size"}
-! CHECK:           %[[VAL_3:.*]] = arith.constant 4 : index
-! CHECK:           %[[VAL_4:.*]] = fir.alloca !fir.array<4xi16> {bindc_name = "test2", uniq_name = "_QFtest2Etest2"}
-! CHECK:           %[[VAL_5:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_6:.*]] = fir.array_load %[[VAL_4]](%[[VAL_5]]) : (!fir.ref<!fir.array<4xi16>>, !fir.shape<1>) -> !fir.array<4xi16>
-! CHECK:           %[[VAL_7:.*]] = arith.constant 0 : index
-! CHECK:           fir.store %[[VAL_7]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_8:.*]] = fir.allocmem !fir.array<4xi64>
-! CHECK:           %[[VAL_9:.*]] = arith.constant 4 : index
-! CHECK:           fir.store %[[VAL_9]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
-! CHECK:           %[[VAL_12:.*]] = arith.constant 4 : i64
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i64) -> index
-! CHECK:           %[[VAL_16:.*]] = fir.do_loop %[[VAL_17:.*]] = %[[VAL_11]] to %[[VAL_13]] step %[[VAL_15]] iter_args(%[[VAL_18:.*]] = %[[VAL_8]]) -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
-! CHECK:             %[[VAL_20:.*]] = fir.load %[[VAL_0]] : !fir.ref<i16>
-! CHECK:             %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i16) -> i64
-! CHECK:             %[[VAL_22:.*]] = arith.muli %[[VAL_19]], %[[VAL_21]] : i64
-! CHECK:             %[[VAL_23:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_24:.*]] = fir.zero_bits !fir.ref<!fir.array<4xi64>>
-! CHECK:             %[[VAL_25:.*]] = fir.coordinate_of %[[VAL_24]], %[[VAL_23]] : (!fir.ref<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (!fir.ref<i64>) -> index
-! CHECK:             %[[VAL_27:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:             %[[VAL_28:.*]] = fir.load %[[VAL_2]] : !fir.ref<index>
-! CHECK:             %[[VAL_29:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_30:.*]] = arith.addi %[[VAL_27]], %[[VAL_29]] : index
-! CHECK:             %[[VAL_31:.*]] = arith.cmpi sle, %[[VAL_28]], %[[VAL_30]] : index
-! CHECK:             %[[VAL_32:.*]] = fir.if %[[VAL_31]] -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:               %[[VAL_33:.*]] = arith.constant 2 : index
-! CHECK:               %[[VAL_34:.*]] = arith.muli %[[VAL_30]], %[[VAL_33]] : index
-! CHECK:               fir.store %[[VAL_34]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:               %[[VAL_35:.*]] = arith.muli %[[VAL_34]], %[[VAL_26]] : index
-! CHECK:               %[[VAL_36:.*]] = fir.convert %[[VAL_18]] : (!fir.heap<!fir.array<4xi64>>) -> !fir.ref<i8>
-! CHECK:               %[[VAL_37:.*]] = fir.convert %[[VAL_35]] : (index) -> i64
-! CHECK:               %[[VAL_38:.*]] = fir.call @realloc(%[[VAL_36]], %[[VAL_37]]) fastmath<contract> : (!fir.ref<i8>, i64) -> !fir.ref<i8>
-! CHECK:               %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (!fir.ref<i8>) -> !fir.heap<!fir.array<4xi64>>
-! CHECK:               fir.result %[[VAL_39]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             } else {
-! CHECK:               fir.result %[[VAL_18]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             }
-! CHECK:             %[[VAL_40:.*]] = fir.coordinate_of %[[VAL_41:.*]], %[[VAL_27]] : (!fir.heap<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_22]] to %[[VAL_40]] : !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_30]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:             fir.result %[[VAL_41]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:           }
-! CHECK:           %[[VAL_42:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_43:.*]] = fir.shape %[[VAL_42]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_44:.*]] = fir.array_load %[[VAL_45:.*]](%[[VAL_43]]) : (!fir.heap<!fir.array<4xi64>>, !fir.shape<1>) -> !fir.array<4xi64>
-! CHECK:           %[[VAL_46:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_47:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_48:.*]] = arith.subi %[[VAL_3]], %[[VAL_46]] : index
-! CHECK:           %[[VAL_49:.*]] = fir.do_loop %[[VAL_50:.*]] = %[[VAL_47]] to %[[VAL_48]] step %[[VAL_46]] unordered iter_args(%[[VAL_51:.*]] = %[[VAL_6]]) -> (!fir.array<4xi16>) {
-! CHECK:             %[[VAL_52:.*]] = fir.array_fetch %[[VAL_44]], %[[VAL_50]] : (!fir.array<4xi64>, index) -> i64
-! CHECK:             %[[VAL_53:.*]] = fir.no_reassoc %[[VAL_52]] : i64
-! CHECK:             %[[VAL_54:.*]] = fir.convert %[[VAL_53]] : (i64) -> i16
-! CHECK:             %[[VAL_55:.*]] = fir.array_update %[[VAL_51]], %[[VAL_54]], %[[VAL_50]] : (!fir.array<4xi16>, i16, index) -> !fir.array<4xi16>
-! CHECK:             fir.result %[[VAL_55]] : !fir.array<4xi16>
+! CHECK-SAME:                        %[[ARG0:.*]]: !fir.ref<i16> {fir.bindc_name = "k"}) -> !fir.array<4xi16> {
+! CHECK:           %[[C1:.*]] = arith.constant 1 : index
+! CHECK:           %[[C4:.*]] = arith.constant 4 : index
+! CHECK:           %[[ARG0_D:.*]] = fir.declare %[[ARG0]]
+! CHECK:           %[[RES:.*]] = fir.alloca !fir.array<4xi16>
+! CHECK:           %[[SHAPE:.*]] = fir.shape %[[C4]]
+! CHECK:           %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]])
+! CHECK:           fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered {
+! CHECK:             %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64
+! CHECK:             %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref<i16>
+! CHECK:             %[[VAL_K_I64:.*]] = fir.convert %[[VAL_K]] : (i16) -> i64
+! CHECK:             %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K_I64]] : i64
+! CHECK:             %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64
+! CHECK:             %[[PROD_I16:.*]] = fir.convert %[[PROD_NO]] : (i64) -> i16
+! CHECK:             %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]]
+! CHECK:             fir.store %[[PROD_I16]] to %[[ADDR]] : !fir.ref<i16>
 ! CHECK:           }
-! CHECK:           fir.array_merge_store %[[VAL_6]], %[[VAL_56:.*]] to %[[VAL_4]] : !fir.array<4xi16>, !fir.array<4xi16>, !fir.ref<!fir.array<4xi16>>
-! CHECK:           fir.freemem %[[VAL_45]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:           %[[VAL_57:.*]] = fir.load %[[VAL_4]] : !fir.ref<!fir.array<4xi16>>
-! CHECK:           return %[[VAL_57]] : !fir.array<4xi16>
 ! CHECK:         }
 
 function test3(k)
@@ -157,73 +57,23 @@ function test3(k)
   test3 = ([(i*k, integer(8)::i=1,4)])
 end function test3
 ! CHECK-LABEL:   func.func @_QPtest3(
-! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "k"}) -> !fir.array<4xi32> {
-! CHECK:           %[[VAL_1:.*]] = fir.alloca index {bindc_name = ".buff.pos"}
-! CHECK:           %[[VAL_2:.*]] = fir.alloca index {bindc_name = ".buff.size"}
-! CHECK:           %[[VAL_3:.*]] = arith.constant 4 : index
-! CHECK:           %[[VAL_4:.*]] = fir.alloca !fir.array<4xi32> {bindc_name = "test3", uniq_name = "_QFtest3Etest3"}
-! CHECK:           %[[VAL_5:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_6:.*]] = fir.array_load %[[VAL_4]](%[[VAL_5]]) : (!fir.ref<!fir.array<4xi32>>, !fir.shape<1>) -> !fir.array<4xi32>
-! CHECK:           %[[VAL_7:.*]] = arith.constant 0 : index
-! CHECK:           fir.store %[[VAL_7]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_8:.*]] = fir.allocmem !fir.array<4xi64>
-! CHECK:           %[[VAL_9:.*]] = arith.constant 4 : index
-! CHECK:           fir.store %[[VAL_9]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
-! CHECK:           %[[VAL_12:.*]] = arith.constant 4 : i64
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i64) -> index
-! CHECK:           %[[VAL_16:.*]] = fir.do_loop %[[VAL_17:.*]] = %[[VAL_11]] to %[[VAL_13]] step %[[VAL_15]] iter_args(%[[VAL_18:.*]] = %[[VAL_8]]) -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
-! CHECK:             %[[VAL_20:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>
-! CHECK:             %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i32) -> i64
-! CHECK:             %[[VAL_22:.*]] = arith.muli %[[VAL_19]], %[[VAL_21]] : i64
-! CHECK:             %[[VAL_23:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_24:.*]] = fir.zero_bits !fir.ref<!fir.array<4xi64>>
-! CHECK:             %[[VAL_25:.*]] = fir.coordinate_of %[[VAL_24]], %[[VAL_23]] : (!fir.ref<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (!fir.ref<i64>) -> index
-! CHECK:             %[[VAL_27:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:             %[[VAL_28:.*]] = fir.load %[[VAL_2]] : !fir.ref<index>
-! CHECK:             %[[VAL_29:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_30:.*]] = arith.addi %[[VAL_27]], %[[VAL_29]] : index
-! CHECK:             %[[VAL_31:.*]] = arith.cmpi sle, %[[VAL_28]], %[[VAL_30]] : index
-! CHECK:             %[[VAL_32:.*]] = fir.if %[[VAL_31]] -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:               %[[VAL_33:.*]] = arith.constant 2 : index
-! CHECK:               %[[VAL_34:.*]] = arith.muli %[[VAL_30]], %[[VAL_33]] : index
-! CHECK:               fir.store %[[VAL_34]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:               %[[VAL_35:.*]] = arith.muli %[[VAL_34]], %[[VAL_26]] : index
-! CHECK:               %[[VAL_36:.*]] = fir.convert %[[VAL_18]] : (!fir.heap<!fir.array<4xi64>>) -> !fir.ref<i8>
-! CHECK:               %[[VAL_37:.*]] = fir.convert %[[VAL_35]] : (index) -> i64
-! CHECK:               %[[VAL_38:.*]] = fir.call @realloc(%[[VAL_36]], %[[VAL_37]]) fastmath<contract> : (!fir.ref<i8>, i64) -> !fir.ref<i8>
-! CHECK:               %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (!fir.ref<i8>) -> !fir.heap<!fir.array<4xi64>>
-! CHECK:               fir.result %[[VAL_39]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             } else {
-! CHECK:               fir.result %[[VAL_18]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             }
-! CHECK:             %[[VAL_40:.*]] = fir.coordinate_of %[[VAL_41:.*]], %[[VAL_27]] : (!fir.heap<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_22]] to %[[VAL_40]] : !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_30]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:             fir.result %[[VAL_41]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:           }
-! CHECK:           %[[VAL_42:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_43:.*]] = fir.shape %[[VAL_42]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_44:.*]] = fir.array_load %[[VAL_45:.*]](%[[VAL_43]]) : (!fir.heap<!fir.array<4xi64>>, !fir.shape<1>) -> !fir.array<4xi64>
-! CHECK:           %[[VAL_46:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_47:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_48:.*]] = arith.subi %[[VAL_3]], %[[VAL_46]] : index
-! CHECK:           %[[VAL_49:.*]] = fir.do_loop %[[VAL_50:.*]] = %[[VAL_47]] to %[[VAL_48]] step %[[VAL_46]] unordered iter_args(%[[VAL_51:.*]] = %[[VAL_6]]) -> (!fir.array<4xi32>) {
-! CHECK:             %[[VAL_52:.*]] = fir.array_fetch %[[VAL_44]], %[[VAL_50]] : (!fir.array<4xi64>, index) -> i64
-! CHECK:             %[[VAL_53:.*]] = fir.no_reassoc %[[VAL_52]] : i64
-! CHECK:             %[[VAL_54:.*]] = fir.convert %[[VAL_53]] : (i64) -> i32
-! CHECK:             %[[VAL_55:.*]] = fir.array_update %[[VAL_51]], %[[VAL_54]], %[[VAL_50]] : (!fir.array<4xi32>, i32, index) -> !fir.array<4xi32>
-! CHECK:             fir.result %[[VAL_55]] : !fir.array<4xi32>
+! CHECK-SAME:                        %[[ARG0:.*]]: !fir.ref<i32> {fir.bindc_name = "k"}) -> !fir.array<4xi32> {
+! CHECK:           %[[C1:.*]] = arith.constant 1 : index
+! CHECK:           %[[C4:.*]] = arith.constant 4 : index
+! CHECK:           %[[ARG0_D:.*]] = fir.declare %[[ARG0]]
+! CHECK:           %[[RES:.*]] = fir.alloca !fir.array<4xi32>
+! CHECK:           %[[SHAPE:.*]] = fir.shape %[[C4]]
+! CHECK:           %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]])
+! CHECK:           fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered {
+! CHECK:             %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64
+! CHECK:             %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref<i32>
+! CHECK:             %[[VAL_K_I64:.*]] = fir.convert %[[VAL_K]] : (i32) -> i64
+! CHECK:             %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K_I64]] : i64
+! CHECK:             %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64
+! CHECK:             %[[PROD_I32:.*]] = fir.convert %[[PROD_NO]] : (i64) -> i32
+! CHECK:             %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]]
+! CHECK:             fir.store %[[PROD_I32]] to %[[ADDR]] : !fir.ref<i32>
 ! CHECK:           }
-! CHECK:           fir.array_merge_store %[[VAL_6]], %[[VAL_56:.*]] to %[[VAL_4]] : !fir.array<4xi32>, !fir.array<4xi32>, !fir.ref<!fir.array<4xi32>>
-! CHECK:           fir.freemem %[[VAL_45]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:           %[[VAL_57:.*]] = fir.load %[[VAL_4]] : !fir.ref<!fir.array<4xi32>>
-! CHECK:           return %[[VAL_57]] : !fir.array<4xi32>
 ! CHECK:         }
 
 function test4(k)
@@ -232,69 +82,19 @@ function test4(k)
   test4 = ([(i*k, integer(8)::i=1,4)])
 end function test4
 ! CHECK-LABEL:   func.func @_QPtest4(
-! CHECK-SAME:                        %[[VAL_0:.*]]: !fir.ref<i64> {fir.bindc_name = "k"}) -> !fir.array<4xi64> {
-! CHECK:           %[[VAL_1:.*]] = fir.alloca index {bindc_name = ".buff.pos"}
-! CHECK:           %[[VAL_2:.*]] = fir.alloca index {bindc_name = ".buff.size"}
-! CHECK:           %[[VAL_3:.*]] = arith.constant 4 : index
-! CHECK:           %[[VAL_4:.*]] = fir.alloca !fir.array<4xi64> {bindc_name = "test4", uniq_name = "_QFtest4Etest4"}
-! CHECK:           %[[VAL_5:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_6:.*]] = fir.array_load %[[VAL_4]](%[[VAL_5]]) : (!fir.ref<!fir.array<4xi64>>, !fir.shape<1>) -> !fir.array<4xi64>
-! CHECK:           %[[VAL_7:.*]] = arith.constant 0 : index
-! CHECK:           fir.store %[[VAL_7]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_8:.*]] = fir.allocmem !fir.array<4xi64>
-! CHECK:           %[[VAL_9:.*]] = arith.constant 4 : index
-! CHECK:           fir.store %[[VAL_9]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:           %[[VAL_10:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
-! CHECK:           %[[VAL_12:.*]] = arith.constant 4 : i64
-! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index
-! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : i64
-! CHECK:           %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i64) -> index
-! CHECK:           %[[VAL_16:.*]] = fir.do_loop %[[VAL_17:.*]] = %[[VAL_11]] to %[[VAL_13]] step %[[VAL_15]] iter_args(%[[VAL_18:.*]] = %[[VAL_8]]) -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:             %[[VAL_19:.*]] = fir.convert %[[VAL_17]] : (index) -> i64
-! CHECK:             %[[VAL_20:.*]] = fir.load %[[VAL_0]] : !fir.ref<i64>
-! CHECK:             %[[VAL_21:.*]] = arith.muli %[[VAL_19]], %[[VAL_20]] : i64
-! CHECK:             %[[VAL_22:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_23:.*]] = fir.zero_bits !fir.ref<!fir.array<4xi64>>
-! CHECK:             %[[VAL_24:.*]] = fir.coordinate_of %[[VAL_23]], %[[VAL_22]] : (!fir.ref<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (!fir.ref<i64>) -> index
-! CHECK:             %[[VAL_26:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:             %[[VAL_27:.*]] = fir.load %[[VAL_2]] : !fir.ref<index>
-! CHECK:             %[[VAL_28:.*]] = arith.constant 1 : index
-! CHECK:             %[[VAL_29:.*]] = arith.addi %[[VAL_26]], %[[VAL_28]] : index
-! CHECK:             %[[VAL_30:.*]] = arith.cmpi sle, %[[VAL_27]], %[[VAL_29]] : index
-! CHECK:             %[[VAL_31:.*]] = fir.if %[[VAL_30]] -> (!fir.heap<!fir.array<4xi64>>) {
-! CHECK:               %[[VAL_32:.*]] = arith.constant 2 : index
-! CHECK:               %[[VAL_33:.*]] = arith.muli %[[VAL_29]], %[[VAL_32]] : index
-! CHECK:               fir.store %[[VAL_33]] to %[[VAL_2]] : !fir.ref<index>
-! CHECK:               %[[VAL_34:.*]] = arith.muli %[[VAL_33]], %[[VAL_25]] : index
-! CHECK:               %[[VAL_35:.*]] = fir.convert %[[VAL_18]] : (!fir.heap<!fir.array<4xi64>>) -> !fir.ref<i8>
-! CHECK:               %[[VAL_36:.*]] = fir.convert %[[VAL_34]] : (index) -> i64
-! CHECK:               %[[VAL_37:.*]] = fir.call @realloc(%[[VAL_35]], %[[VAL_36]]) fastmath<contract> : (!fir.ref<i8>, i64) -> !fir.ref<i8>
-! CHECK:               %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (!fir.ref<i8>) -> !fir.heap<!fir.array<4xi64>>
-! CHECK:               fir.result %[[VAL_38]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             } else {
-! CHECK:               fir.result %[[VAL_18]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:             }
-! CHECK:             %[[VAL_39:.*]] = fir.coordinate_of %[[VAL_40:.*]], %[[VAL_26]] : (!fir.heap<!fir.array<4xi64>>, index) -> !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_21]] to %[[VAL_39]] : !fir.ref<i64>
-! CHECK:             fir.store %[[VAL_29]] to %[[VAL_1]] : !fir.ref<index>
-! CHECK:             fir.result %[[VAL_40]] : !fir.heap<!fir.array<4xi64>>
+! CHECK-SAME:                        %[[ARG0:.*]]: !fir.ref<i64> {fir.bindc_name = "k"}) -> !fir.array<4xi64> {
+! CHECK:           %[[C1:.*]] = arith.constant 1 : index
+! CHECK:           %[[C4:.*]] = arith.constant 4 : index
+! CHECK:           %[[ARG0_D:.*]] = fir.declare %[[ARG0]]
+! CHECK:           %[[RES:.*]] = fir.alloca !fir.array<4xi64>
+! CHECK:           %[[SHAPE:.*]] = fir.shape %[[C4]]
+! CHECK:           %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]])
+! CHECK:           fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered {
+! CHECK:             %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64
+! CHECK:             %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref<i64>
+! CHECK:             %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K]] : i64
+! CHECK:             %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64
+! CHECK:             %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]]
+! CHECK:             fir.store %[[PROD_NO]] to %[[ADDR]] : !fir.ref<i64>
 ! CHECK:           }
-! CHECK:           %[[VAL_41:.*]] = fir.load %[[VAL_1]] : !fir.ref<index>
-! CHECK:           %[[VAL_42:.*]] = fir.shape %[[VAL_41]] : (index) -> !fir.shape<1>
-! CHECK:           %[[VAL_43:.*]] = fir.array_load %[[VAL_44:.*]](%[[VAL_42]]) : (!fir.heap<!fir.array<4xi64>>, !fir.shape<1>) -> !fir.array<4xi64>
-! CHECK:           %[[VAL_45:.*]] = arith.constant 1 : index
-! CHECK:           %[[VAL_46:.*]] = arith.constant 0 : index
-! CHECK:           %[[VAL_47:.*]] = arith.subi %[[VAL_3]], %[[VAL_45]] : index
-! CHECK:           %[[VAL_48:.*]] = fir.do_loop %[[VAL_49:.*]] = %[[VAL_46]] to %[[VAL_47]] step %[[VAL_45]] unordered iter_args(%[[VAL_50:.*]] = %[[VAL_6]]) -> (!fir.array<4xi64>) {
-! CHECK:             %[[VAL_51:.*]] = fir.array_fetch %[[VAL_43]], %[[VAL_49]] : (!fir.array<4xi64>, index) -> i64
-! CHECK:             %[[VAL_52:.*]] = fir.no_reassoc %[[VAL_51]] : i64
-! CHECK:             %[[VAL_53:.*]] = fir.array_update %[[VAL_50]], %[[VAL_52]], %[[VAL_49]] : (!fir.array<4xi64>, i64, index) -> !fir.array<4xi64>
-! CHECK:             fir.result %[[VAL_53]] : !fir.array<4xi64>
-! CHECK:           }
-! CHECK:           fir.array_merge_store %[[VAL_6]], %[[VAL_54:.*]] to %[[VAL_4]] : !fir.array<4xi64>, !fir.array<4xi64>, !fir.ref<!fir.array<4xi64>>
-! CHECK:           fir.freemem %[[VAL_44]] : !fir.heap<!fir.array<4xi64>>
-! CHECK:           %[[VAL_55:.*]] = fir.load %[[VAL_4]] : !fir.ref<!fir.array<4xi64>>
-! CHECK:           return %[[VAL_55]] : !fir.array<4xi64>
-! CHECK:         }
+! CHECK:         }
\ No newline at end of file
diff --git a/flang/test/Lower/array-derived.f90 b/flang/test/Lower/array-derived.f90
index a0c55f5d88255..4236fe6326741 100644
--- a/flang/test/Lower/array-derived.f90
+++ b/flang/test/Lower/array-derived.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -hlfir=false -fwrapv %s -o - | FileCheck %s
+! RUN: flang -fc1 -emit-fir -fwrapv %s -o - | FileCheck %s
 
 module cs
   type r
@@ -16,126 +16,131 @@ module cs
 
 contains
 
-  ! CHECK: func @_QMcsPc1(
-  ! CHECK-SAME:   %[[arg0:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>{{.*}}, %[[arg1:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>{{.*}})
+  ! CHECK-LABEL: func.func @_QMcsPc1(
+  ! CHECK-SAME: %[[arg0:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>{{.*}}, %[[arg1:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>{{.*}}) -> !fir.logical<1> {
   function c1(e, c)
     type(r), intent(in) :: e(:), c(:)
-    ! CHECK-DAG: fir.alloca !fir.logical<1> {bindc_name = "c1", uniq_name = "_QMcsFc1Ec1"}
     logical*1 :: c1
-    ! CHECK-DAG: %[[fldn:.*]] = fir.field_index n, !fir.type<_QMcsTr{n:i32,d:i32}>
-    ! CHECK: %[[ext1:.*]]:3 = fir.box_dims %[[arg1]], %c0{{.*}} : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, index) -> (index, index, index)
-    ! CHECK-DAG: %[[slice1:.*]] = fir.slice %c1{{.*}}, %[[ext1]]#1, %c1{{.*}} path %[[fldn]] : (index, index, index, !fir.field) -> !fir.slice<1>
-    ! CHECK-DAG: %[[ext0:.*]]:3 = fir.box_dims %[[arg0]], %c0{{.*}} : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, index) -> (index, index, index)
-    ! CHECK: %[[slice0:.*]] = fir.slice %c1{{.*}}, %[[ext0]]#1, %c1{{.*}} path %[[fldn]] : (index, index, index, !fir.field) -> !fir.slice<1>
-    ! CHECK-DAG: = fir.array_coor %[[arg1]] [%[[slice1]]] %[[index:.*]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-    ! CHECK-DAG: = fir.array_coor %[[arg0]] [%[[slice0]]] %[[index]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTr{n:i32,d:i32}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-    ! CHECK: = fir.call @_FortranAAllLogical4x1_simplified(
-    c1 = all(c%n == e%n)
-  end function c1
+    ! CHECK-DAG: %[[c1_ref:.*]] = fir.alloca !fir.logical<1>
+
+    ! CHECK-DAG: %[[c_decl:.*]] = fir.declare %[[arg1]] {{.*}}
+    ! CHECK-DAG: %[[c_rebox:.*]] = fir.rebox %[[c_decl]] : {{.*}}
 
-! CHECK-LABEL: func @_QMcsPtest2(
-! CHECK-SAME:    %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>{{.*}}) {
-! CHECK-DAG:     %[[VAL_2:.*]] = arith.constant 2 : index
-! CHECK-DAG:     %[[VAL_3:.*]] = arith.constant 4 : index
-! CHECK-DAG:     %[[VAL_4:.*]] = arith.constant 0 : index
-! CHECK-DAG:     %[[VAL_5:.*]] = arith.constant 1 : index
-! CHECK:         %[[VAL_6:.*]] = fir.field_index f2, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
-! CHECK:         %[[VAL_7:.*]] = fir.field_index d, !fir.type<_QMcsTr{n:i32,d:i32}>
-! CHECK:         %[[VAL_8:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_4]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_9:.*]] = fir.slice %[[VAL_5]], %[[VAL_8]]#1, %[[VAL_5]] path %[[VAL_6]], %[[VAL_7]] : (index, index, index, !fir.field, !fir.field) -> !fir.slice<1>
-! CHECK:         %[[VAL_8_2:.*]] = arith.cmpi sgt, %[[VAL_8]]#1, %[[VAL_4]] : index
-! CHECK:         %[[VAL_8_3:.*]] = arith.select %[[VAL_8_2]], %[[VAL_8]]#1, %[[VAL_4]] : index
-! CHECK:         %[[VAL_10:.*]] = fir.field_index f1, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
-! CHECK:         %[[VAL_11:.*]]:3 = fir.box_dims %[[VAL_1]], %[[VAL_4]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_12:.*]] = fir.slice %[[VAL_5]], %[[VAL_11]]#1, %[[VAL_5]] path %[[VAL_10]], %[[VAL_4]] : (index, index, index, !fir.field, index) -> !fir.slice<1>
-! CHECK:         %[[VAL_13:.*]] = fir.slice %[[VAL_5]], %[[VAL_11]]#1, %[[VAL_5]] path %[[VAL_10]], %[[VAL_3]] : (index, index, index, !fir.field, index) -> !fir.slice<1>
-! CHECK:         %[[VAL_14:.*]] = fir.slice %[[VAL_5]], %[[VAL_11]]#1, %[[VAL_5]] path %[[VAL_10]], %[[VAL_2]] : (index, index, index, !fir.field, index) -> !fir.slice<1>
-! CHECK:         br ^bb1(%[[VAL_4]], %[[VAL_8_3]] : index, index)
-! CHECK:       ^bb1(%[[VAL_15:.*]]: index, %[[VAL_16:.*]]: index):
-! CHECK:         %[[VAL_17:.*]] = arith.cmpi sgt, %[[VAL_16]], %[[VAL_4]] : index
-! CHECK:         cond_br %[[VAL_17]], ^bb2, ^bb3
-! CHECK:       ^bb2:
-! CHECK:         %[[VAL_18:.*]] = arith.addi %[[VAL_15]], %[[VAL_5]] : index
-! CHECK:         %[[VAL_19:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_12]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         %[[VAL_20:.*]] = fir.load %[[VAL_19]] : !fir.ref<i32>
-! CHECK:         %[[VAL_21:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_13]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         %[[VAL_22:.*]] = fir.load %[[VAL_21]] : !fir.ref<i32>
-! CHECK:         %[[VAL_23:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_14]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         %[[VAL_24:.*]] = fir.load %[[VAL_23]] : !fir.ref<i32>
-! CHECK:         %[[VAL_25:.*]] = arith.divsi %[[VAL_22]], %[[VAL_24]] : i32
-! CHECK:         %[[VAL_26:.*]] = arith.addi %[[VAL_20]], %[[VAL_25]] : i32
-! CHECK:         %[[VAL_27:.*]] = fir.array_coor %[[VAL_0]] {{\[}}%[[VAL_9]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         fir.store %[[VAL_26]] to %[[VAL_27]] : !fir.ref<i32>
-! CHECK:         %[[VAL_28:.*]] = arith.subi %[[VAL_16]], %[[VAL_5]] : index
-! CHECK:         br ^bb1(%[[VAL_18]], %[[VAL_28]] : index, index)
-! CHECK:       ^bb3:
-! CHECK:         return
-! CHECK:       }
+    ! CHECK-DAG: %[[e_decl:.*]] = fir.declare %[[arg0]] {{.*}}
+    ! CHECK-DAG: %[[e_rebox:.*]] = fir.rebox %[[e_decl]] : {{.*}}
 
+    ! CHECK-DAG: %[[fldn_c:.*]] = fir.field_index n, !fir.type<_QMcsTr{n:i32,d:i32}>
+    ! CHECK: %[[slice_c:.*]] = fir.slice {{.*}} path %[[fldn_c]] : (index, index, index, !fir.field) -> !fir.slice<1>
+    ! CHECK: %[[c_n_rebox:.*]] = fir.rebox %[[c_rebox]] [%[[slice_c]]]
+    ! CHECK-DAG: %[[fldn_e:.*]] = fir.field_index n, !fir.type<_QMcsTr{n:i32,d:i32}>
+    ! CHECK: %[[slice_e:.*]] = fir.slice {{.*}} path %[[fldn_e]] : (index, index, index, !fir.field) -> !fir.slice<1>
+    ! CHECK: %[[e_n_rebox:.*]] = fir.rebox %[[e_rebox]] [%[[slice_e]]]
+    ! CHECK: fir.do_loop {{.*}} {
+    ! CHECK:   %[[c_addr:.*]] = fir.array_coor %[[c_n_rebox]]
+    ! CHECK:   %[[e_addr:.*]] = fir.array_coor %[[e_n_rebox]]
+    ! CHECK:   %[[c_val:.*]] = fir.load %[[c_addr]]
+    ! CHECK:   %[[e_val:.*]] = fir.load %[[e_addr]]
+    ! CHECK:   %[[cmp:.*]] = arith.cmpi eq, %[[c_val]], %[[e_val]]
+    ! CHECK:   {{.*}} = fir.convert %[[cmp]] : (i1) -> !fir.logical<4>
+    ! CHECK:   fir.store {{.*}}
+    ! CHECK: }
+    c1 = all(c%n == e%n)
+  end function c1
 
+  ! CHECK-LABEL: func.func @_QMcsPtest2(
+  ! CHECK-SAME: %[[arg0:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>{{.*}}, %[[arg1:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>>{{.*}}) {
   subroutine test2(a1, a2)
     type(t2) :: a1(:), a2(:)
+    ! CHECK-DAG: %[[a1_decl:.*]] = fir.declare %[[arg0]] {{.*}}
+    ! CHECK-DAG: %[[a1_rebox:.*]] = fir.rebox %[[a1_decl]] : {{.*}}
+    ! CHECK-DAG: %[[a2_decl:.*]] = fir.declare %[[arg1]] {{.*}}
+    ! CHECK-DAG: %[[a2_rebox:.*]] = fir.rebox %[[a2_decl]] : {{.*}}
+
+    ! slice for a2%f1(1)
+    ! CHECK-DAG: %[[fld_f1_1:.*]] = fir.field_index f1, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
+    ! CHECK: %[[slice_a2_f1_1:.*]] = fir.slice {{.*}} path %[[fld_f1_1]], {{.*}}
+    ! CHECK: %[[a2_f1_1_rebox:.*]] = fir.rebox %[[a2_rebox]] [%[[slice_a2_f1_1]]]
+
+    ! slice for a2%f1(5)
+    ! CHECK-DAG: %[[fld_f1_5:.*]] = fir.field_index f1, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
+    ! CHECK: %[[slice_a2_f1_5:.*]] = fir.slice {{.*}} path %[[fld_f1_5]], {{.*}}
+    ! CHECK: %[[a2_f1_5_rebox:.*]] = fir.rebox %[[a2_rebox]] [%[[slice_a2_f1_5]]]
+
+    ! slice for a2%f1(3)
+    ! CHECK-DAG: %[[fld_f1_3:.*]] = fir.field_index f1, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
+    ! CHECK: %[[slice_a2_f1_3:.*]] = fir.slice {{.*}} path %[[fld_f1_3]], {{.*}}
+    ! CHECK: %[[a2_f1_3_rebox:.*]] = fir.rebox %[[a2_rebox]] [%[[slice_a2_f1_3]]]
+
+    ! RHS computation
+    ! CHECK: %[[temp:.*]] = fir.allocmem !fir.array<?xi32>
+    ! CHECK: fir.do_loop {{.*}} {
+    ! CHECK:   %[[val_f1_5:.*]] = fir.load {{.*}}
+    ! CHECK:   %[[val_f1_3:.*]] = fir.load {{.*}}
+    ! CHECK:   %[[div:.*]] = arith.divsi %[[val_f1_5]], %[[val_f1_3]]
+    ! CHECK:   %[[val_f1_1:.*]] = fir.load {{.*}}
+    ! CHECK:   %[[sum:.*]] = arith.addi %[[val_f1_1]], %[[div]]
+    ! CHECK:   fir.store %[[sum]] to {{.*}}
+    ! CHECK: }
+
+    ! slice for a1%f2%d
+    ! CHECK-DAG: %[[fld_f2:.*]] = fir.field_index f2, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
+    ! CHECK: %[[slice_a1_f2:.*]] = fir.slice {{.*}} path %[[fld_f2]] : (index, index, index, !fir.field) -> !fir.slice<1>
+    ! CHECK: %[[a1_f2_rebox:.*]] = fir.rebox %[[a1_rebox]] [%[[slice_a1_f2]]]
+    ! CHECK-DAG: %[[fld_d:.*]] = fir.field_index d, !fir.type<_QMcsTr{n:i32,d:i32}>
+    ! CHECK: %[[slice_d:.*]] = fir.slice {{.*}} path %[[fld_d]] : (index, index, index, !fir.field) -> !fir.slice<1>
+    ! CHECK: %[[a1_f2_d_rebox:.*]] = fir.rebox %[[a1_f2_rebox]] [%[[slice_d]]]
+
+    ! Assignment
+    ! CHECK: fir.call @_FortranAAssign
     a1%f2%d = a2%f1(1) + a2%f1(5) / a2%f1(3)
   end subroutine test2
 
-! CHECK-LABEL: func @_QMcsPtest3(
-! CHECK-SAME:    %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>{{.*}}, %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>{{.*}}) {
-! CHECK-DAG:     %[[VAL_2:.*]] = arith.constant 2 : index
-! CHECK-DAG:     %[[VAL_3:.*]] = arith.constant 3 : index
-! CHECK-DAG:     %[[VAL_4:.*]] = arith.constant 4 : i32
-! CHECK-DAG:     %[[VAL_5:.*]] = arith.constant 1 : index
-! CHECK-DAG:     %[[VAL_6:.*]] = arith.constant 0 : index
-! CHECK:         %[[VAL_7:.*]] = fir.field_index f, !fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>
-! CHECK:         %[[VAL_8:.*]] = fir.field_index f2, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
-! CHECK:         %[[VAL_9:.*]] = fir.field_index n, !fir.type<_QMcsTr{n:i32,d:i32}>
-! CHECK:         %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_0]], %[[VAL_6]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_11:.*]] = fir.slice %[[VAL_5]], %[[VAL_10]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_6]], %[[VAL_6]], %[[VAL_8]], %[[VAL_9]] : (index, index, index, !fir.field, index, index, !fir.field, !fir.field) -> !fir.slice<1>
-! CHECK:         %[[VAL_10_2:.*]] = arith.cmpi sgt, %[[VAL_10]]#1, %[[VAL_6]] : index
-! CHECK:         %[[VAL_10_3:.*]] = arith.select %[[VAL_10_2]], %[[VAL_10]]#1, %[[VAL_6]] : index
-! CHECK:         %[[VAL_12:.*]] = fir.field_index f1, !fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>
-! CHECK:         %[[VAL_13:.*]]:3 = fir.box_dims %[[VAL_1]], %[[VAL_6]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, index) -> (index, index, index)
-! CHECK:         %[[VAL_14:.*]] = fir.slice %[[VAL_5]], %[[VAL_13]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_5]], %[[VAL_5]], %[[VAL_12]], %[[VAL_3]] : (index, index, index, !fir.field, index, index, !fir.field, index) -> !fir.slice<1>
-! CHECK:         br ^bb1(%[[VAL_6]], %[[VAL_10_3]] : index, index)
-! CHECK:       ^bb1(%[[VAL_15:.*]]: index, %[[VAL_16:.*]]: index):
-! CHECK:         %[[VAL_17:.*]] = arith.cmpi sgt, %[[VAL_16]], %[[VAL_6]] : index
-! CHECK:         cond_br %[[VAL_17]], ^bb2, ^bb3
-! CHECK:       ^bb2:
-! CHECK:         %[[VAL_18:.*]] = arith.addi %[[VAL_15]], %[[VAL_5]] : index
-! CHECK:         %[[VAL_19:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_14]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         %[[VAL_20:.*]] = fir.load %[[VAL_19]] : !fir.ref<i32>
-! CHECK:         %[[VAL_21:.*]] = arith.subi %[[VAL_20]], %[[VAL_4]] : i32
-! CHECK:         %[[VAL_22:.*]] = fir.array_coor %[[VAL_0]] {{\[}}%[[VAL_11]]] %[[VAL_18]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         fir.store %[[VAL_21]] to %[[VAL_22]] : !fir.ref<i32>
-! CHECK:         %[[VAL_23:.*]] = arith.subi %[[VAL_16]], %[[VAL_5]] : index
-! CHECK:         br ^bb1(%[[VAL_18]], %[[VAL_23]] : index, index)
-! CHECK:       ^bb3:
-! CHECK:         %[[VAL_24:.*]] = fir.slice %[[VAL_5]], %[[VAL_13]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_2]], %[[VAL_2]], %[[VAL_12]], %[[VAL_5]] : (index, index, index, !fir.field, index, index, !fir.field, index) -> !fir.slice<1>
-! CHECK:         %[[VAL_13_2:.*]] = arith.cmpi sgt, %[[VAL_13]]#1, %[[VAL_6]] : index
-! CHECK:         %[[VAL_13_3:.*]] = arith.select %[[VAL_13_2]], %[[VAL_13]]#1, %[[VAL_6]] : index
-! CHECK:         %[[VAL_25:.*]] = fir.field_index d, !fir.type<_QMcsTr{n:i32,d:i32}>
-! CHECK:         %[[VAL_26:.*]] = fir.slice %[[VAL_5]], %[[VAL_10]]#1, %[[VAL_5]] path %[[VAL_7]], %[[VAL_6]], %[[VAL_5]], %[[VAL_8]], %[[VAL_25]] : (index, index, index, !fir.field, index, index, !fir.field, !fir.field) -> !fir.slice<1>
-! CHECK:         br ^bb4(%[[VAL_6]], %[[VAL_13_3]] : index, index)
-! CHECK:       ^bb4(%[[VAL_27:.*]]: index, %[[VAL_28:.*]]: index):
-! CHECK:         %[[VAL_29:.*]] = arith.cmpi sgt, %[[VAL_28]], %[[VAL_6]] : index
-! CHECK:         cond_br %[[VAL_29]], ^bb5, ^bb6
-! CHECK:       ^bb5:
-! CHECK:         %[[VAL_30:.*]] = arith.addi %[[VAL_27]], %[[VAL_5]] : index
-! CHECK:         %[[VAL_31:.*]] = fir.array_coor %[[VAL_0]] {{\[}}%[[VAL_26]]] %[[VAL_30]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         %[[VAL_32:.*]] = fir.load %[[VAL_31]] : !fir.ref<i32>
-! CHECK:         %[[VAL_33:.*]] = arith.addi %[[VAL_32]], %[[VAL_4]] : i32
-! CHECK:         %[[VAL_34:.*]] = fir.array_coor %[[VAL_1]] {{\[}}%[[VAL_24]]] %[[VAL_30]] : (!fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>, !fir.slice<1>, index) -> !fir.ref<i32>
-! CHECK:         fir.store %[[VAL_33]] to %[[VAL_34]] : !fir.ref<i32>
-! CHECK:         %[[VAL_35:.*]] = arith.subi %[[VAL_28]], %[[VAL_5]] : index
-! CHECK:         br ^bb4(%[[VAL_30]], %[[VAL_35]] : index, index)
-! CHECK:       ^bb6:
-! CHECK:         return
-! CHECK:       }
-
+  ! CHECK-LABEL: func.func @_QMcsPtest3(
+  ! CHECK-SAME: %[[arg0:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>{{.*}}, %[[arg1:[^:]+]]: !fir.box<!fir.array<?x!fir.type<_QMcsTt3{f:!fir.array<3x3x!fir.type<_QMcsTt2{f1:!fir.array<5xi32>,f2:!fir.type<_QMcsTr{n:i32,d:i32}>}>>}>>>{{.*}}) {
   subroutine test3(a3, a4)
     type(t3) :: a3(:), a4(:)
+    ! CHECK-DAG: %[[a3_decl:.*]] = fir.declare %[[arg0]] {{.*}}
+    ! CHECK-DAG: %[[a3_rebox:.*]] = fir.rebox %[[a3_decl]] : {{.*}}
+    ! CHECK-DAG: %[[a4_decl:.*]] = fir.declare %[[arg1]] {{.*}}
+    ! CHECK-DAG: %[[a4_rebox:.*]] = fir.rebox %[[a4_decl]] : {{.*}}
+
+    ! Assignment 1
+    ! a3%f(1,1)%f2%n = a4%f(2,2)%f1(4) - 4
+
+    ! RHS: a4%f(2,2)%f1(4)
+    ! CHECK: %[[slice_a4_f:.*]] = fir.slice {{.*}} path %{{.*}}, {{.*}}, {{.*}}
+    ! CHECK: %[[a4_f_rebox:.*]] = fir.rebox %[[a4_rebox]] [%[[slice_a4_f]]]
+    ! CHECK: %[[slice_a4_f1:.*]] = fir.slice {{.*}} path %{{.*}}, {{.*}}
+    ! CHECK: %[[a4_f1_rebox:.*]] = fir.rebox %[[a4_f_rebox]] [%[[slice_a4_f1]]]
+
+    ! CHECK: %[[temp1:.*]] = fir.allocmem !fir.array<?xi32>
+    ! CHECK: fir.do_loop {{.*}} {
+    ! CHECK:   fir.load
+    ! CHECK:   arith.subi
+    ! CHECK:   fir.store
+    ! CHECK: }
+
+    ! LHS: a3%f(1,1)%f2%n
+    ! CHECK: %[[slice_a3_f:.*]] = fir.slice {{.*}} path %{{.*}}, {{.*}}, {{.*}}
+    ! CHECK: %[[a3_f_rebox:.*]] = fir.rebox %[[a3_rebox]] [%[[slice_a3_f]]]
+    ! CHECK: %[[slice_a3_f2:.*]] = fir.slice {{.*}} path %{{.*}}
+    ! CHECK: %[[a3_f2_rebox:.*]] = fir.rebox %[[a3_f_rebox]] [%[[slice_a3_f2]]]
+    ! CHECK: %[[slice_a3_n:.*]] = fir.slice {{.*}} path %{{.*}}
+    ! CHECK: %[[a3_n_rebox:.*]] = fir.rebox %[[a3_f2_rebox]] [%[[slice_a3_n]]]
+
+    ! CHECK: fir.call @_FortranAAssign
     a3%f(1,1)%f2%n = a4%f(2,2)%f1(4) - 4
+
+    ! Assignment 2
+    ! a4%f(3,3)%f1(2) = a3%f(1,2)%f2%d + 4
+
+    ! CHECK: %[[temp2:.*]] = fir.allocmem !fir.array<?xi32>
+    ! CHECK: fir.do_loop {{.*}} {
+    ! CHECK:   fir.load
+    ! CHECK:   arith.addi
+    ! CHECK:   fir.store
+    ! CHECK: }
+    ! CHECK: fir.call @_FortranAAssign
     a4%f(3,3)%f1(2) = a3%f(1,2)%f2%d + 4
   end subroutine test3
 end module cs
-
-! CHECK: func private @_FortranAAll(!fir.box<none>, !fir.ref<i8>, i32, i32) -> i1 attributes {fir.runtime}

>From 6430427e3b26cc07810a0f7b127825db35034aeb Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Sun, 4 Jan 2026 15:14:03 -0500
Subject: [PATCH 2/4] whitespace change

---
 flang/test/Lower/array-constructor-1.f90 | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/flang/test/Lower/array-constructor-1.f90 b/flang/test/Lower/array-constructor-1.f90
index e061f0be9ccdc..b66c324b52c51 100644
--- a/flang/test/Lower/array-constructor-1.f90
+++ b/flang/test/Lower/array-constructor-1.f90
@@ -43,4 +43,5 @@ program prog
 
 ! CHECK: fir.global internal @_QFzeroECa constant : !fir.array<0xcomplex<f32>>
 ! CHECK:   %0 = fir.undefined !fir.array<0xcomplex<f32>>
-! CHECK:   fir.has_value %0 : !fir.array<0xcomplex<f32>>
\ No newline at end of file
+! CHECK:   fir.has_value %0 : !fir.array<0xcomplex<f32>>
+

>From b203093831f0ba1f8fff049bde2e3886692eb29b Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Sun, 4 Jan 2026 15:18:13 -0500
Subject: [PATCH 3/4] whitespace change

---
 flang/test/Lower/array-constructor-index.f90 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/flang/test/Lower/array-constructor-index.f90 b/flang/test/Lower/array-constructor-index.f90
index 6b0fbf6ecc729..42080f9b6bdd5 100644
--- a/flang/test/Lower/array-constructor-index.f90
+++ b/flang/test/Lower/array-constructor-index.f90
@@ -97,4 +97,4 @@ end function test4
 ! CHECK:             %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]]
 ! CHECK:             fir.store %[[PROD_NO]] to %[[ADDR]] : !fir.ref<i64>
 ! CHECK:           }
-! CHECK:         }
\ No newline at end of file
+! CHECK:         }

>From 6ef4d8aefa370d47fe29c12ea7d33ecff9c43961 Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Tue, 6 Jan 2026 09:07:27 -0500
Subject: [PATCH 4/4] end of line differences

---
 flang/test/Lower/always-execute-loop-body.f90 | 2 +-
 flang/test/Lower/arithmetic-goto.f90          | 2 +-
 flang/test/Lower/array-constructor-1.f90      | 1 -
 3 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/flang/test/Lower/always-execute-loop-body.f90 b/flang/test/Lower/always-execute-loop-body.f90
index f3628419abde2..a3b2045210ac7 100644
--- a/flang/test/Lower/always-execute-loop-body.f90
+++ b/flang/test/Lower/always-execute-loop-body.f90
@@ -18,4 +18,4 @@ subroutine some()
     stop 2
   end do
   return
-end
\ No newline at end of file
+end
diff --git a/flang/test/Lower/arithmetic-goto.f90 b/flang/test/Lower/arithmetic-goto.f90
index 9fd6e4e6020e7..d2226c103cb95 100644
--- a/flang/test/Lower/arithmetic-goto.f90
+++ b/flang/test/Lower/arithmetic-goto.f90
@@ -77,4 +77,4 @@ function kagf(findex)
   print*, kagf(+0.0)
   print*, kagf(+1.0)
   print*, kagf(+2.0)
-end
\ No newline at end of file
+end
diff --git a/flang/test/Lower/array-constructor-1.f90 b/flang/test/Lower/array-constructor-1.f90
index b66c324b52c51..55e7bb0f0416b 100644
--- a/flang/test/Lower/array-constructor-1.f90
+++ b/flang/test/Lower/array-constructor-1.f90
@@ -44,4 +44,3 @@ program prog
 ! CHECK: fir.global internal @_QFzeroECa constant : !fir.array<0xcomplex<f32>>
 ! CHECK:   %0 = fir.undefined !fir.array<0xcomplex<f32>>
 ! CHECK:   fir.has_value %0 : !fir.array<0xcomplex<f32>>
-



More information about the flang-commits mailing list