[flang-commits] [flang] f82a74a - [flang][NFC] Converted five tests from old lowering to new lowering (part 51) (#194522)

via flang-commits flang-commits at lists.llvm.org
Tue Apr 28 05:30:14 PDT 2026


Author: Eugene Epshteyn
Date: 2026-04-28T08:30:09-04:00
New Revision: f82a74a9bd6b62b41540950b8b64a207206baaf5

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

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

Converted Lower/associate-construct.f90,
Lower/default-initialization.f90, Lower/select-type-2.f90,
Lower/statement-function.f90, and Lower/submodule.f90 from legacy
lowering (-hlfir=false) to new lowering (-emit-hlfir).

Added: 
    

Modified: 
    flang/test/Lower/associate-construct.f90
    flang/test/Lower/default-initialization.f90
    flang/test/Lower/select-type-2.f90
    flang/test/Lower/statement-function.f90
    flang/test/Lower/submodule.f90

Removed: 
    


################################################################################
diff  --git a/flang/test/Lower/associate-construct.f90 b/flang/test/Lower/associate-construct.f90
index cca9378431990..1911c540539fa 100644
--- a/flang/test/Lower/associate-construct.f90
+++ b/flang/test/Lower/associate-construct.f90
@@ -1,39 +1,50 @@
-! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir -o - %s | FileCheck %s
 
 ! CHECK-LABEL: func @_QQmain
 program p
-  ! CHECK-DAG: [[I:%[0-9]+]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEi"}
-  ! CHECK-DAG: [[N:%[0-9]+]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEn"}
-  ! CHECK: [[T:%[0-9]+]] = fir.alloca !fir.array<3xi32> {bindc_name = "t", uniq_name = "_QFEt"}
+  ! CHECK-DAG: %[[I_ALLOC:.*]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEi"}
+  ! CHECK-DAG: %[[I:.*]]:2 = hlfir.declare %[[I_ALLOC]] {uniq_name = "_QFEi"}
+  ! CHECK-DAG: %[[N_ALLOC:.*]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEn"}
+  ! CHECK-DAG: %[[N:.*]]:2 = hlfir.declare %[[N_ALLOC]] {uniq_name = "_QFEn"}
+  ! CHECK: %[[T_ALLOC:.*]] = fir.alloca !fir.array<3xi32> {bindc_name = "t", uniq_name = "_QFEt"}
+  ! CHECK: %[[T:.*]]:2 = hlfir.declare %[[T_ALLOC]](%{{.*}}) {uniq_name = "_QFEt"}
   integer :: n, foo, t(3)
-  ! CHECK: [[N]]
-  ! CHECK-COUNT-3: fir.coordinate_of [[T]]
+  ! CHECK: hlfir.assign %c100{{.*}} to %[[N]]#0
+  ! CHECK-COUNT-3: hlfir.designate %[[T]]#0
   n = 100; t(1) = 111; t(2) = 222; t(3) = 333
-  ! CHECK: fir.load [[N]]
-  ! CHECK: addi {{.*}} %c5
-  ! CHECK: fir.store %{{[0-9]*}} to [[B:%[0-9]+]]
-  ! CHECK: [[C:%[0-9]+]] = fir.coordinate_of [[T]]
-  ! CHECK: fir.call @_QPfoo
-  ! CHECK: fir.store %{{[0-9]*}} to [[D:%[0-9]+]]
+  ! 'a' is associated to 'n' directly via hlfir.declare wrapping %[[N]]
+  ! CHECK: %[[A:.*]]:2 = hlfir.declare %[[N]]#0 {uniq_name = "_QFEa"}
+  ! 'b' = n+5: load n, addi 5, store to alloca, hlfir.declare it
+  ! CHECK: %[[NLOAD_B:.*]] = fir.load %[[N]]#0
+  ! CHECK: %[[NPLUS5:.*]] = arith.addi %[[NLOAD_B]], %c5{{.*}} : i32
+  ! CHECK: fir.store %[[NPLUS5]] to %[[B_ALLOC:.*]] : !fir.ref<i32>
+  ! CHECK: %[[B:.*]]:2 = hlfir.declare %[[B_ALLOC]] {uniq_name = "_QFEb"}
+  ! 'c' = t(2): designate, hlfir.declare it
+  ! CHECK: %[[C_DESIG:.*]] = hlfir.designate %[[T]]#0 (%c2{{.*}})
+  ! CHECK: %[[C:.*]]:2 = hlfir.declare %[[C_DESIG]] {uniq_name = "_QFEc"}
+  ! 'd' = foo(7): call foo, store result, hlfir.declare it
+  ! CHECK: %[[FOO_CALL:.*]] = fir.call @_QPfoo(%{{.*}})
+  ! CHECK: fir.store %[[FOO_CALL]] to %[[D_ALLOC:.*]] : !fir.ref<i32>
+  ! CHECK: %[[D:.*]]:2 = hlfir.declare %[[D_ALLOC]] {uniq_name = "_QFEd"}
   associate (a => n, b => n+5, c => t(2), d => foo(7))
-    ! CHECK: fir.load [[N]]
-    ! CHECK: addi %{{[0-9]*}}, %c1
-    ! CHECK: fir.store %{{[0-9]*}} to [[N]]
+    ! CHECK: fir.load %[[A]]#0
+    ! CHECK: arith.addi %{{.*}}, %c1
+    ! CHECK: hlfir.assign %{{.*}} to %[[A]]#0
     a = a + 1
-    ! CHECK: fir.load [[C]]
-    ! CHECK: addi %{{[0-9]*}}, %c1
-    ! CHECK: fir.store %{{[0-9]*}} to [[C]]
+    ! CHECK: fir.load %[[C]]#0
+    ! CHECK: arith.addi %{{.*}}, %c1
+    ! CHECK: hlfir.assign %{{.*}} to %[[C]]#0
     c = c + 1
-    ! CHECK: fir.load [[N]]
-    ! CHECK: addi %{{[0-9]*}}, %c1
-    ! CHECK: fir.store %{{[0-9]*}} to [[N]]
+    ! CHECK: fir.load %[[N]]#0
+    ! CHECK: arith.addi %{{.*}}, %c1
+    ! CHECK: hlfir.assign %{{.*}} to %[[N]]#0
     n = n + 1
-    ! CHECK: fir.load [[N]]
-    ! CHECK: fir.embox [[T]]
-    ! CHECK: fir.load [[N]]
-    ! CHECK: fir.load [[B]]
-    ! CHECK: fir.load [[C]]
-    ! CHECK: fir.load [[D]]
+    ! CHECK: fir.load %[[N]]#0
+    ! CHECK: fir.embox %[[T]]#0
+    ! CHECK: fir.load %[[A]]#0
+    ! CHECK: fir.load %[[B]]#0
+    ! CHECK: fir.load %[[C]]#0
+    ! CHECK: fir.load %[[D]]#0
     print*, n, t, a, b, c, d ! expect: 102 111 223 333 102 105 223 7
   end associate
 
@@ -41,14 +52,16 @@ program p
 
   do i=1,4
     associate (x=>i)
-      ! CHECK: [[IVAL:%[0-9]+]] = fir.load [[I]] : !fir.ref<i32>
-      ! CHECK: [[TWO:%.*]] = arith.constant 2 : i32
-      ! CHECK: arith.cmpi eq, [[IVAL]], [[TWO]] : i32
+      ! 'x' is associated to 'i' directly via hlfir.declare
+      ! CHECK: %[[X:.*]]:2 = hlfir.declare %[[I]]#0 {uniq_name = "_QFEx"}
+      ! CHECK: %[[XVAL:.*]] = fir.load %[[X]]#0 : !fir.ref<i32>
+      ! CHECK: %[[TWO:.*]] = arith.constant 2 : i32
+      ! CHECK: arith.cmpi eq, %[[XVAL]], %[[TWO]] : i32
       ! CHECK: ^bb
       if (x==2) goto 9
-      ! CHECK: [[IVAL:%[0-9]+]] = fir.load [[I]] : !fir.ref<i32>
-      ! CHECK: [[THREE:%.*]] = arith.constant 3 : i32
-      ! CHECK: arith.cmpi eq, [[IVAL]], [[THREE]] : i32
+      ! CHECK: %[[XVAL2:.*]] = fir.load %[[X]]#0 : !fir.ref<i32>
+      ! CHECK: %[[THREE:.*]] = arith.constant 3 : i32
+      ! CHECK: arith.cmpi eq, %[[XVAL2]], %[[THREE]] : i32
       ! CHECK: ^bb
       ! CHECK: fir.call @_FortranAStopStatementText
       ! CHECK: fir.unreachable

diff  --git a/flang/test/Lower/default-initialization.f90 b/flang/test/Lower/default-initialization.f90
index f64d7185015f7..e396ca853d71a 100644
--- a/flang/test/Lower/default-initialization.f90
+++ b/flang/test/Lower/default-initialization.f90
@@ -1,5 +1,5 @@
 ! Test default initialization of local and dummy variables (dynamic initialization)
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
 
 module test_dinit
   type t
@@ -21,9 +21,10 @@ module test_dinit
   ! Test local scalar is default initialized
   ! CHECK-LABEL: func @_QMtest_dinitPlocal()
   subroutine local
-    !CHECK: %[[x:.*]]  = fir.alloca !fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}> {bindc_name = "x", uniq_name = "_QMtest_dinitFlocalEx"}
+    !CHECK: %[[xalloc:.*]] = fir.alloca !fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}> {bindc_name = "x", uniq_name = "_QMtest_dinitFlocalEx"}
+    !CHECK: %[[x:.*]]:2 = hlfir.declare %[[xalloc]] {uniq_name = "_QMtest_dinitFlocalEx"}
     !CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
-    !CHECK: fir.copy %[[ADDR]] to %[[x]] no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>, !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
+    !CHECK: fir.copy %[[ADDR]] to %[[x]]#0 no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>, !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
     type(t) :: x
     print *, x%i
   end subroutine
@@ -31,9 +32,9 @@ subroutine local
   ! Test local array is default initialized
   ! CHECK-LABEL: func @_QMtest_dinitPlocal_array()
   subroutine local_array()
-    ! CHECK: %[[x:.*]] = fir.alloca !fir.array<4x!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
-    ! CHECK: %[[xshape:.*]] = fir.shape %c4{{.*}} : (index) -> !fir.shape<1>
-    ! CHECK: %[[xbox:.*]] = fir.embox %[[x]](%[[xshape]]) : (!fir.ref<!fir.array<4x!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>>, !fir.shape<1>) -> !fir.box<!fir.array<4x!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>>
+    ! CHECK: %[[xalloc:.*]] = fir.alloca !fir.array<4x!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
+    ! CHECK: %[[x:.*]]:2 = hlfir.declare %[[xalloc]](%{{.*}}) {uniq_name = "_QMtest_dinitFlocal_arrayEx"}
+    ! CHECK: %[[xbox:.*]] = fir.embox %[[x]]#0(%{{.*}}) : (!fir.ref<!fir.array<4x!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>>, !fir.shape<1>) -> !fir.box<!fir.array<4x!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>>
     ! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
     ! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
     type(t) :: x(4)
@@ -44,38 +45,42 @@ subroutine local_array()
   ! scalars.
   ! CHECK-LABEL: func @_QMtest_dinitPlocal_alloc_comp()
   subroutine local_alloc_comp
-    !CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt_alloc_comp{{(,sequence)?}}{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}> {bindc_name = "x", uniq_name = "_QMtest_dinitFlocal_alloc_compEx"}
+    !CHECK: %[[xalloc:.*]] = fir.alloca !fir.type<_QMtest_dinitTt_alloc_comp{{(,sequence)?}}{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}> {bindc_name = "x", uniq_name = "_QMtest_dinitFlocal_alloc_compEx"}
+    !CHECK: %[[x:.*]]:2 = hlfir.declare %[[xalloc]] {uniq_name = "_QMtest_dinitFlocal_alloc_compEx"}
     !CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt_alloc_comp.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{{(,sequence)?}}{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
-    !CHECK: fir.copy %[[ADDR]] to %[[x]] no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{{(,sequence)?}}{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{{(,sequence)?}}{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
+    !CHECK: fir.copy %[[ADDR]] to %[[x]]#0 no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{{(,sequence)?}}{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.ref<!fir.type<_QMtest_dinitTt_alloc_comp{{(,sequence)?}}{i:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
     type(t_alloc_comp) :: x
   end subroutine
 
   ! Test function results are default initialized.
   ! CHECK-LABEL: func @_QMtest_dinitPresult() -> !fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>
   function result()
-    !CHECK: %[[x:.*]] = fir.alloca !fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}> {bindc_name = "result", uniq_name = "_QMtest_dinitFresultEresult"}
+    !CHECK: %[[xalloc:.*]] = fir.alloca !fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}> {bindc_name = "result", uniq_name = "_QMtest_dinitFresultEresult"}
+    !CHECK: %[[x:.*]]:2 = hlfir.declare %[[xalloc]] {uniq_name = "_QMtest_dinitFresultEresult"}
     !CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
-    !CHECK: fir.copy %[[ADDR]] to %[[x]] no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>, !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
+    !CHECK: fir.copy %[[ADDR]] to %[[x]]#0 no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>, !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
     type(t) :: result
   end function
 
   ! Test intent(out) dummies are default initialized
   ! CHECK-LABEL: func @_QMtest_dinitPintent_out(
-  ! CHECK-SAME: %[[x:.*]]: !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
+  ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
   subroutine intent_out(x)
+    !CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]] {{.*}} {fortran_attrs = #fir.var_attrs<intent_out>, uniq_name = "_QMtest_dinitFintent_outEx"}
     !CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTt.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
-    !CHECK: fir.copy %[[ADDR]] to %[[x]] no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>, !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
+    !CHECK: fir.copy %[[ADDR]] to %[[x]]#0 no_overlap : !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>, !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
     type(t), intent(out) :: x
   end subroutine
 
   ! Test that optional intent(out) are default initialized only when
   ! present.
   ! CHECK-LABEL: func @_QMtest_dinitPintent_out_optional(
-  ! CHECK-SAME: %[[x:.*]]: !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>> {fir.bindc_name = "x", fir.optional})
+  ! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>> {fir.bindc_name = "x", fir.optional})
   subroutine intent_out_optional(x)
-    ! CHECK: %[[isPresent:.*]] = fir.is_present %[[x]] : (!fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>) -> i1
+    ! CHECK: %[[x:.*]]:2 = hlfir.declare %[[arg0]] {{.*}} {fortran_attrs = #fir.var_attrs<intent_out, optional>, uniq_name = "_QMtest_dinitFintent_out_optionalEx"}
+    ! CHECK: %[[isPresent:.*]] = fir.is_present %[[x]]#0 : (!fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>) -> i1
     ! CHECK: fir.if %[[isPresent]] {
-      ! CHECK: %[[xbox:.*]] = fir.embox %[[x]] : (!fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
+      ! CHECK: %[[xbox:.*]] = fir.embox %[[x]]#0 : (!fir.ref<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>) -> !fir.box<!fir.type<_QMtest_dinitTt{{(,sequence)?}}{i:i32}>>
       ! CHECK: %[[xboxNone:.*]] = fir.convert %[[xbox]]
       ! CHECK: fir.call @_FortranAInitialize(%[[xboxNone]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.box<none>, !fir.ref<i8>, i32) -> ()
     ! CHECK: }
@@ -89,9 +94,10 @@ subroutine local_eq()
     integer :: zi
     ! CHECK: %[[equiv:.*]] = fir.alloca !fir.array<4xi8>
     ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[equiv]], %c0{{.*}} : (!fir.ref<!fir.array<4xi8>>, index) -> !fir.ref<i8>
-    ! CHECK: %[[x:.*]] = fir.convert %[[xcoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: %[[xptr:.*]] = fir.convert %[[xcoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: %[[x:.*]]:2 = hlfir.declare %[[xptr]] storage(%[[equiv]][0]) {uniq_name = "_QMtest_dinitFlocal_eqEx"}
     ! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTtseq.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
-    ! CHECK: fir.copy %[[ADDR]] to %[[x]] no_overlap : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>, !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: fir.copy %[[ADDR]] to %[[x]]#0 no_overlap : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>, !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
     equivalence (x, zi)
     print *, i
   end subroutine
@@ -106,15 +112,17 @@ subroutine local_eq2()
     type(tseq) :: y
     ! CHECK: %[[equiv:.*]] = fir.alloca !fir.array<4xi8>
     ! CHECK: %[[xcoor:.*]] = fir.coordinate_of %[[equiv]], %c0{{.*}} : (!fir.ref<!fir.array<4xi8>>, index) -> !fir.ref<i8>
-    ! CHECK: %[[x:.*]] = fir.convert %[[xcoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: %[[xptr:.*]] = fir.convert %[[xcoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: %[[x:.*]]:2 = hlfir.declare %[[xptr]] storage(%[[equiv]][0]) {uniq_name = "_QMtest_dinitFlocal_eq2Ex"}
     ! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTtseq.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
-    ! CHECK: fir.copy %[[ADDR]] to %[[x]] no_overlap : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>, !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: fir.copy %[[ADDR]] to %[[x]]#0 no_overlap : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>, !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
 
 
     ! CHECK: %[[ycoor:.*]] = fir.coordinate_of %[[equiv]], %c0{{.*}} : (!fir.ref<!fir.array<4xi8>>, index) -> !fir.ref<i8>
-    ! CHECK: %[[y:.*]] = fir.convert %[[ycoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
-    ! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMtest_dinitTtseq.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
-    ! CHECK: fir.copy %[[ADDR]] to %[[y]] no_overlap : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>, !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: %[[yptr:.*]] = fir.convert %[[ycoor]] : (!fir.ref<i8>) -> !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: %[[y:.*]]:2 = hlfir.declare %[[yptr]] storage(%[[equiv]][0]) {uniq_name = "_QMtest_dinitFlocal_eq2Ey"}
+    ! CHECK: %[[ADDR2:.*]] = fir.address_of(@_QQ_QMtest_dinitTtseq.DerivedInit) : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
+    ! CHECK: fir.copy %[[ADDR2]] to %[[y]]#0 no_overlap : !fir.ref<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>, !fir.ptr<!fir.type<_QMtest_dinitTtseq{{(,sequence)?}}{i:i32}>>
     equivalence (x, y)
     print *, y%i
   end subroutine

diff  --git a/flang/test/Lower/select-type-2.f90 b/flang/test/Lower/select-type-2.f90
index 59485c176c76a..55970031beb94 100644
--- a/flang/test/Lower/select-type-2.f90
+++ b/flang/test/Lower/select-type-2.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -emit-fir -hlfir=false %s -o - | fir-opt --fir-polymorphic-op | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | fir-opt --fir-polymorphic-op | FileCheck %s
 module select_type_2
   type p1
     integer :: a
@@ -30,10 +30,11 @@ subroutine select_type1(a)
 
 ! CHECK-LABEL: func.func @_QMselect_type_2Pselect_type1(
 ! CHECK-SAME: %[[ARG0:.*]]: !fir.class<!fir.type<_QMselect_type_2Tp1{a:i32,b:i32}>> {fir.bindc_name = "a"}) {
+! CHECK:      %[[A:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope {{.*}} {fortran_attrs = #fir.var_attrs<intent_in>, uniq_name = "_QMselect_type_2Fselect_type1Ea"}
 ! CHECK:      %[[TDESC_P3_ADDR:.*]] = fir.type_desc !fir.type<_QMselect_type_2Tp3
 ! CHECK:      %[[TDESC_P3_CONV:.*]] = fir.convert %[[TDESC_P3_ADDR]] : (!fir.tdesc{{.*}}>) -> !fir.ref<none>
-! CHECK:      %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.class<!fir.type<_QMselect_type_2Tp1{a:i32,b:i32}>>) -> !fir.box<none>
-! CHECK:      %[[CLASS_IS_CMP:.*]] = fir.call @_FortranAClassIs(%[[BOX_NONE]], %[[TDESC_P3_CONV]]) : (!fir.box<none>, !fir.ref<none>) -> i1
+! CHECK:      %[[BOX_NONE:.*]] = fir.convert %[[A]]#1 : (!fir.class<!fir.type<_QMselect_type_2Tp1{a:i32,b:i32}>>) -> !fir.box<none>
+! CHECK:      %[[CLASS_IS_CMP:.*]] = fir.call @_FortranAClassIs(%[[BOX_NONE]], %[[TDESC_P3_CONV]]) {{.*}}: (!fir.box<none>, !fir.ref<none>) -> i1
 ! CHECK:      cf.cond_br %[[CLASS_IS_CMP]], ^[[CLASS_IS_P3_BLK:.*]], ^[[NOT_CLASS_IS_P3_BLK:.*]]
 ! CHECK:    ^bb[[NOT_CLASS_IS_P1:[0-9]]]:
 ! CHECK:      cf.br ^bb[[DEFAULT_BLK:[0-9]]]
@@ -42,8 +43,8 @@ subroutine select_type1(a)
 ! CHECK:    ^[[NOT_CLASS_IS_P3_BLK]]:
 ! CHECK:      %[[TDESC_P1_ADDR:.*]] = fir.type_desc !fir.type<_QMselect_type_2Tp1
 ! CHECK:      %[[TDESC_P1_CONV:.*]] = fir.convert %[[TDESC_P1_ADDR]] : (!fir.tdesc{{.*}}>) -> !fir.ref<none>
-! CHECK:      %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.class<!fir.type<_QMselect_type_2Tp1{a:i32,b:i32}>>) -> !fir.box<none>
-! CHECK:      %[[CLASS_IS_CMP:.*]] = fir.call @_FortranAClassIs(%[[BOX_NONE]], %[[TDESC_P1_CONV]]) : (!fir.box<none>, !fir.ref<none>) -> i1
+! CHECK:      %[[BOX_NONE:.*]] = fir.convert %[[A]]#1 : (!fir.class<!fir.type<_QMselect_type_2Tp1{a:i32,b:i32}>>) -> !fir.box<none>
+! CHECK:      %[[CLASS_IS_CMP:.*]] = fir.call @_FortranAClassIs(%[[BOX_NONE]], %[[TDESC_P1_CONV]]) {{.*}}: (!fir.box<none>, !fir.ref<none>) -> i1
 ! CHECK:      cf.cond_br %[[CLASS_IS_CMP]], ^bb[[CLASS_IS_P1]], ^bb[[NOT_CLASS_IS_P1]]
 ! CHECK:    ^[[CLASS_IS_P3_BLK]]:
 ! CHECK:      cf.br ^bb[[END_SELECT_BLK]]

diff  --git a/flang/test/Lower/statement-function.f90 b/flang/test/Lower/statement-function.f90
index 9dd26d4f58273..f34fbf153084f 100644
--- a/flang/test/Lower/statement-function.f90
+++ b/flang/test/Lower/statement-function.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -emit-fir -hlfir=false -outline-intrinsics %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir -outline-intrinsics %s -o - | FileCheck %s
 
 ! Test statement function lowering
 
@@ -9,14 +9,16 @@ real function test_stmt_0(x)
   real :: x, func, arg
   func(arg) = arg + 0.123456
 
-  ! CHECK-DAG: %[[x:.*]] = fir.load %arg0
-  ! CHECK-DAG: %[[cst:.*]] = arith.constant 1.234560e-01
+  ! CHECK: %[[res:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_stmt_0Etest_stmt_0"}
+  ! CHECK: %[[xdecl:.*]]:2 = hlfir.declare %arg0 {{.*}} {uniq_name = "_QFtest_stmt_0Ex"}
+  ! CHECK: %[[x:.*]] = fir.load %[[xdecl]]#0
+  ! CHECK: %[[cst:.*]] = arith.constant 1.234560e-01
   ! CHECK: %[[eval:.*]] = arith.addf %[[x]], %[[cst]]
-  ! CHECK: fir.store %[[eval]] to %[[resmem:.*]] : !fir.ref<f32>
+  ! CHECK: hlfir.assign %[[eval]] to %[[res]]#0 : f32, !fir.ref<f32>
   test_stmt_0 = func(x)
 
-  ! CHECK: %[[res:.*]] = fir.load %[[resmem]]
-  ! CHECK: return %[[res]]
+  ! CHECK: %[[resval:.*]] = fir.load %[[res]]#0
+  ! CHECK: return %[[resval]]
 end function
 
 ! Check this is not lowered as a simple macro: e.g. argument is only
@@ -26,11 +28,11 @@ real function test_stmt_0(x)
 real(4) function test_stmt_only_eval_arg_once()
   real(4) :: only_once, x1
   func(x1) = x1 + x1
-  ! CHECK: %[[x2:.*]] = fir.alloca f32 {adapt.valuebyref}
-  ! CHECK: %[[x1:.*]] = fir.call @_QPonly_once()
-  ! Note: using -emit-fir, so the faked pass-by-reference is exposed
-  ! CHECK: fir.store %[[x1]] to %[[x2]]
-  ! CHECK: addf %{{.*}}, %{{.*}}
+  ! CHECK: %[[call:.*]] = fir.call @_QPonly_once()
+  ! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[call]]
+  ! CHECK: %[[v1:.*]] = fir.load %[[assoc]]#0
+  ! CHECK: %[[v2:.*]] = fir.load %[[assoc]]#0
+  ! CHECK: arith.addf %[[v1]], %[[v2]]
   test_stmt_only_eval_arg_once = func(only_once())
 end function
 
@@ -42,30 +44,35 @@ real function test_stmt_1(x, a)
   real :: res1, res2
   func1(arg1) = a + foo(arg1)
   func2(arg2) = func1(arg2) + b
-  ! CHECK-DAG: %[[bmem:.*]] = fir.alloca f32 {{{.*}}uniq_name = "{{.*}}Eb"}
-  ! CHECK-DAG: %[[res1:.*]] = fir.alloca f32 {{{.*}}uniq_name = "{{.*}}Eres1"}
-  ! CHECK-DAG: %[[res2:.*]] = fir.alloca f32 {{{.*}}uniq_name = "{{.*}}Eres2"}
+  ! CHECK-DAG: %[[adecl:.*]]:2 = hlfir.declare %arg1 {{.*}} {uniq_name = "_QFtest_stmt_1Ea"}
+  ! CHECK-DAG: %[[bmem:.*]] = fir.alloca f32 {{{.*}}uniq_name = "_QFtest_stmt_1Eb"}
+  ! CHECK-DAG: %[[bdecl:.*]]:2 = hlfir.declare %[[bmem]] {uniq_name = "_QFtest_stmt_1Eb"}
+  ! CHECK-DAG: %[[res1:.*]] = fir.alloca f32 {{{.*}}uniq_name = "_QFtest_stmt_1Eres1"}
+  ! CHECK-DAG: %[[res1decl:.*]]:2 = hlfir.declare %[[res1]] {uniq_name = "_QFtest_stmt_1Eres1"}
+  ! CHECK-DAG: %[[res2:.*]] = fir.alloca f32 {{{.*}}uniq_name = "_QFtest_stmt_1Eres2"}
+  ! CHECK-DAG: %[[res2decl:.*]]:2 = hlfir.declare %[[res2]] {uniq_name = "_QFtest_stmt_1Eres2"}
+  ! CHECK-DAG: %[[xdecl:.*]]:2 = hlfir.declare %arg0 {{.*}} {uniq_name = "_QFtest_stmt_1Ex"}
 
   b = 5
 
   ! CHECK-DAG: %[[cst_8:.*]] = arith.constant 8.000000e+00
-  ! CHECK-DAG: fir.store %[[cst_8]] to %[[tmp1:.*]] : !fir.ref<f32>
-  ! CHECK-DAG: %[[foocall1:.*]] = fir.call @_QPfoo(%[[tmp1]])
-  ! CHECK-DAG: %[[aload1:.*]] = fir.load %arg1
+  ! CHECK-DAG: %[[assoc1:.*]]:3 = hlfir.associate %[[cst_8]]
+  ! CHECK-DAG: %[[aload1:.*]] = fir.load %[[adecl]]#0
+  ! CHECK-DAG: %[[foocall1:.*]] = fir.call @_QPfoo(%[[assoc1]]#0)
   ! CHECK: %[[add1:.*]] = arith.addf %[[aload1]], %[[foocall1]]
-  ! CHECK: fir.store %[[add1]] to %[[res1]]
+  ! CHECK: hlfir.assign %[[add1]] to %[[res1decl]]#0
   res1 =  func1(8.)
 
-  ! CHECK-DAG: %[[a2:.*]] = fir.load %arg1
-  ! CHECK-DAG: %[[foocall2:.*]] = fir.call @_QPfoo(%arg0)
+  ! CHECK-DAG: %[[a2:.*]] = fir.load %[[adecl]]#0
+  ! CHECK-DAG: %[[foocall2:.*]] = fir.call @_QPfoo(%[[xdecl]]#0)
   ! CHECK-DAG: %[[add2:.*]] = arith.addf %[[a2]], %[[foocall2]]
-  ! CHECK-DAG: %[[b:.*]] = fir.load %[[bmem]]
+  ! CHECK-DAG: %[[b:.*]] = fir.load %[[bdecl]]#0
   ! CHECK: %[[add3:.*]] = arith.addf %[[add2]], %[[b]]
-  ! CHECK: fir.store %[[add3]] to %[[res2]]
+  ! CHECK: hlfir.assign %[[add3]] to %[[res2decl]]#0
   res2 = func2(x)
 
-  ! CHECK-DAG: %[[res12:.*]] = fir.load %[[res1]]
-  ! CHECK-DAG: %[[res22:.*]] = fir.load %[[res2]]
+  ! CHECK-DAG: %[[res12:.*]] = fir.load %[[res1decl]]#0
+  ! CHECK-DAG: %[[res22:.*]] = fir.load %[[res2decl]]#0
   ! CHECK: = arith.addf %[[res12]], %[[res22]] {{.*}}: f32
   test_stmt_1 = res1 + res2
   ! CHECK: return %{{.*}} : f32
@@ -91,12 +98,10 @@ real function test_stmt_no_args(x, y)
 integer function test_stmt_character(c, j)
   integer :: i, j, func, argj
   character(10) :: c, argc
-  ! CHECK-DAG: %[[unboxed:.*]]:2 = fir.unboxchar %arg0 :
-  ! CHECK-DAG: %[[ref:.*]] = fir.convert %[[unboxed]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,10>>
-  ! CHECK-DAG: %[[c10:.*]] = arith.constant 10 :
-  ! CHECK-DAG: %[[ref_cast:.*]] = fir.convert %[[ref]] : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<!fir.char<1,?>>
-  ! CHECK: %[[c10_cast:.*]] = fir.convert %[[c10]] : (i32) -> index
-  ! CHECK: %[[c:.*]] = fir.emboxchar %[[ref_cast]], %[[c10_cast]]
+  ! CHECK: %[[unboxed:.*]]:2 = fir.unboxchar %arg0 :
+  ! CHECK: %[[ref:.*]] = fir.convert %[[unboxed]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,10>>
+  ! CHECK: %[[cdecl:.*]]:2 = hlfir.declare %[[ref]] typeparams %{{.*}} {{.*}} {uniq_name = "_QFtest_stmt_characterEc"}
+  ! CHECK: %[[funcArgcDecl:.*]]:2 = hlfir.declare %[[cdecl]]#0 typeparams %{{.*}} {uniq_name = "_QFtest_stmt_characterFfuncEargc"}
 
   func(argc, argj) = len_trim(argc, 4) + argj
   ! CHECK: addi %{{.*}}, %{{.*}} : i
@@ -113,10 +118,13 @@ integer function test_stmt_character_with_
diff erent_length(c)
   integer :: func, ifoo
   character(10) :: argc
   character(*) :: c
-  ! CHECK-DAG: %[[unboxed:.*]]:2 = fir.unboxchar %[[arg0]] :
-  ! CHECK-DAG: %[[c10:.*]] = arith.constant 10 :
-  ! CHECK: %[[c10_cast:.*]] = fir.convert %[[c10]] : (i32) -> index
-  ! CHECK: %[[argc:.*]] = fir.emboxchar %[[unboxed]]#0, %[[c10_cast]]
+  ! CHECK: %[[unboxedC:.*]]:2 = fir.unboxchar %[[arg0]] :
+  ! CHECK: %[[cdecl:.*]]:2 = hlfir.declare %[[unboxedC]]#0 typeparams %[[unboxedC]]#1 {{.*}} {uniq_name = "_QFtest_stmt_character_with_
diff erent_lengthEc"}
+  ! CHECK: %[[unboxedArg:.*]]:2 = fir.unboxchar %[[cdecl]]#0 :
+  ! CHECK: %[[ref:.*]] = fir.convert %[[unboxedArg]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,10>>
+  ! CHECK: %[[c10:.*]] = arith.constant 10 : index
+  ! CHECK: %[[funcArgc:.*]]:2 = hlfir.declare %[[ref]] typeparams %[[c10]] {uniq_name = "_QFtest_stmt_character_with_
diff erent_lengthFfuncEargc"}
+  ! CHECK: %[[argc:.*]] = fir.emboxchar %[[funcArgc]]#0, %[[c10]]
   ! CHECK: fir.call @_QPifoo(%[[argc]]) {{.*}}: (!fir.boxchar<1>) -> i32
   func(argc) = ifoo(argc)
   test_stmt_character = func(c)
@@ -128,13 +136,15 @@ integer function test_stmt_character_with_
diff erent_length_2(c, n)
   integer :: func, ifoo
   character(n) :: argc
   character(*) :: c
-  ! CHECK: %[[unboxed:.*]]:2 = fir.unboxchar %[[arg0]] :
-  ! CHECK: %[[n:.*]] = fir.load %[[arg1]] : !fir.ref<i32>
+  ! CHECK: %[[ndecl:.*]]:2 = hlfir.declare %[[arg1]] {{.*}} {uniq_name = "_QFtest_stmt_character_with_
diff erent_length_2En"}
+  ! CHECK: %[[unboxedC:.*]]:2 = fir.unboxchar %[[arg0]] :
+  ! CHECK: %[[cdecl:.*]]:2 = hlfir.declare %[[unboxedC]]#0 typeparams %[[unboxedC]]#1 {{.*}} {uniq_name = "_QFtest_stmt_character_with_
diff erent_length_2Ec"}
+  ! CHECK: %[[unboxedArg:.*]]:2 = fir.unboxchar %[[cdecl]]#0 :
+  ! CHECK: %[[n:.*]] = fir.load %[[ndecl]]#0 : !fir.ref<i32>
   ! CHECK: %[[n_is_positive:.*]] = arith.cmpi sgt, %[[n]], %c0{{.*}} : i32
   ! CHECK: %[[len:.*]] = arith.select %[[n_is_positive]], %[[n]], %c0{{.*}} : i32
-  ! CHECK: %[[lenCast:.*]] = fir.convert %[[len]] : (i32) -> index
-  ! CHECK: %[[argc:.*]] = fir.emboxchar %[[unboxed]]#0, %[[lenCast]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1>
-  ! CHECK: fir.call @_QPifoo(%[[argc]]) {{.*}}: (!fir.boxchar<1>) -> i32
+  ! CHECK: %[[funcArgc:.*]]:2 = hlfir.declare %[[unboxedArg]]#0 typeparams %[[len]] {uniq_name = "_QFtest_stmt_character_with_
diff erent_length_2FfuncEargc"} : (!fir.ref<!fir.char<1,?>>, i32) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
+  ! CHECK: fir.call @_QPifoo(%[[funcArgc]]#0) {{.*}}: (!fir.boxchar<1>) -> i32
   func(argc) = ifoo(argc)
   test_stmt_character = func(c)
 end function
@@ -157,24 +167,14 @@ subroutine truncate_arg
 end subroutine
 
 ! CHECK-LABEL: @_QPtruncate_arg
-! CHECK: %[[c4:.*]] = arith.constant 4 : i32
 ! CHECK: %[[arg:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,10>>
-! CHECK: %[[cast_arg:.*]] = fir.convert %[[arg]] : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<!fir.char<1,?>>
-! CHECK: %[[c10:.*]] = arith.constant 10 : i64
-! CHECK: %[[temp:.*]] = fir.alloca !fir.char<1,10> {bindc_name = ".chrtmp"}
-! CHECK: %[[c10_index:.*]] = fir.convert %[[c10]] : (i64) -> index
-! CHECK: %[[c4_index:.*]] = fir.convert %[[c4]] : (i32) -> index
-! CHECK: %[[cmpi:.*]] = arith.cmpi slt, %[[c10_index]], %[[c4_index]] : index
-! CHECK: %[[select:.*]] = arith.select %[[cmpi]], %[[c10_index]], %[[c4_index]] : index
-! CHECK: %[[c1:.*]] = arith.constant 1 : i64
-! CHECK: %[[select_i64:.*]] = fir.convert %[[select]] : (index) -> i64
-! CHECK: %[[length:.*]] = arith.muli %[[c1]], %[[select_i64]] : i64
-! CHECK: %[[cast_temp_i8:.*]] = fir.convert %[[temp]] : (!fir.ref<!fir.char<1,10>>) -> !llvm.ptr
-! CHECK: %[[cast_arg_i8:.*]] = fir.convert %[[cast_arg]] : (!fir.ref<!fir.char<1,?>>) -> !llvm.ptr
-! CHECK: "llvm.intr.memmove"(%[[cast_temp_i8]], %[[cast_arg_i8]], %[[length]]) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()
-! CHECK: %[[c1_i64:.*]] = arith.constant 1 : i64
-! CHECK: %[[ub:.*]] = arith.subi %[[c10]], %[[c1_i64]] : i64
-! CHECK: %[[ub_index:.*]] = fir.convert %[[ub]] : (i64) -> index
-! CHECK: fir.do_loop %{{.*}} = %[[select]] to %[[ub_index]] step %{{.*}} {
-! CHECK: %[[cast_temp:.*]] = fir.convert %[[temp:.*]] : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<i8>
-! CHECK: %{{.*}} = fir.call @_FortranAioOutputAscii(%{{.*}}, %[[cast_temp]], %[[c10]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
+! CHECK: %[[c10:.*]] = arith.constant 10 : index
+! CHECK: %[[argDecl:.*]]:2 = hlfir.declare %[[arg]] typeparams %[[c10]]
+! CHECK: %[[castArg:.*]] = fir.convert %[[argDecl]]#0 : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<!fir.char<1,4>>
+! CHECK: %[[c4:.*]] = arith.constant 4 : index
+! CHECK: %[[fctArg:.*]]:2 = hlfir.declare %[[castArg]] typeparams %[[c4]] {uniq_name = "_QFtruncate_argFstmt_fctEarg"}
+! CHECK: %[[c10_i64:.*]] = arith.constant 10 : i64
+! CHECK: %[[setlen:.*]] = hlfir.set_length %[[fctArg]]#0 len %[[c10_i64]] : (!fir.ref<!fir.char<1,4>>, i64) -> !hlfir.expr<!fir.char<1,10>>
+! CHECK: %[[assoc:.*]]:3 = hlfir.associate %[[setlen]] typeparams %[[c10_i64]] {{.*}} : (!hlfir.expr<!fir.char<1,10>>, i64) -> (!fir.ref<!fir.char<1,10>>, !fir.ref<!fir.char<1,10>>, i1)
+! CHECK: %[[castTemp:.*]] = fir.convert %[[assoc]]#0 : (!fir.ref<!fir.char<1,10>>) -> !fir.ref<i8>
+! CHECK: %{{.*}} = fir.call @_FortranAioOutputAscii(%{{.*}}, %[[castTemp]], %[[c10_i64]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1

diff  --git a/flang/test/Lower/submodule.f90 b/flang/test/Lower/submodule.f90
index acb39b948f61b..77a36748341b8 100644
--- a/flang/test/Lower/submodule.f90
+++ b/flang/test/Lower/submodule.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
 
 module mm
   integer :: vv = 20
@@ -24,24 +24,20 @@ end function fff
   end interface
 contains
   ! CHECK-LABEL: func @_QMmmPff2
-  ! CHECK:     %[[V_0:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-  ! CHECK:     %[[V_1:[0-9]+]] = arith.addi %[[V_0]], %c2{{.*}} : i32
-  ! CHECK:     %[[V_2:[0-9]+]] = fir.convert %[[V_1]] : (i32) -> i64
-  ! CHECK:     %[[V_3:[0-9]+]] = fir.convert %[[V_2]] : (i64) -> index
-  ! CHECK:     %[[V_4:[0-9]+]] = arith.cmpi sgt, %[[V_3]], %c0{{.*}} : index
-  ! CHECK:     %[[V_5:[0-9]+]] = arith.select %[[V_4]], %[[V_3]], %c0{{.*}} : index
-  ! CHECK:     %[[V_6:[0-9]+]] = fir.alloca !fir.array<?xi32>, %[[V_5]] {bindc_name = "ff2", uniq_name = "_QMmmSss1Fff2Eff2"}
-  ! CHECK:     %[[V_7:[0-9]+]] = fir.shape %[[V_5]] : (index) -> !fir.shape<1>
-  ! CHECK:     %[[V_8:[0-9]+]] = fir.array_load %[[V_6]](%[[V_7]]) : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.array<?xi32>
-  ! CHECK:     %[[V_9:[0-9]+]] = fir.call @_QMmmSss1Pfff(%arg0) {{.*}} : (!fir.ref<i32>) -> i32
-  ! CHECK:     %[[V_10:[0-9]+]] = arith.subi %[[V_5]], %c1{{.*}} : index
-  ! CHECK:     %[[V_11:[0-9]+]] = fir.do_loop %arg1 = %c0{{.*}} to %[[V_10]] step %c1{{.*}} unordered iter_args(%arg2 = %[[V_8]]) -> (!fir.array<?xi32>) {
-  ! CHECK:       %[[V_13:[0-9]+]] = fir.array_update %arg2, %[[V_9]], %arg1 : (!fir.array<?xi32>, i32, index) -> !fir.array<?xi32>
-  ! CHECK:       fir.result %[[V_13]] : !fir.array<?xi32>
-  ! CHECK:     }
-  ! CHECK:     fir.array_merge_store %[[V_8]], %[[V_11]] to %[[V_6]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.ref<!fir.array<?xi32>>
-  ! CHECK:     %[[V_12:[0-9]+]] = fir.load %[[V_6]] : !fir.ref<!fir.array<?xi32>>
-  ! CHECK:     return %[[V_12]] : !fir.array<?xi32>
+  ! CHECK:     %[[V_0:.*]]:2 = hlfir.declare %arg0 {{.*}} {uniq_name = "_QMmmSss1Fff2Enn"}
+  ! CHECK:     %[[V_1:.*]] = fir.load %[[V_0]]#0 : !fir.ref<i32>
+  ! CHECK:     %[[V_2:.*]] = arith.addi %[[V_1]], %c2{{.*}} : i32
+  ! CHECK:     %[[V_3:.*]] = fir.convert %[[V_2]] : (i32) -> i64
+  ! CHECK:     %[[V_4:.*]] = fir.convert %[[V_3]] : (i64) -> index
+  ! CHECK:     %[[V_5:.*]] = arith.cmpi sgt, %[[V_4]], %c0{{.*}} : index
+  ! CHECK:     %[[V_6:.*]] = arith.select %[[V_5]], %[[V_4]], %c0{{.*}} : index
+  ! CHECK:     %[[V_7:.*]] = fir.alloca !fir.array<?xi32>, %[[V_6]] {bindc_name = "ff2", uniq_name = "_QMmmSss1Fff2Eff2"}
+  ! CHECK:     %[[V_8:.*]] = fir.shape %[[V_6]] : (index) -> !fir.shape<1>
+  ! CHECK:     %[[V_9:.*]]:2 = hlfir.declare %[[V_7]](%[[V_8]]) {uniq_name = "_QMmmSss1Fff2Eff2"}
+  ! CHECK:     %[[V_10:.*]] = fir.call @_QMmmSss1Pfff(%[[V_0]]#0) {{.*}} : (!fir.ref<i32>) -> i32
+  ! CHECK:     hlfir.assign %[[V_10]] to %[[V_9]]#0 : i32, !fir.box<!fir.array<?xi32>>
+  ! CHECK:     %[[V_11:.*]] = fir.load %[[V_9]]#1 : !fir.ref<!fir.array<?xi32>>
+  ! CHECK:     return %[[V_11]] : !fir.array<?xi32>
   ! CHECK:   }
   module procedure ff2
     ff2 = fff(nn)
@@ -51,25 +47,22 @@ end function fff
 submodule(mm:ss1) ss2
 contains
   ! CHECK-LABEL: func @_QMmmPff1
-  ! CHECK-DAG: %[[V_0:[0-9]+]] = fir.address_of(@_QMmmEvv) : !fir.ref<i32>
-  ! CHECK-DAG: %[[V_1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-  ! CHECK:     %[[V_2:[0-9]+]] = arith.addi %[[V_1]], %c1{{.*}} : i32
-  ! CHECK:     %[[V_3:[0-9]+]] = fir.convert %[[V_2]] : (i32) -> i64
-  ! CHECK:     %[[V_4:[0-9]+]] = fir.convert %[[V_3]] : (i64) -> index
-  ! CHECK:     %[[V_5:[0-9]+]] = arith.cmpi sgt, %[[V_4]], %c0{{.*}} : index
-  ! CHECK:     %[[V_6:[0-9]+]] = arith.select %[[V_5]], %[[V_4]], %c0{{.*}} : index
-  ! CHECK:     %[[V_7:[0-9]+]] = fir.alloca !fir.array<?xi32>, %[[V_6]] {bindc_name = "ff1", uniq_name = "_QMmmSss1Sss2Fff1Eff1"}
-  ! CHECK:     %[[V_8:[0-9]+]] = fir.shape %[[V_6]] : (index) -> !fir.shape<1>
-  ! CHECK:     %[[V_9:[0-9]+]] = fir.array_load %[[V_7]](%[[V_8]]) : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.array<?xi32>
-  ! CHECK:     %[[V_10:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
-  ! CHECK:     %[[V_11:[0-9]+]] = arith.addi %[[V_10]], %c2{{.*}} : i32
-  ! CHECK:     %[[V_12:[0-9]+]] = arith.subi %[[V_6]], %c1{{.*}} : index
-  ! CHECK:     %[[V_13:[0-9]+]] = fir.do_loop %arg1 = %c0{{.*}} to %[[V_12]] step %c1{{.*}} unordered iter_args(%arg2 = %[[V_9]]) -> (!fir.array<?xi32>) {
-  ! CHECK:       %[[V_15:[0-9]+]] = fir.array_update %arg2, %[[V_11]], %arg1 : (!fir.array<?xi32>, i32, index) -> !fir.array<?xi32>
-  ! CHECK:       fir.result %[[V_15]] : !fir.array<?xi32>
-  ! CHECK:     }
-  ! CHECK:     fir.array_merge_store %[[V_9]], %[[V_13]] to %[[V_7]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.ref<!fir.array<?xi32>>
-  ! CHECK:     %[[V_14:[0-9]+]] = fir.load %[[V_7]] : !fir.ref<!fir.array<?xi32>>
+  ! CHECK-DAG: %[[V_0:.*]] = fir.address_of(@_QMmmEvv) : !fir.ref<i32>
+  ! CHECK-DAG: %[[V_1:.*]]:2 = hlfir.declare %[[V_0]] {uniq_name = "_QMmmEvv"}
+  ! CHECK-DAG: %[[V_2:.*]]:2 = hlfir.declare %arg0 {{.*}} {uniq_name = "_QMmmSss1Sss2Fff1Enn"}
+  ! CHECK:     %[[V_3:.*]] = fir.load %[[V_2]]#0 : !fir.ref<i32>
+  ! CHECK:     %[[V_4:.*]] = arith.addi %[[V_3]], %c1{{.*}} : i32
+  ! CHECK:     %[[V_5:.*]] = fir.convert %[[V_4]] : (i32) -> i64
+  ! CHECK:     %[[V_6:.*]] = fir.convert %[[V_5]] : (i64) -> index
+  ! CHECK:     %[[V_7:.*]] = arith.cmpi sgt, %[[V_6]], %c0{{.*}} : index
+  ! CHECK:     %[[V_8:.*]] = arith.select %[[V_7]], %[[V_6]], %c0{{.*}} : index
+  ! CHECK:     %[[V_9:.*]] = fir.alloca !fir.array<?xi32>, %[[V_8]] {bindc_name = "ff1", uniq_name = "_QMmmSss1Sss2Fff1Eff1"}
+  ! CHECK:     %[[V_10:.*]] = fir.shape %[[V_8]] : (index) -> !fir.shape<1>
+  ! CHECK:     %[[V_11:.*]]:2 = hlfir.declare %[[V_9]](%[[V_10]]) {uniq_name = "_QMmmSss1Sss2Fff1Eff1"}
+  ! CHECK:     %[[V_12:.*]] = fir.load %[[V_1]]#0 : !fir.ref<i32>
+  ! CHECK:     %[[V_13:.*]] = arith.addi %[[V_12]], %c2{{.*}} : i32
+  ! CHECK:     hlfir.assign %[[V_13]] to %[[V_11]]#0 : i32, !fir.box<!fir.array<?xi32>>
+  ! CHECK:     %[[V_14:.*]] = fir.load %[[V_11]]#1 : !fir.ref<!fir.array<?xi32>>
   ! CHECK:     return %[[V_14]] : !fir.array<?xi32>
   ! CHECK:   }
   module function ff1(nn)
@@ -78,16 +71,19 @@ module function ff1(nn)
   end function ff1
 
   ! CHECK-LABEL: func @_QMmmSss1Pfff
-  ! CHECK-DAG: %[[V_0:[0-9]+]] = fir.address_of(@_QMmmSss1Eww) : !fir.ref<i32>
-  ! CHECK-DAG: %[[V_1:[0-9]+]] = fir.address_of(@_QMmmEvv) : !fir.ref<i32>
-  ! CHECK-DAG: %[[V_2:[0-9]+]] = fir.alloca i32 {bindc_name = "fff", uniq_name = "_QMmmSss1Sss2FfffEfff"}
-  ! CHECK-DAG: %[[V_3:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<i32>
-  ! CHECK-DAG: %[[V_4:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
-  ! CHECK:     %[[V_5:[0-9]+]] = arith.addi %[[V_3]], %[[V_4]] : i32
-  ! CHECK:     %[[V_6:[0-9]+]] = arith.addi %[[V_5]], %c4{{.*}} : i32
-  ! CHECK:     fir.store %[[V_6]] to %[[V_2]] : !fir.ref<i32>
-  ! CHECK:     %[[V_7:[0-9]+]] = fir.load %[[V_2]] : !fir.ref<i32>
-  ! CHECK:     return %[[V_7]] : i32
+  ! CHECK-DAG: %[[V_0:.*]] = fir.address_of(@_QMmmEvv) : !fir.ref<i32>
+  ! CHECK-DAG: %[[V_1:.*]]:2 = hlfir.declare %[[V_0]] {uniq_name = "_QMmmEvv"}
+  ! CHECK-DAG: %[[V_2:.*]] = fir.address_of(@_QMmmSss1Eww) : !fir.ref<i32>
+  ! CHECK-DAG: %[[V_3:.*]]:2 = hlfir.declare %[[V_2]] {uniq_name = "_QMmmSss1Eww"}
+  ! CHECK-DAG: %[[V_4:.*]] = fir.alloca i32 {bindc_name = "fff", uniq_name = "_QMmmSss1Sss2FfffEfff"}
+  ! CHECK-DAG: %[[V_5:.*]]:2 = hlfir.declare %[[V_4]] {uniq_name = "_QMmmSss1Sss2FfffEfff"}
+  ! CHECK-DAG: %[[V_6:.*]] = fir.load %[[V_1]]#0 : !fir.ref<i32>
+  ! CHECK-DAG: %[[V_7:.*]] = fir.load %[[V_3]]#0 : !fir.ref<i32>
+  ! CHECK:     %[[V_8:.*]] = arith.addi %[[V_6]], %[[V_7]] : i32
+  ! CHECK:     %[[V_9:.*]] = arith.addi %[[V_8]], %c4{{.*}} : i32
+  ! CHECK:     hlfir.assign %[[V_9]] to %[[V_5]]#0 : i32, !fir.ref<i32>
+  ! CHECK:     %[[V_10:.*]] = fir.load %[[V_5]]#0 : !fir.ref<i32>
+  ! CHECK:     return %[[V_10]] : i32
   ! CHECK:   }
   module procedure fff
     fff = vv + ww + 4
@@ -97,27 +93,24 @@ end function ff1
 submodule(mm) sss
 contains
   ! CHECK-LABEL: func @_QMmmPff3
-  ! CHECK-DAG: %[[V_0:[0-9]+]] = fir.address_of(@_QMmmEvv) : !fir.ref<i32>
-  ! CHECK-DAG: %[[V_1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-  ! CHECK:     %[[V_2:[0-9]+]] = arith.addi %[[V_1]], %c3{{.*}} : i32
-  ! CHECK:     %[[V_3:[0-9]+]] = fir.convert %[[V_2]] : (i32) -> i64
-  ! CHECK:     %[[V_4:[0-9]+]] = fir.convert %[[V_3]] : (i64) -> index
-  ! CHECK:     %[[V_5:[0-9]+]] = arith.cmpi sgt, %[[V_4]], %c0{{.*}} : index
-  ! CHECK:     %[[V_6:[0-9]+]] = arith.select %[[V_5]], %[[V_4]], %c0{{.*}} : index
-  ! CHECK:     %[[V_7:[0-9]+]] = fir.alloca !fir.array<?xi32>, %[[V_6]] {bindc_name = "ff3", uniq_name = "_QMmmSsssFff3Eff3"}
-  ! CHECK:     %[[V_8:[0-9]+]] = fir.shape %[[V_6]] : (index) -> !fir.shape<1>
-  ! CHECK:     %[[V_9:[0-9]+]] = fir.array_load %[[V_7]](%[[V_8]]) : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.array<?xi32>
-  ! CHECK-DAG: %[[V_10:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
-  ! CHECK-DAG: %[[V_11:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
-  ! CHECK:     %[[V_12:[0-9]+]] = arith.muli %[[V_10]], %[[V_11]] : i32
-  ! CHECK:     %[[V_13:[0-9]+]] = arith.addi %[[V_12]], %c6{{.*}} : i32
-  ! CHECK:     %[[V_14:[0-9]+]] = arith.subi %[[V_6]], %c1{{.*}} : index
-  ! CHECK:     %[[V_15:[0-9]+]] = fir.do_loop %arg1 = %c0{{.*}} to %[[V_14]] step %c1{{.*}} unordered iter_args(%arg2 = %[[V_9]]) -> (!fir.array<?xi32>) {
-  ! CHECK:       %[[V_17:[0-9]+]] = fir.array_update %arg2, %[[V_13]], %arg1 : (!fir.array<?xi32>, i32, index) -> !fir.array<?xi32>
-  ! CHECK:       fir.result %[[V_17]] : !fir.array<?xi32>
-  ! CHECK:     }
-  ! CHECK:     fir.array_merge_store %[[V_9]], %[[V_15]] to %[[V_7]] : !fir.array<?xi32>, !fir.array<?xi32>, !fir.ref<!fir.array<?xi32>>
-  ! CHECK:     %[[V_16:[0-9]+]] = fir.load %[[V_7]] : !fir.ref<!fir.array<?xi32>>
+  ! CHECK-DAG: %[[V_0:.*]] = fir.address_of(@_QMmmEvv) : !fir.ref<i32>
+  ! CHECK-DAG: %[[V_1:.*]]:2 = hlfir.declare %[[V_0]] {uniq_name = "_QMmmEvv"}
+  ! CHECK-DAG: %[[V_2:.*]]:2 = hlfir.declare %arg0 {{.*}} {uniq_name = "_QMmmSsssFff3Enn"}
+  ! CHECK:     %[[V_3:.*]] = fir.load %[[V_2]]#0 : !fir.ref<i32>
+  ! CHECK:     %[[V_4:.*]] = arith.addi %[[V_3]], %c3{{.*}} : i32
+  ! CHECK:     %[[V_5:.*]] = fir.convert %[[V_4]] : (i32) -> i64
+  ! CHECK:     %[[V_6:.*]] = fir.convert %[[V_5]] : (i64) -> index
+  ! CHECK:     %[[V_7:.*]] = arith.cmpi sgt, %[[V_6]], %c0{{.*}} : index
+  ! CHECK:     %[[V_8:.*]] = arith.select %[[V_7]], %[[V_6]], %c0{{.*}} : index
+  ! CHECK:     %[[V_9:.*]] = fir.alloca !fir.array<?xi32>, %[[V_8]] {bindc_name = "ff3", uniq_name = "_QMmmSsssFff3Eff3"}
+  ! CHECK:     %[[V_10:.*]] = fir.shape %[[V_8]] : (index) -> !fir.shape<1>
+  ! CHECK:     %[[V_11:.*]]:2 = hlfir.declare %[[V_9]](%[[V_10]]) {uniq_name = "_QMmmSsssFff3Eff3"}
+  ! CHECK-DAG: %[[V_12:.*]] = fir.load %[[V_2]]#0 : !fir.ref<i32>
+  ! CHECK-DAG: %[[V_13:.*]] = fir.load %[[V_1]]#0 : !fir.ref<i32>
+  ! CHECK:     %[[V_14:.*]] = arith.muli %[[V_12]], %[[V_13]] : i32
+  ! CHECK:     %[[V_15:.*]] = arith.addi %[[V_14]], %c6{{.*}} : i32
+  ! CHECK:     hlfir.assign %[[V_15]] to %[[V_11]]#0 : i32, !fir.box<!fir.array<?xi32>>
+  ! CHECK:     %[[V_16:.*]] = fir.load %[[V_11]]#1 : !fir.ref<!fir.array<?xi32>>
   ! CHECK:     return %[[V_16]] : !fir.array<?xi32>
   ! CHECK:   }
   module function ff3(nn)
@@ -129,10 +122,10 @@ end function ff3
 ! CHECK-LABEL: func @_QQmain
 program pp
   use mm
-  ! CHECK:     fir.call @_QMmmPff1(%{{[0-9]+}}) {{.*}} : (!fir.ref<i32>) -> !fir.array<?xi32>
+  ! CHECK:     fir.call @_QMmmPff1(%{{.*}}) {{.*}} : (!fir.ref<i32>) -> !fir.array<?xi32>
   print*, ff1(1) ! expect: 22 22
-  ! CHECK:     fir.call @_QMmmPff2(%{{[0-9]+}}) {{.*}} : (!fir.ref<i32>) -> !fir.array<?xi32>
+  ! CHECK:     fir.call @_QMmmPff2(%{{.*}}) {{.*}} : (!fir.ref<i32>) -> !fir.array<?xi32>
   print*, ff2(2) ! expect: 44 44 44 44
-  ! CHECK:     fir.call @_QMmmPff3(%{{[0-9]+}}) {{.*}} : (!fir.ref<i32>) -> !fir.array<?xi32>
+  ! CHECK:     fir.call @_QMmmPff3(%{{.*}}) {{.*}} : (!fir.ref<i32>) -> !fir.array<?xi32>
   print*, ff3(3) ! expect: 66 66 66 66 66 66
 end program pp


        


More information about the flang-commits mailing list