[flang-commits] [flang] 10afcd4 - [flang][NFC] Converted five tests from old lowering to new lowering (part 12) (#178831)
via flang-commits
flang-commits at lists.llvm.org
Fri Jan 30 03:26:58 PST 2026
Author: Eugene Epshteyn
Date: 2026-01-30T06:26:53-05:00
New Revision: 10afcd405ed44e69c25f7239e94b93e6368a5043
URL: https://github.com/llvm/llvm-project/commit/10afcd405ed44e69c25f7239e94b93e6368a5043
DIFF: https://github.com/llvm/llvm-project/commit/10afcd405ed44e69c25f7239e94b93e6368a5043.diff
LOG: [flang][NFC] Converted five tests from old lowering to new lowering (part 12) (#178831)
Tests converted from test/Lower: derived-pointer-components.f90,
derived-type-finalization.f90, derived-types.f90, do_loop.f90,
do_loop_unstructured.f90
Added:
Modified:
flang/test/Lower/derived-pointer-components.f90
flang/test/Lower/derived-type-finalization.f90
flang/test/Lower/derived-types.f90
flang/test/Lower/do_loop.f90
flang/test/Lower/do_loop_unstructured.f90
Removed:
################################################################################
diff --git a/flang/test/Lower/derived-pointer-components.f90 b/flang/test/Lower/derived-pointer-components.f90
index a55618dc16a5f..ff19cc8076c7e 100644
--- a/flang/test/Lower/derived-pointer-components.f90
+++ b/flang/test/Lower/derived-pointer-components.f90
@@ -1,5 +1,5 @@
! Test lowering of pointer components
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
module pcomp
implicit none
@@ -73,288 +73,264 @@ subroutine takes_logical(x)
! Test pointer component references
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPref_scalar_real_p(
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>{{.*}}, %[[arg1:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>{{.*}}, %[[arg2:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>>{{.*}}, %[[arg3:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>{{.*}}) {
+! CHECK-LABEL: func.func @_QMpcompPref_scalar_real_p(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>{{.*}}, %[[ARG1:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>{{.*}}, %[[ARG2:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>>{{.*}}, %[[ARG3:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>{{.*}}) {
subroutine ref_scalar_real_p(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(real_p1) :: p1_0, p1_1(100)
-
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg0]], p : (!fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>>
- ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<f32>>>
- ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>
- ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.ptr<f32>) -> !fir.ref<f32>
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> ()
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[VAL:.*]] = fir.convert %[[ADDR]]
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[VAL]])
call takes_real_scalar(p0_0%p)
- ! CHECK: %[[p0_1_coor:.*]] = fir.coordinate_of %[[arg2]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_1_coor]], p : (!fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>>
- ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<f32>>>
- ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>
- ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.ptr<f32>) -> !fir.ref<f32>
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> ()
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[VAL:.*]] = fir.convert %[[ADDR]]
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[VAL]])
call takes_real_scalar(p0_1(5)%p)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg1]], p : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
- ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
- ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[load]], %c0{{.*}} : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index)
- ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[load]], %[[index]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, i64) -> !fir.ref<f32>
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> ()
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[ELT]])
call takes_real_scalar(p1_0%p(7))
- ! CHECK: %[[p1_1_coor:.*]] = fir.coordinate_of %[[arg3]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_1_coor]], p : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
- ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
- ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[load]], %c0{{.*}} : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index)
- ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[load]], %[[index]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, i64) -> !fir.ref<f32>
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> ()
+ ! CHECK: %[[ELT_ARR:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT_ARR]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[ELT]])
call takes_real_scalar(p1_1(5)%p(7))
end subroutine
-! CHECK-LABEL: func @_QMpcompPref_array_real_p(
-! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>{{.*}}) {
-! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_0]], p : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
-! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
-! CHECK: %[[VAL_5:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_6:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_5]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index)
-! CHECK: %[[VAL_7:.*]] = arith.constant 20 : i64
-! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i64) -> index
-! CHECK: %[[VAL_9:.*]] = arith.constant 2 : i64
-! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i64) -> index
-! CHECK: %[[VAL_11:.*]] = arith.constant 50 : i64
-! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i64) -> index
-! CHECK: %[[VAL_13:.*]] = fir.shift %[[VAL_6]]#0 : (index) -> !fir.shift<1>
-! CHECK: %[[VAL_14:.*]] = fir.slice %[[VAL_8]], %[[VAL_12]], %[[VAL_10]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[VAL_15:.*]] = fir.rebox %[[VAL_4]](%[[VAL_13]]) {{\[}}%[[VAL_14]]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, !fir.shift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>>
-! CHECK: %[[VAL_15_NEW:.*]] = fir.convert %[[VAL_15]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>>
-! CHECK: fir.call @_QPtakes_real_array(%[[VAL_15_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> ()
-! CHECK: %[[VAL_16:.*]] = arith.constant 5 : i64
-! CHECK: %[[VAL_17:.*]] = arith.constant 1 : i64
-! CHECK: %[[VAL_18:.*]] = arith.subi %[[VAL_16]], %[[VAL_17]] : i64
-! CHECK: %[[VAL_19:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_18]] : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>
-! CHECK: %[[VAL_21:.*]] = fir.coordinate_of %[[VAL_19]], p : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
-! CHECK: %[[VAL_22:.*]] = fir.load %[[VAL_21]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
-! CHECK: %[[VAL_23:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_24:.*]]:3 = fir.box_dims %[[VAL_22]], %[[VAL_23]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index)
-! CHECK: %[[VAL_25:.*]] = arith.constant 20 : i64
-! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i64) -> index
-! CHECK: %[[VAL_27:.*]] = arith.constant 2 : i64
-! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index
-! CHECK: %[[VAL_29:.*]] = arith.constant 50 : i64
-! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i64) -> index
-! CHECK: %[[VAL_31:.*]] = fir.shift %[[VAL_24]]#0 : (index) -> !fir.shift<1>
-! CHECK: %[[VAL_32:.*]] = fir.slice %[[VAL_26]], %[[VAL_30]], %[[VAL_28]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[VAL_33:.*]] = fir.rebox %[[VAL_22]](%[[VAL_31]]) {{\[}}%[[VAL_32]]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, !fir.shift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>>
-! CHECK: %[[VAL_33_NEW:.*]] = fir.convert %[[VAL_33]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>>
-! CHECK: fir.call @_QPtakes_real_array(%[[VAL_33_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> ()
-! CHECK: return
-! CHECK: }
-
-
+! CHECK-LABEL: func.func @_QMpcompPref_array_real_p(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>{{.*}}, %[[ARG1:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>{{.*}}) {
subroutine ref_array_real_p(p1_0, p1_1)
type(real_p1) :: p1_0, p1_1(100)
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[SLICE:.*]] = hlfir.designate %[[LOAD]] (%c20{{.*}}:%c50{{.*}}:%c2{{.*}})
+ ! CHECK: %[[BOX:.*]] = fir.convert %[[SLICE]]
+ ! CHECK: fir.call @_QPtakes_real_array(%[[BOX]])
call takes_real_array(p1_0%p(20:50:2))
+
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[SLICE:.*]] = hlfir.designate %[[LOAD]] (%c20{{.*}}:%c50{{.*}}:%c2{{.*}})
+ ! CHECK: %[[BOX:.*]] = fir.convert %[[SLICE]]
+ ! CHECK: fir.call @_QPtakes_real_array(%[[BOX]])
call takes_real_array(p1_1(5)%p(20:50:2))
end subroutine
-! CHECK-LABEL: func @_QMpcompPassign_scalar_real
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPassign_scalar_real_p
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine assign_scalar_real_p(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(real_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]
- ! CHECK: fir.store {{.*}} to %[[addr]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: hlfir.assign %{{.*}} to %[[ADDR]]
p0_0%p = 1.
- ! CHECK: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]
- ! CHECK: fir.store {{.*}} to %[[addr]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: hlfir.assign %{{.*}} to %[[ADDR]]
p0_1(5)%p = 2.
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], {{.*}}
- ! CHECK: fir.store {{.*}} to %[[addr]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: hlfir.assign %{{.*}} to %[[ADDR]]
p1_0%p(7) = 3.
- ! CHECK: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], {{.*}}
- ! CHECK: fir.store {{.*}} to %[[addr]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: hlfir.assign %{{.*}} to %[[ADDR]]
p1_1(5)%p(7) = 4.
end subroutine
-! CHECK-LABEL: func @_QMpcompPref_scalar_cst_char_p
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPref_scalar_cst_char_p
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine ref_scalar_cst_char_p(p0_0, p1_0, p0_1, p1_1)
type(cst_char_p0) :: p0_0, p0_1(100)
type(cst_char_p1) :: p1_0, p1_1(100)
-
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[VAL:.*]] = fir.convert %[[ADDR]]
+ ! CHECK: %[[BOXCHAR:.*]] = fir.emboxchar %[[VAL]], %c10{{.*}}
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p0_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[VAL:.*]] = fir.convert %[[ADDR]]
+ ! CHECK: %[[BOXCHAR:.*]] = fir.emboxchar %[[VAL]], %c10{{.*}}
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p0_1(5)%p)
-
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
- ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: %[[BOXCHAR:.*]] = fir.emboxchar %[[ADDR]], %c10{{.*}}
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p1_0%p(7))
-
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
- ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: %[[BOXCHAR:.*]] = fir.emboxchar %[[ADDR]], %c10{{.*}}
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p1_1(5)%p(7))
-
end subroutine
-! CHECK-LABEL: func @_QMpcompPref_scalar_def_char_p
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPref_scalar_def_char_p
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine ref_scalar_def_char_p(p0_0, p1_0, p0_1, p1_1)
type(def_char_p0) :: p0_0, p0_1(100)
type(def_char_p1) :: p1_0, p1_1(100)
-
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
- ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[LOAD2:.*]] = fir.load %[[P]]
+ ! CHECK: %[[LEN:.*]] = fir.box_elesize %[[LOAD2]]
+ ! CHECK: %[[BOXCHAR:.*]] = fir.emboxchar %[[ADDR]], %[[LEN]]
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p0_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
- ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[LOAD2:.*]] = fir.load %[[P]]
+ ! CHECK: %[[LEN:.*]] = fir.box_elesize %[[LOAD2]]
+ ! CHECK: %[[BOXCHAR:.*]] = fir.emboxchar %[[ADDR]], %[[LEN]]
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p0_1(5)%p)
-
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
- ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
- ! CHECK-DAG: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK-DAG: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]]
- ! CHECK-DAG: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[LEN:.*]] = fir.box_elesize %[[LOAD]]
+ ! CHECK: %[[BOXCHAR:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}}) typeparams %[[LEN]]
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p1_0%p(7))
-
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
- ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
- ! CHECK-DAG: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK-DAG: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]]
- ! CHECK-DAG: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]]
- ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]
- ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[LEN:.*]] = fir.box_elesize %[[LOAD]]
+ ! CHECK: %[[BOXCHAR:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}}) typeparams %[[LEN]]
+ ! CHECK: fir.call @_QPtakes_char_scalar(%[[BOXCHAR]])
call takes_char_scalar(p1_1(5)%p(7))
-
end subroutine
-! CHECK-LABEL: func @_QMpcompPref_scalar_derived
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPref_scalar_derived
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine ref_scalar_derived(p0_0, p1_0, p0_1, p1_1)
type(derived_p0) :: p0_0, p0_1(100)
type(derived_p1) :: p1_0, p1_1(100)
-
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], x
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[X:.*]] = hlfir.designate %[[ADDR]]{"x"}
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[X]])
call takes_real_scalar(p0_0%p%x)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], x
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: %[[X:.*]] = hlfir.designate %[[ADDR]]{"x"}
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[X]])
call takes_real_scalar(p0_1(5)%p%x)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
- ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]]
- ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], x
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: %[[X:.*]] = hlfir.designate %[[ELT]]{"x"}
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[X]])
call takes_real_scalar(p1_0%p(7)%x)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
- ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
- ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]]
- ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]]
- ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], x
- ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ELT2:.*]] = hlfir.designate %[[LOAD]] (%c7{{.*}})
+ ! CHECK: %[[X:.*]] = hlfir.designate %[[ELT2]]{"x"}
+ ! CHECK: fir.call @_QPtakes_real_scalar(%[[X]])
call takes_real_scalar(p1_1(5)%p(7)%x)
-
end subroutine
! -----------------------------------------------------------------------------
! Test passing pointer component references as pointers
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPpass_real_p
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPpass_real_p
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine pass_real_p(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(real_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]])
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[P]])
call takes_real_scalar_pointer(p0_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[P]])
call takes_real_scalar_pointer(p0_1(5)%p)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]])
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[P]])
call takes_real_array_pointer(p1_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]])
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[P]])
call takes_real_array_pointer(p1_1(5)%p)
end subroutine
@@ -362,31 +338,40 @@ subroutine pass_real_p(p0_0, p1_0, p0_1, p1_1)
! Test usage in intrinsics where pointer aspect matters
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPassociated_p
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPassociated_p
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine associated_p(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(def_char_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: fir.box_addr %[[box]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: fir.convert %[[ADDR]] : (!fir.ptr<f32>) -> i64
call takes_logical(associated(p0_0%p))
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: fir.box_addr %[[box]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: fir.convert %[[ADDR]] : (!fir.ptr<f32>) -> i64
call takes_logical(associated(p0_1(5)%p))
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: fir.box_addr %[[box]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: fir.convert %[[ADDR]] : (!fir.ptr<!fir.array<?x!fir.char<1,?>>>) -> i64
call takes_logical(associated(p1_0%p))
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: %[[box:.*]] = fir.load %[[coor]]
- ! CHECK: fir.box_addr %[[box]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[P]]
+ ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[LOAD]]
+ ! CHECK: fir.convert %[[ADDR]] : (!fir.ptr<!fir.array<?x!fir.char<1,?>>>) -> i64
call takes_logical(associated(p1_1(5)%p))
end subroutine
@@ -394,51 +379,61 @@ subroutine associated_p(p0_0, p1_0, p0_1, p1_1)
! Test pointer assignment of components
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPpassoc_real
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPpassoc_real
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine passoc_real(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(real_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p0_0%p => real_target
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p0_1(5)%p => real_target
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p1_0%p => real_array_target
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p1_1(5)%p => real_array_target
end subroutine
-! CHECK-LABEL: func @_QMpcompPpassoc_char
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPpassoc_char
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine passoc_char(p0_0, p1_0, p0_1, p1_1)
type(cst_char_p0) :: p0_0, p0_1(100)
type(def_char_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p0_0%p => char_target
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p0_1(5)%p => char_target
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p1_0%p => char_array_target
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.store {{.*}} to %[[P]]
p1_1(5)%p => char_array_target
end subroutine
@@ -446,27 +441,40 @@ subroutine passoc_char(p0_0, p1_0, p0_1, p1_1)
! Test nullify of components
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPnullify_test
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPnullify_test
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine nullify_test(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(def_char_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: %[[NULL:.*]] = fir.zero_bits !fir.ptr<f32>
+ ! CHECK: %[[BOX:.*]] = fir.embox %[[NULL]] : (!fir.ptr<f32>) -> !fir.box<!fir.ptr<f32>>
+ ! CHECK: fir.store %[[BOX]] to %[[P]]
nullify(p0_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[NULL:.*]] = fir.zero_bits !fir.ptr<f32>
+ ! CHECK: %[[BOX:.*]] = fir.embox %[[NULL]] : (!fir.ptr<f32>) -> !fir.box<!fir.ptr<f32>>
+ ! CHECK: fir.store %[[BOX]] to %[[P]]
nullify(p0_1(5)%p)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: %[[NULL:.*]] = fir.zero_bits !fir.ptr<!fir.array<?x!fir.char<1,?>>>
+ ! CHECK: %[[BOX:.*]] = fir.embox %[[NULL]]
+ ! CHECK: fir.store %[[BOX]] to %[[P]]
nullify(p1_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: %[[NULL:.*]] = fir.zero_bits !fir.ptr<!fir.array<?x!fir.char<1,?>>>
+ ! CHECK: %[[BOX:.*]] = fir.embox %[[NULL]]
+ ! CHECK: fir.store %[[BOX]] to %[[P]]
nullify(p1_1(5)%p)
end subroutine
@@ -474,75 +482,96 @@ subroutine nullify_test(p0_0, p1_0, p0_1, p1_1)
! Test allocation
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPallocate_real
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPallocate_real
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine allocate_real(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(real_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p0_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p0_1(5)%p)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerSetBounds
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p1_0%p(100))
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerSetBounds
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p1_1(5)%p(100))
end subroutine
-! CHECK-LABEL: func @_QMpcompPallocate_cst_char
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPallocate_cst_char
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine allocate_cst_char(p0_0, p1_0, p0_1, p1_1)
type(cst_char_p0) :: p0_0, p0_1(100)
type(cst_char_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p0_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p0_1(5)%p)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerSetBounds
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p1_0%p(100))
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerSetBounds
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(p1_1(5)%p(100))
end subroutine
-! CHECK-LABEL: func @_QMpcompPallocate_def_char
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPallocate_def_char
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine allocate_def_char(p0_0, p1_0, p0_1, p1_1)
type(def_char_p0) :: p0_0, p0_1(100)
type(def_char_p1) :: p1_0, p1_1(100)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(character(18)::p0_0%p)
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(character(18)::p0_1(5)%p)
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerSetBounds
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(character(18)::p1_0%p(100))
- ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}}
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p
- ! CHECK: fir.store {{.*}} to %[[coor]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerSetBounds
+ ! CHECK: fir.call @_FortranAPointerAllocate
allocate(character(18)::p1_1(5)%p(100))
end subroutine
@@ -550,57 +579,32 @@ subroutine allocate_def_char(p0_0, p1_0, p0_1, p1_1)
! Test deallocation
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPdeallocate_real
-! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPdeallocate_real
+! CHECK-SAME: (%[[ARG0:.*]]: {{.*}}, %[[ARG1:.*]]: {{.*}}, %[[ARG2:.*]]: {{.*}}, %[[ARG3:.*]]: {{.*}})
subroutine deallocate_real(p0_0, p1_0, p0_1, p1_1)
type(real_p0) :: p0_0, p0_1(100)
type(real_p1) :: p1_0, p1_1(100)
- ! CHECK: %false = arith.constant false
- ! CHECK: %[[VAL_0:.*]] = fir.absent !fir.box<none>
- ! CHECK: %[[VAL_1:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<{{.*}}>>
- ! CHECK: %[[LINE_0:.*]] = arith.constant {{.*}} : i32
- ! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %arg0, p : (!fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>>
- ! CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<none>>
- ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
- ! CHECK: %[[VAL_6:.*]] = fir.call @_FortranAPointerDeallocate(%[[VAL_4]], %false, %[[VAL_0]], %[[VAL_5]], %[[LINE_0]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
+ ! CHECK: %[[P0_0_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[P0_1_DECL:.*]]:2 = hlfir.declare %[[ARG2]]
+ ! CHECK: %[[P1_0_DECL:.*]]:2 = hlfir.declare %[[ARG1]]
+ ! CHECK: %[[P1_1_DECL:.*]]:2 = hlfir.declare %[[ARG3]]
+
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P0_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerDeallocate
deallocate(p0_0%p)
- ! CHECK: %false_0 = arith.constant false
- ! CHECK: %[[VAL_7:.*]] = fir.absent !fir.box<none>
- ! CHECK: %[[VAL_8:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<{{.*}}>>
- ! CHECK: %[[LINE_1:.*]] = arith.constant {{.*}} : i32
- ! CHECK: %[[CON_5:.*]] = arith.constant 5 : i64
- ! CHECK: %[[CON_1:.*]] = arith.constant 1 : i64
- ! CHECK: %[[VAL_9:.*]] = arith.subi %[[CON_5]], %[[CON_1]] : i64
- ! CHECK: %[[VAL_10:.*]] = fir.coordinate_of %arg2, %[[VAL_9:.*]] : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>
- ! CHECK: %[[VAL_12:.*]] = fir.coordinate_of %[[VAL_10]], p : (!fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>>
- ! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<none>>
- ! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_8]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
- ! CHECK: %[[VAL_15:.*]] = fir.call @_FortranAPointerDeallocate(%[[VAL_13]], %false_0, %[[VAL_7]], %[[VAL_14]], %[[LINE_1]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P0_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerDeallocate
deallocate(p0_1(5)%p)
- ! CHECK: %false_1 = arith.constant false
- ! CHECK: %[[VAL_16:.*]] = fir.absent !fir.box<none>
- ! CHECK: %[[VAL_17:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{.*}}>>
- ! CHECK: %[[LINE_2:.*]] = arith.constant {{.*}} : i32
- ! CHECK: %[[VAL_19:.*]] = fir.coordinate_of %arg1, p : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
- ! CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>>
- ! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_17]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
- ! CHECK: %[[VAL_22:.*]] = fir.call @_FortranAPointerDeallocate(%[[VAL_20]], %false_1, %[[VAL_16]], %[[VAL_21]], %[[LINE_2]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[P1_0_DECL]]#0{"p"}
+ ! CHECK: fir.call @_FortranAPointerDeallocate
deallocate(p1_0%p)
- ! CHECK: %false_2 = arith.constant false
- ! CHECK: %[[VAL_23:.*]] = fir.absent !fir.box<none>
- ! CHECK: %[[VAL_24:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{.*}}>>
- ! CHECK: %[[LINE_3:.*]] = arith.constant {{.*}} : i32
- ! CHECK: %[[CON_5A:.*]] = arith.constant 5 : i64
- ! CHECK: %[[CON_1A:.*]] = arith.constant 1 : i64
- ! CHECK: %[[VAL_25:.*]] = arith.subi %[[CON_5A]], %[[CON_1A]] : i64
- ! CHECK: %[[VAL_26:.*]] = fir.coordinate_of %arg3, %[[VAL_25]] : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>
- ! CHECK: %[[VAL_28:.*]] = fir.coordinate_of %[[VAL_26]], p : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
- ! CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_28]] : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>>
- ! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_24]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
- ! CHECK: %[[VAL_31:.*]] = fir.call @_FortranAPointerDeallocate(%[[VAL_29]], %false_2, %[[VAL_23]], %[[VAL_30]], %[[LINE_3]]) fastmath<contract> : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[P1_1_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[P:.*]] = hlfir.designate %[[ELT]]{"p"}
+ ! CHECK: fir.call @_FortranAPointerDeallocate
deallocate(p1_1(5)%p)
end subroutine
@@ -608,8 +612,8 @@ subroutine deallocate_real(p0_0, p1_0, p0_1, p1_1)
! Test a very long component
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMpcompPvery_long
-! CHECK-SAME: (%[[x:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPvery_long
+! CHECK-SAME: (%[[X:.*]]: {{.*}})
subroutine very_long(x)
type t0
real :: f
@@ -630,21 +634,19 @@ subroutine very_long(x)
type(t4) :: a
end type
type(t5) :: x(:, :, :, :, :)
-
- ! CHECK: %[[coor0:.*]] = fir.coordinate_of %[[x]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.}}
- ! CHECK: %[[coor1:.*]] = fir.coordinate_of %[[coor0]], a, b
- ! CHECK: %[[b_box:.*]] = fir.load %[[coor1]]
- ! CHECK: %[[coor2:.*]] = fir.coordinate_of %[[b_box]], c, d
- ! CHECK: %[[index:.*]] = arith.subi %c6{{.*}}, %c1{{.*}} : i64
- ! CHECK: %[[coor3:.*]] = fir.coordinate_of %[[coor2]], %[[index]]
- ! CHECK: %[[coor4:.*]] = fir.coordinate_of %[[coor3]], e
- ! CHECK: %[[e_box:.*]] = fir.load %[[coor4]]
- ! CHECK: %[[edims:.*]]:3 = fir.box_dims %[[e_box]], %c0{{.*}}
- ! CHECK: %[[lb:.*]] = fir.convert %[[edims]]#0 : (index) -> i64
- ! CHECK: %[[index2:.*]] = arith.subi %c7{{.*}}, %[[lb]]
- ! CHECK: %[[coor5:.*]] = fir.coordinate_of %[[e_box]], %[[index2]]
- ! CHECK: %[[coor6:.*]] = fir.coordinate_of %[[coor5]], f
- ! CHECK: fir.load %[[coor6]] : !fir.ref<f32>
+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]]
+ ! CHECK: %[[X_ELT:.*]] = hlfir.designate %[[X_DECL]]#0 (%c1{{.*}}, %c2{{.*}}, %c3{{.*}}, %c4{{.*}}, %c5{{.*}})
+ ! CHECK: %[[A:.*]] = hlfir.designate %[[X_ELT]]{"a"}
+ ! CHECK: %[[B:.*]] = hlfir.designate %[[A]]{"b"}
+ ! CHECK: %[[B_LOAD:.*]] = fir.load %[[B]]
+ ! CHECK: %[[B_ADDR:.*]] = fir.box_addr %[[B_LOAD]]
+ ! CHECK: %[[C:.*]] = hlfir.designate %[[B_ADDR]]{"c"}
+ ! CHECK: %[[D_ELT:.*]] = hlfir.designate %[[C]]{"d"} <%{{.*}}> (%c6{{.*}})
+ ! CHECK: %[[E:.*]] = hlfir.designate %[[D_ELT]]{"e"}
+ ! CHECK: %[[E_LOAD:.*]] = fir.load %[[E]]
+ ! CHECK: %[[E_ELT:.*]] = hlfir.designate %[[E_LOAD]] (%c7{{.*}})
+ ! CHECK: %[[F:.*]] = hlfir.designate %[[E_ELT]]{"f"}
+ ! CHECK: fir.load %[[F]]
print *, x(1,2,3,4,5)%a%b%c%d(6)%e(7)%f
end subroutine
@@ -652,23 +654,26 @@ subroutine very_long(x)
! Test a recursive derived type reference
! -----------------------------------------------------------------------------
-! CHECK: func @_QMpcompPtest_recursive
-! CHECK-SAME: (%[[x:.*]]: {{.*}})
+! CHECK-LABEL: func.func @_QMpcompPtest_recursive
+! CHECK-SAME: (%[[X:.*]]: {{.*}})
subroutine test_recursive(x)
type t
integer :: i
type(t), pointer :: next
end type
type(t) :: x
-
- ! CHECK: %[[next1:.*]] = fir.coordinate_of %[[x]], next
- ! CHECK: %[[nextBox1:.*]] = fir.load %[[next1]]
- ! CHECK: %[[next2:.*]] = fir.coordinate_of %[[nextBox1]], next
- ! CHECK: %[[nextBox2:.*]] = fir.load %[[next2]]
- ! CHECK: %[[next3:.*]] = fir.coordinate_of %[[nextBox2]], next
- ! CHECK: %[[nextBox3:.*]] = fir.load %[[next3]]
- ! CHECK: %[[i:.*]] = fir.coordinate_of %[[nextBox3]], i
- ! CHECK: %[[nextBox3:.*]] = fir.load %[[i]] : !fir.ref<i32>
+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]]
+ ! CHECK: %[[NEXT:.*]] = hlfir.designate %[[X_DECL]]#0{"next"}
+ ! CHECK: %[[NEXT_LOAD:.*]] = fir.load %[[NEXT]]
+ ! CHECK: %[[NEXT_ADDR:.*]] = fir.box_addr %[[NEXT_LOAD]]
+ ! CHECK: %[[NEXT2:.*]] = hlfir.designate %[[NEXT_ADDR]]{"next"}
+ ! CHECK: %[[NEXT2_LOAD:.*]] = fir.load %[[NEXT2]]
+ ! CHECK: %[[NEXT2_ADDR:.*]] = fir.box_addr %[[NEXT2_LOAD]]
+ ! CHECK: %[[NEXT3:.*]] = hlfir.designate %[[NEXT2_ADDR]]{"next"}
+ ! CHECK: %[[NEXT3_LOAD:.*]] = fir.load %[[NEXT3]]
+ ! CHECK: %[[NEXT3_ADDR:.*]] = fir.box_addr %[[NEXT3_LOAD]]
+ ! CHECK: %[[I:.*]] = hlfir.designate %[[NEXT3_ADDR]]{"i"}
+ ! CHECK: fir.load %[[I]]
print *, x%next%next%next%i
end subroutine
@@ -683,7 +688,8 @@ module pinit
! CHECK-LABEL: fir.global {{.*}}@_QMpinitEarp0
! CHECK-DAG: %[[undef:.*]] = fir.undefined
! CHECK-DAG: %[[target:.*]] = fir.address_of(@_QMpcompEreal_target)
- ! CHECK: %[[box:.*]] = fir.embox %[[target]] : (!fir.ref<f32>) -> !fir.box<f32>
+ ! CHECK: %[[decl:.*]]:2 = hlfir.declare %[[target]]
+ ! CHECK: %[[box:.*]] = fir.embox %[[decl]]#0 : (!fir.ref<f32>) -> !fir.box<f32>
! CHECK: %[[rebox:.*]] = fir.rebox %[[box]] : (!fir.box<f32>) -> !fir.box<!fir.ptr<f32>>
! CHECK: %[[insert:.*]] = fir.insert_value %[[undef]], %[[rebox]], ["p", !fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>] :
! CHECK: fir.has_value %[[insert]]
@@ -693,24 +699,13 @@ module pinit
! CHECK: %[[VAL_0:.*]] = fir.undefined !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>
! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QMpcompEreal_array_target) : !fir.ref<!fir.array<100xf32>>
! CHECK: %[[VAL_3:.*]] = arith.constant 100 : index
-! CHECK: %[[VAL_4:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_5:.*]] = arith.constant 1 : index
-! CHECK: %[[VAL_6:.*]] = arith.constant 10 : i64
-! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i64) -> index
-! CHECK: %[[VAL_8:.*]] = arith.constant 5 : i64
-! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
-! CHECK: %[[VAL_10:.*]] = arith.constant 50 : i64
-! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
-! CHECK: %[[VAL_12:.*]] = arith.constant 0 : index
-! CHECK: %[[VAL_13:.*]] = arith.subi %[[VAL_11]], %[[VAL_7]] : index
-! CHECK: %[[VAL_14:.*]] = arith.addi %[[VAL_13]], %[[VAL_9]] : index
-! CHECK: %[[VAL_15:.*]] = arith.divsi %[[VAL_14]], %[[VAL_9]] : index
-! CHECK: %[[VAL_16:.*]] = arith.cmpi sgt, %[[VAL_15]], %[[VAL_12]] : index
-! CHECK: %[[VAL_17:.*]] = arith.select %[[VAL_16]], %[[VAL_15]], %[[VAL_12]] : index
! CHECK: %[[VAL_18:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
-! CHECK: %[[VAL_19:.*]] = fir.slice %[[VAL_7]], %[[VAL_11]], %[[VAL_9]] : (index, index, index) -> !fir.slice<1>
-! CHECK: %[[VAL_20:.*]] = fir.embox %[[VAL_2]](%[[VAL_18]]) {{\[}}%[[VAL_19]]] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<9xf32>>
-! CHECK: %[[VAL_21:.*]] = fir.rebox %[[VAL_20]] : (!fir.box<!fir.array<9xf32>>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>>
+! CHECK: %[[VAL_DECL:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_18]])
+! CHECK-DAG: %[[VAL_7:.*]] = arith.constant 10 : index
+! CHECK-DAG: %[[VAL_9:.*]] = arith.constant 5 : index
+! CHECK-DAG: %[[VAL_11:.*]] = arith.constant 50 : index
+! CHECK: %[[VAL_19:.*]] = hlfir.designate %[[VAL_DECL]]#0 (%[[VAL_7]]:%[[VAL_11]]:%[[VAL_9]])
+! CHECK: %[[VAL_21:.*]] = fir.rebox %[[VAL_19]] : (!fir.box<!fir.array<9xf32>>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>>
! CHECK: %[[VAL_22:.*]] = fir.insert_value %[[VAL_0]], %[[VAL_21]], ["p", !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>] : (!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>, !fir.box<!fir.ptr<!fir.array<?xf32>>>) -> !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>
! CHECK: fir.has_value %[[VAL_22]] : !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>
! CHECK: }
@@ -719,7 +714,8 @@ module pinit
! CHECK-LABEL: fir.global {{.*}}@_QMpinitEccp0
! CHECK-DAG: %[[undef:.*]] = fir.undefined
! CHECK-DAG: %[[target:.*]] = fir.address_of(@_QMpcompEchar_target)
- ! CHECK: %[[box:.*]] = fir.embox %[[target]] : (!fir.ref<!fir.char<1,10>>) -> !fir.box<!fir.char<1,10>>
+ ! CHECK: %[[decl:.*]]:2 = hlfir.declare %[[target]]
+ ! CHECK: %[[box:.*]] = fir.embox %[[decl]]#0 : (!fir.ref<!fir.char<1,10>>) -> !fir.box<!fir.char<1,10>>
! CHECK: %[[rebox:.*]] = fir.rebox %[[box]] : (!fir.box<!fir.char<1,10>>) -> !fir.box<!fir.ptr<!fir.char<1,10>>>
! CHECK: %[[insert:.*]] = fir.insert_value %[[undef]], %[[rebox]], ["p", !fir.type<_QMpcompTcst_char_p0{p:!fir.box<!fir.ptr<!fir.char<1,10>>>}>] :
! CHECK: fir.has_value %[[insert]]
@@ -729,7 +725,9 @@ module pinit
! CHECK-DAG: %[[undef:.*]] = fir.undefined
! CHECK-DAG: %[[target:.*]] = fir.address_of(@_QMpcompEchar_array_target)
! CHECK-DAG: %[[shape:.*]] = fir.shape %c100{{.*}}
- ! CHECK-DAG: %[[box:.*]] = fir.embox %[[target]](%[[shape]]) : (!fir.ref<!fir.array<100x!fir.char<1,10>>>, !fir.shape<1>) -> !fir.box<!fir.array<100x!fir.char<1,10>>>
+ ! CHECK: %[[decl:.*]]:2 = hlfir.declare %[[target]](%[[shape]])
+ ! CHECK-DAG: %[[shape2:.*]] = fir.shape %c100{{.*}}
+ ! CHECK-DAG: %[[box:.*]] = fir.embox %[[decl]]#0(%[[shape2]]) : (!fir.ref<!fir.array<100x!fir.char<1,10>>>, !fir.shape<1>) -> !fir.box<!fir.array<100x!fir.char<1,10>>>
! CHECK-DAG: %[[rebox:.*]] = fir.rebox %[[box]] : (!fir.box<!fir.array<100x!fir.char<1,10>>>) -> !fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>
! CHECK: %[[insert:.*]] = fir.insert_value %[[undef]], %[[rebox]], ["p", !fir.type<_QMpcompTdef_char_p1{p:!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>}>] :
! CHECK: fir.has_value %[[insert]]
diff --git a/flang/test/Lower/derived-type-finalization.f90 b/flang/test/Lower/derived-type-finalization.f90
index 71cef34899603..352bc64c72945 100644
--- a/flang/test/Lower/derived-type-finalization.f90
+++ b/flang/test/Lower/derived-type-finalization.f90
@@ -1,5 +1,5 @@
! Test derived type finalization
-! RUN: bbc --use-desc-for-alloc=false -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! Missing tests:
! - finalization within BLOCK construct
@@ -55,25 +55,21 @@ subroutine test_lhs_allocatable()
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_lhs() {
-! CHECK: %[[BOXREF:.*]] = fir.alloca !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
! CHECK: %[[LHS:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "lhs", uniq_name = "_QMderived_type_finalizationFtest_lhsElhs"}
-! CHECK: %[[EMBOX:.*]] = fir.embox %[[LHS]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: fir.store %[[EMBOX]] to %[[BOXREF]] : !fir.ref<!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[BOXREF]] : (!fir.ref<!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: fir.call @_FortranAAssign(%[[BOX_NONE]], {{.*}}
+! CHECK: %[[LHS_DECL:.*]]:2 = hlfir.declare %[[LHS]]
+! CHECK: %[[RHS:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "rhs", uniq_name = "_QMderived_type_finalizationFtest_lhsErhs"}
+! CHECK: %[[RHS_DECL:.*]]:2 = hlfir.declare %[[RHS]]
+! CHECK: hlfir.assign %[[RHS_DECL]]#0 to %[[LHS_DECL]]#0
+! CHECK: fir.call @_FortranADestroy
+! CHECK: fir.call @_FortranADestroy
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_lhs_allocatable() {
! CHECK: %[[LHS:.*]] = fir.alloca !fir.box<!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>> {bindc_name = "lhs", uniq_name = "_QMderived_type_finalizationFtest_lhs_allocatableElhs"}
-! CHECK: %[[LHS_ADDR:.*]] = fir.alloca !fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>> {uniq_name = "_QMderived_type_finalizationFtest_lhs_allocatableElhs.addr"}
+! CHECK: %[[LHS_DECL:.*]]:2 = hlfir.declare %[[LHS]]
! CHECK: %[[RHS:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "rhs", uniq_name = "_QMderived_type_finalizationFtest_lhs_allocatableErhs"}
-! CHECK: %[[LHS_ADDR_LOAD:.*]] = fir.load %[[LHS_ADDR]] : !fir.ref<!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
-! CHECK: %[[ADDR_I64:.*]] = fir.convert %[[LHS_ADDR_LOAD]] : (!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> i64
-! CHECK: %[[C0:.*]] = arith.constant 0 : i64
-! CHECK: %[[IS_NULL:.*]] = arith.cmpi ne, %[[ADDR_I64]], %[[C0]] : i64
-! CHECK: fir.if %[[IS_NULL]] {
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[LHS]] : (!fir.ref<!fir.box<!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>>) -> !fir.box<none>
-! CHECK: fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> ()
-! CHECK: }
+! CHECK: %[[RHS_DECL:.*]]:2 = hlfir.declare %[[RHS]]
+! CHECK: hlfir.assign %[[RHS_DECL]]#0 to %[[LHS_DECL]]#0 realloc
+! CHECK: fir.call @_FortranADestroy
! 7.5.6.3 point 2. Finalization on explicit deallocation.
subroutine test_deallocate()
@@ -83,10 +79,10 @@ subroutine test_deallocate()
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_deallocate() {
-! CHECK: %[[LOCAL_T:.*]] = fir.alloca !fir.box<!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>> {bindc_name = "t", uniq_name = "_QMderived_type_finalizationFtest_deallocateEt"}
-! CHECK: %{{.*}} = fir.call @_FortranAAllocatableAllocate
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[LOCAL_T]] : (!fir.ref<!fir.box<!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %{{.*}} = fir.call @_FortranAAllocatableDeallocate(%[[BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
+! CHECK: %[[T:.*]] = fir.alloca !fir.box<!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
+! CHECK: %[[T_DECL:.*]]:2 = hlfir.declare %[[T]]
+! CHECK: fir.call @_FortranAAllocatableAllocate
+! CHECK: fir.call @_FortranAAllocatableDeallocate
! 7.5.6.3 point 2. Finalization of disassociated target.
subroutine test_target_finalization()
@@ -96,13 +92,10 @@ subroutine test_target_finalization()
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_target_finalization() {
-! CHECK: %[[P:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>> {bindc_name = "p", uniq_name = "_QMderived_type_finalizationFtest_target_finalizationEp"}
-! CHECK: %[[ADDR:.*]] = fir.alloca !fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>> {uniq_name = "_QMderived_type_finalizationFtest_target_finalizationEp.addr"}
-! CHECK: %[[zero:.*]] = fir.zero_bits !fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: fir.store %[[zero]] to %[[ADDR]] : !fir.ref<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
+! CHECK: %[[P:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
+! CHECK: %[[P_DECL:.*]]:2 = hlfir.declare %[[P]]
! CHECK: fir.call @_FortranAPointerAllocateSource
-! CHECK: %[[P_BOX_NONE:.*]] = fir.convert %[[P]] : (!fir.ref<!fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>>) -> !fir.ref<!fir.box<none>>
-! CHECK: %{{.*}} = fir.call @_FortranAPointerDeallocate(%[[P_BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32
+! CHECK: fir.call @_FortranAPointerDeallocate
! 7.5.6.3 point 3. Finalize on END.
subroutine test_end_finalization()
@@ -110,11 +103,9 @@ subroutine test_end_finalization()
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_end_finalization() {
-! CHECK: %[[LOCAL_T:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "t", uniq_name = "_QMderived_type_finalizationFtest_end_finalizationEt"}
-! CHECK: %[[EMBOX:.*]] = fir.embox %[[LOCAL_T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
-! CHECK: fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> ()
-! CHECK: return
+! CHECK: %[[T:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}>
+! CHECK: %[[T_DECL:.*]]:2 = hlfir.declare %[[T]]
+! CHECK: fir.call @_FortranADestroy
! test with multiple return.
subroutine test_end_finalization2(a)
@@ -126,21 +117,12 @@ subroutine test_end_finalization2(a)
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_end_finalization2(
! CHECK-SAME: %[[A:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "a"}) {
+! CHECK: %[[A_DECL:.*]]:2 = hlfir.declare %[[A]]
! CHECK: %[[T:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = "t", uniq_name = "_QMderived_type_finalizationFtest_end_finalization2Et"}
-! CHECK: %[[LOAD_A:.*]] = fir.load %[[A]] : !fir.ref<!fir.logical<4>>
-! CHECK: %[[CONV_A:.*]] = fir.convert %[[LOAD_A]] : (!fir.logical<4>) -> i1
-! CHECK: cf.cond_br %[[CONV_A]], ^bb1, ^bb2
-! CHECK: ^bb1:
-! CHECK: cf.br ^bb3
-! CHECK: ^bb2:
-! CHECK: %[[C10:.*]] = arith.constant 10 : i32
-! CHECK: %[[COORD_A:.*]] = fir.coordinate_of %[[T]], a : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.ref<i32>
-! CHECK: fir.store %[[C10]] to %[[COORD_A]] : !fir.ref<i32>
-! CHECK: cf.br ^bb3
-! CHECK: ^bb3:
-! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
-! CHECK: fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> ()
+! CHECK: %[[T_DECL:.*]]:2 = hlfir.declare %[[T]]
+! CHECK: cf.cond_br
+! CHECK: hlfir.assign
+! CHECK: fir.call @_FortranADestroy
! CHECK: return
! CHECK: }
@@ -155,12 +137,14 @@ subroutine test_fct_ref()
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_fct_ref() {
-! CHECK: %[[RESULT:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = ".result"}
+! CHECK: %[[RES:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt1{a:i32}> {bindc_name = ".result"}
+! CHECK: %[[TY:.*]] = fir.alloca !fir.box<!fir.heap<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
+! CHECK: %[[TY_DECL:.*]]:2 = hlfir.declare %[[TY]]
+! CHECK: %[[RES_DECL:.*]]:2 = hlfir.declare %[[RES]]
! CHECK: %[[CALL_RES:.*]] = fir.call @_QMderived_type_finalizationPret_type()
-! CHECK: fir.save_result %[[CALL_RES]] to %[[RESULT]] : !fir.type<_QMderived_type_finalizationTt1{a:i32}>, !fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: %[[EMBOX:.*]] = fir.embox %[[RESULT]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
-! CHECK: fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}} : (!fir.box<none>) -> ()
+! CHECK: fir.save_result %[[CALL_RES]] to %[[RES_DECL]]#0
+! CHECK: hlfir.assign %[[RES_DECL]]#0 to %[[TY_DECL]]#0 realloc
+! CHECK: fir.call @_FortranADestroy(%{{.*}})
! CHECK: return
subroutine test_finalize_intent_out(t)
@@ -169,9 +153,8 @@ subroutine test_finalize_intent_out(t)
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_finalize_intent_out(
! CHECK-SAME: %[[T:.*]]: !fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>> {fir.bindc_name = "t"}) {
-! CHECK: %[[EMBOX:.*]] = fir.embox %[[T]] : (!fir.ref<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>
-! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[EMBOX]] : (!fir.box<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>) -> !fir.box<none>
-! CHECK: fir.call @_FortranADestroy(%[[BOX_NONE]]) {{.*}}: (!fir.box<none>) -> ()
+! CHECK: %[[T_DECL:.*]]:2 = hlfir.declare %[[T]]
+! CHECK: fir.call @_FortranADestroy(%{{.*}})
! CHECK: return
function get_t1(i)
@@ -187,7 +170,7 @@ subroutine test_nonpointer_function()
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_nonpointer_function() {
! CHECK: %[[TMP:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>> {bindc_name = ".result"}
! CHECK: %{{.*}} = fir.call @_FortranAioBeginExternalListOutput
-! CHECK: %[[RES:.*]] = fir.call @_QMderived_type_finalizationPget_t1(%{{.*}}) {{.*}} : (!fir.ref<i32>) -> !fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
+! CHECK: %[[RES:.*]] = fir.call @_QMderived_type_finalizationPget_t1(%{{.*}})
! CHECK: fir.save_result %[[RES]] to %[[TMP]] : !fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>, !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>>
! CHECK: %{{.*}} = fir.call @_FortranAioOutputDerivedType
! CHECK-NOT: fir.call @_FortranADestroy
@@ -202,11 +185,11 @@ subroutine test_avoid_double_finalization(a)
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_avoid_double_finalization(
! CHECK: %[[b:.*]] = fir.alloca !fir.type<_QMderived_type_finalizationTt3{t:!fir.type<_QMderived_type_finalizationTt2{a:!fir.box<!fir.heap<!fir.array<?xi32>>>}>}> {bindc_name = "b", uniq_name = "_QMderived_type_finalizationFtest_avoid_double_finalizationEb"}
-! CHECK: %[[ADDR:.*]] = fir.address_of(@_QQ_QMderived_type_finalizationTt3.DerivedInit) : !fir.ref<!fir.type<_QMderived_type_finalizationTt3{t:!fir.type<_QMderived_type_finalizationTt2{a:!fir.box<!fir.heap<!fir.array<?xi32>>>}>}>>
-! CHECK: fir.copy %[[ADDR]] to %[[b]] no_overlap : !fir.ref<!fir.type<_QMderived_type_finalizationTt3{t:!fir.type<_QMderived_type_finalizationTt2{a:!fir.box<!fir.heap<!fir.array<?xi32>>>}>}>>
+! CHECK: %[[b_DECL:.*]]:2 = hlfir.declare %[[b]]
+! CHECK: fir.copy %{{.*}} to %[[b_DECL]]#0
! CHECK-NOT: fir.call @_FortranADestroy
-! CHECK: fir.call @_FortranAAssign(
-! CHECK: fir.call @_FortranADestroy(
+! CHECK: hlfir.assign
+! CHECK: fir.call @_FortranADestroy
function no_func_ret_finalize() result(ty)
type(t1) :: ty
@@ -214,7 +197,7 @@ function no_func_ret_finalize() result(ty)
end function
! CHECK-LABEL: func.func @_QMderived_type_finalizationPno_func_ret_finalize() -> !fir.type<_QMderived_type_finalizationTt1{a:i32}> {
-! CHECK: fir.call @_FortranAAssign
+! CHECK: hlfir.assign
! CHECK-NOT: fir.call @_FortranADestroy
! CHECK: return %{{.*}} : !fir.type<_QMderived_type_finalizationTt1{a:i32}>
@@ -231,11 +214,9 @@ subroutine test_avoid_double_free()
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPtest_avoid_double_free() {
-! CHECK: %[[RES:.*]] = fir.alloca !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>> {bindc_name = ".result"}
! CHECK: fir.call @_FortranAAllocatableAllocateSource(
-! CHECK-NOT: fir.freemem %{{.*}} : !fir.heap<!fir.array<?x!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>
-! CHECK: %[[RES_CONV:.*]] = fir.convert %[[RES]] : (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMderived_type_finalizationTt1{a:i32}>>>>>) -> !fir.box<none>
-! CHECK: fir.call @_FortranADestroy(%[[RES_CONV]]) {{.*}} : (!fir.box<none>) -> ()
+! CHECK: fir.call @_FortranADestroy
+! CHECK: fir.call @_FortranAAllocatableDeallocatePolymorphic
subroutine t4_final(this)
type(t4) :: this
@@ -246,7 +227,7 @@ subroutine local_t4()
end subroutine
! CHECK-LABEL: func.func @_QMderived_type_finalizationPlocal_t4()
-! CHECK: fir.call @_FortranADestroy(%2) fastmath<contract> : (!fir.box<none>) -> ()
+! CHECK: fir.call @_FortranADestroy(%{{.*}}) fastmath<contract> : (!fir.box<none>) -> ()
end module
diff --git a/flang/test/Lower/derived-types.f90 b/flang/test/Lower/derived-types.f90
index 142e70a1c4fb3..360981906d342 100644
--- a/flang/test/Lower/derived-types.f90
+++ b/flang/test/Lower/derived-types.f90
@@ -1,5 +1,5 @@
! Test basic parts of derived type entities lowering
-! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s
! Note: only testing non parameterized derived type here.
@@ -22,27 +22,35 @@ module d
! Test simple derived type symbol lowering
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMdPderived_dummy(
-! CHECK-SAME: %{{.*}}: !fir.ref<!fir.type<_QMdTr{x:f32}>>{{.*}}, %{{.*}}: !fir.ref<!fir.type<_QMdTc2{ch_array:!fir.array<20x30x!fir.char<1,10>>}>>{{.*}}) {
+! CHECK-LABEL: func.func @_QMdPderived_dummy(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.type<_QMdTr{x:f32}>>{{.*}}, %[[ARG1:.*]]: !fir.ref<!fir.type<_QMdTc2{ch_array:!fir.array<20x30x!fir.char<1,10>>}>>{{.*}}) {
subroutine derived_dummy(some_r, some_c2)
type(r) :: some_r
type(c2) :: some_c2
+! CHECK: hlfir.declare %[[ARG1]]
+! CHECK: hlfir.declare %[[ARG0]]
end subroutine
-! CHECK-LABEL: func @_QMdPlocal_derived(
+! CHECK-LABEL: func.func @_QMdPlocal_derived(
subroutine local_derived()
- ! CHECK-DAG: fir.alloca !fir.type<_QMdTc2{ch_array:!fir.array<20x30x!fir.char<1,10>>}>
- ! CHECK-DAG: fir.alloca !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[C2:.*]] = fir.alloca !fir.type<_QMdTc2{ch_array:!fir.array<20x30x!fir.char<1,10>>}>
+ ! CHECK: %[[C2_DECL:.*]]:2 = hlfir.declare %[[C2]]
+ ! CHECK: %[[R:.*]] = fir.alloca !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[R_DECL:.*]]:2 = hlfir.declare %[[R]]
type(r) :: some_r
type(c2) :: some_c2
+ ! CHECK: hlfir.designate %[[C2_DECL]]#0{"ch_array"}
print *, some_c2%ch_array(1,1)
+ ! CHECK: hlfir.designate %[[R_DECL]]#0{"x"}
print *, some_r%x
end subroutine
-! CHECK-LABEL: func @_QMdPsaved_derived(
+! CHECK-LABEL: func.func @_QMdPsaved_derived(
subroutine saved_derived()
- ! CHECK-DAG: fir.address_of(@_QMdFsaved_derivedEsome_c2) : !fir.ref<!fir.type<_QMdTc2{ch_array:!fir.array<20x30x!fir.char<1,10>>}>>
- ! CHECK-DAG: fir.address_of(@_QMdFsaved_derivedEsome_r) : !fir.ref<!fir.type<_QMdTr{x:f32}>>
+ ! CHECK: %[[C2_ADDR:.*]] = fir.address_of(@_QMdFsaved_derivedEsome_c2)
+ ! CHECK: %[[C2_DECL:.*]]:2 = hlfir.declare %[[C2_ADDR]]
+ ! CHECK: %[[R_ADDR:.*]] = fir.address_of(@_QMdFsaved_derivedEsome_r)
+ ! CHECK: %[[R_DECL:.*]]:2 = hlfir.declare %[[R_ADDR]]
type(r), save :: some_r
type(c2), save :: some_c2
call use_symbols(some_r, some_c2)
@@ -53,66 +61,66 @@ subroutine saved_derived()
! Test simple derived type references
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMdPscalar_numeric_ref(
+! CHECK-LABEL: func.func @_QMdPscalar_numeric_ref(
subroutine scalar_numeric_ref()
- ! CHECK: %[[alloc:.*]] = fir.alloca !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[R:.*]] = fir.alloca !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[R_DECL:.*]]:2 = hlfir.declare %[[R]]
type(r) :: some_r
- ! CHECK: fir.coordinate_of %[[alloc]], x : (!fir.ref<!fir.type<_QMdTr{x:f32}>>) -> !fir.ref<f32>
+ ! CHECK: %[[X:.*]] = hlfir.designate %[[R_DECL]]#0{"x"}
call real_bar(some_r%x)
end subroutine
-! CHECK-LABEL: func @_QMdPscalar_character_ref(
+! CHECK-LABEL: func.func @_QMdPscalar_character_ref(
subroutine scalar_character_ref()
- ! CHECK: %[[alloc:.*]] = fir.alloca !fir.type<_QMdTc{ch:!fir.char<1,10>}>
+ ! CHECK: %[[C:.*]] = fir.alloca !fir.type<_QMdTc{ch:!fir.char<1,10>}>
+ ! CHECK: %[[C_DECL:.*]]:2 = hlfir.declare %[[C]]
type(c) :: some_c
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[alloc]], ch : (!fir.ref<!fir.type<_QMdTc{ch:!fir.char<1,10>}>>) -> !fir.ref<!fir.char<1,10>>
- ! CHECK-DAG: %[[c10:.*]] = arith.constant 10 : index
- ! CHECK: fir.emboxchar %[[coor]], %c10 : (!fir.ref<!fir.char<1,10>>, index) -> !fir.boxchar<1>
+ ! CHECK: %[[CH:.*]] = hlfir.designate %[[C_DECL]]#0{"ch"}
+ ! CHECK: fir.emboxchar %[[CH]]
call char_bar(some_c%ch)
end subroutine
! FIXME: coordinate of generated for derived%array_comp(i) are not zero based as they
! should be.
-! CHECK-LABEL: func @_QMdParray_comp_elt_ref(
+! CHECK-LABEL: func.func @_QMdParray_comp_elt_ref(
subroutine array_comp_elt_ref()
type(r2) :: some_r2
- ! CHECK: %[[alloc:.*]] = fir.alloca !fir.type<_QMdTr2{x_array:!fir.array<10x20xf32>}>
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[alloc]], x_array : (!fir.ref<!fir.type<_QMdTr2{x_array:!fir.array<10x20xf32>}>>) -> !fir.ref<!fir.array<10x20xf32>>
- ! CHECK-DAG: %[[index1:.*]] = arith.subi %c5{{.*}}, %c1{{.*}} : i64
- ! CHECK-DAG: %[[index2:.*]] = arith.subi %c6{{.*}}, %c1{{.*}} : i64
- ! CHECK: fir.coordinate_of %[[coor]], %[[index1]], %[[index2]] : (!fir.ref<!fir.array<10x20xf32>>, i64, i64) -> !fir.ref<f32>
+ ! CHECK: %[[R2:.*]] = fir.alloca !fir.type<_QMdTr2{x_array:!fir.array<10x20xf32>}>
+ ! CHECK: %[[R2_DECL:.*]]:2 = hlfir.declare %[[R2]]
+ ! CHECK: hlfir.designate %[[R2_DECL]]#0{"x_array"}
call real_bar(some_r2%x_array(5, 6))
end subroutine
-! CHECK-LABEL: func @_QMdPchar_array_comp_elt_ref(
+! CHECK-LABEL: func.func @_QMdPchar_array_comp_elt_ref(
subroutine char_array_comp_elt_ref()
type(c2) :: some_c2
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %{{.*}}, ch_array : (!fir.ref<!fir.type<_QMdTc2{ch_array:!fir.array<20x30x!fir.char<1,10>>}>>) -> !fir.ref<!fir.array<20x30x!fir.char<1,10>>>
- ! CHECK-DAG: %[[index1:.*]] = arith.subi %c5{{.*}}, %c1{{.*}} : i64
- ! CHECK-DAG: %[[index2:.*]] = arith.subi %c6{{.*}}, %c1{{.*}} : i64
- ! CHECK: fir.coordinate_of %[[coor]], %[[index1]], %[[index2]] : (!fir.ref<!fir.array<20x30x!fir.char<1,10>>>, i64, i64) -> !fir.ref<!fir.char<1,10>>
- ! CHECK: fir.emboxchar %{{.*}}, %c10 : (!fir.ref<!fir.char<1,10>>, index) -> !fir.boxchar<1>
+ ! CHECK: %[[C2:.*]] = fir.alloca !fir.type<_QMdTc2{ch_array:!fir.array<20x30x!fir.char<1,10>>}>
+ ! CHECK: %[[C2_DECL:.*]]:2 = hlfir.declare %[[C2]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[C2_DECL]]#0{"ch_array"}
+ ! CHECK: fir.emboxchar %[[ELT]]
call char_bar(some_c2%ch_array(5, 6))
end subroutine
-! CHECK: @_QMdParray_elt_comp_ref
+! CHECK-LABEL: func.func @_QMdParray_elt_comp_ref(
subroutine array_elt_comp_ref()
type(r) :: some_r_array(100)
- ! CHECK: %[[alloca:.*]] = fir.alloca !fir.array<100x!fir.type<_QMdTr{x:f32}>>
- ! CHECK: %[[index:.*]] = arith.subi %c5{{.*}}, %c1{{.*}} : i64
- ! CHECK: %[[elt:.*]] = fir.coordinate_of %[[alloca]], %[[index]] : (!fir.ref<!fir.array<100x!fir.type<_QMdTr{x:f32}>>>, i64) -> !fir.ref<!fir.type<_QMdTr{x:f32}>>
- ! CHECK: fir.coordinate_of %[[elt]], x : (!fir.ref<!fir.type<_QMdTr{x:f32}>>) -> !fir.ref<f32>
+ ! CHECK: %[[ARR:.*]] = fir.alloca !fir.array<100x!fir.type<_QMdTr{x:f32}>>
+ ! CHECK: %[[ARR_DECL:.*]]:2 = hlfir.declare %[[ARR]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[ARR_DECL]]#0 (%c5{{.*}})
+ ! CHECK: hlfir.designate %[[ELT]]{"x"}
call real_bar(some_r_array(5)%x)
end subroutine
-! CHECK: @_QMdPchar_array_elt_comp_ref
+! CHECK-LABEL: func.func @_QMdPchar_array_elt_comp_ref(
subroutine char_array_elt_comp_ref()
type(c) :: some_c_array(100)
- ! CHECK: fir.coordinate_of %{{.*}}, %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMdTc{ch:!fir.char<1,10>}>>>, i64) -> !fir.ref<!fir.type<_QMdTc{ch:!fir.char<1,10>}>>
- ! CHECK: fir.coordinate_of %{{.*}}, ch : (!fir.ref<!fir.type<_QMdTc{ch:!fir.char<1,10>}>>) -> !fir.ref<!fir.char<1,10>>
- ! CHECK: fir.emboxchar %{{.*}}, %c10{{.*}} : (!fir.ref<!fir.char<1,10>>, index) -> !fir.boxchar<1>
+ ! CHECK: %[[ARR:.*]] = fir.alloca !fir.array<100x!fir.type<_QMdTc{ch:!fir.char<1,10>}>>
+ ! CHECK: %[[ARR_DECL:.*]]:2 = hlfir.declare %[[ARR]]
+ ! CHECK: %[[ELT:.*]] = hlfir.designate %[[ARR_DECL]]#0 (%c5{{.*}})
+ ! CHECK: %[[CH:.*]] = hlfir.designate %[[ELT]]{"ch"}
+ ! CHECK: fir.emboxchar %[[CH]]
call char_bar(some_c_array(5)%ch)
end subroutine
@@ -124,12 +132,13 @@ subroutine char_array_elt_comp_ref()
! components. This one requires loading a component which tests other code paths
! in lowering.
-! CHECK-LABEL: func @_QMdPscalar_numeric_load(
-! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QMdTr{x:f32}>>
+! CHECK-LABEL: func.func @_QMdPscalar_numeric_load(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.type<_QMdTr{x:f32}>>
real function scalar_numeric_load(some_r)
type(r) :: some_r
- ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg0]], x : (!fir.ref<!fir.type<_QMdTr{x:f32}>>) -> !fir.ref<f32>
- ! CHECK: fir.load %[[coor]]
+ ! CHECK: %[[R_DECL:.*]]:2 = hlfir.declare %[[ARG0]]
+ ! CHECK: %[[X:.*]] = hlfir.designate %[[R_DECL]]#0{"x"}
+ ! CHECK: fir.load %[[X]]
scalar_numeric_load = some_r%x
end function
@@ -137,20 +146,23 @@ real function scalar_numeric_load(some_r)
! Test returned derived types (no length parameters)
! -----------------------------------------------------------------------------
-! CHECK-LABEL: func @_QMdPbar_return_derived() -> !fir.type<_QMdTr{x:f32}>
+! CHECK-LABEL: func.func @_QMdPbar_return_derived() -> !fir.type<_QMdTr{x:f32}>
function bar_return_derived()
- ! CHECK: %[[res:.*]] = fir.alloca !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[RET:.*]] = fir.alloca !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[RET_DECL:.*]]:2 = hlfir.declare %[[RET]]
type(r) :: bar_return_derived
- ! CHECK: %[[resLoad:.*]] = fir.load %[[res]] : !fir.ref<!fir.type<_QMdTr{x:f32}>>
- ! CHECK: return %[[resLoad]] : !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[RET_DECL]]#0
+ ! CHECK: return %[[LOAD]]
end function
-! CHECK-LABEL: func @_QMdPcall_bar_return_derived(
+! CHECK-LABEL: func.func @_QMdPcall_bar_return_derived(
subroutine call_bar_return_derived()
- ! CHECK: %[[tmp:.*]] = fir.alloca !fir.type<_QMdTr{x:f32}>
- ! CHECK: %[[call:.*]] = fir.call @_QMdPbar_return_derived() {{.*}}: () -> !fir.type<_QMdTr{x:f32}>
- ! CHECK: fir.save_result %[[call]] to %[[tmp]] : !fir.type<_QMdTr{x:f32}>, !fir.ref<!fir.type<_QMdTr{x:f32}>>
- ! CHECK: fir.call @_QPr_bar(%[[tmp]]) {{.*}}: (!fir.ref<!fir.type<_QMdTr{x:f32}>>) -> ()
+ ! CHECK: %[[TMP:.*]] = fir.alloca !fir.type<_QMdTr{x:f32}>
+ ! CHECK: %[[TMP_DECL:.*]]:2 = hlfir.declare %[[TMP]]
+ ! CHECK: %[[RES:.*]] = fir.call @_QMdPbar_return_derived()
+ ! CHECK: fir.save_result %[[RES]] to %[[TMP_DECL]]#0
+ ! CHECK: hlfir.associate
+ ! CHECK: fir.call @_QPr_bar
call r_bar(bar_return_derived())
end subroutine
@@ -166,8 +178,8 @@ module d2
type(recursive_t), pointer :: ptr
end type
contains
-! CHECK-LABEL: func @_QMd2Ptest_recursive_type(
-! CHECK-SAME: %{{.*}}: !fir.ref<!fir.type<_QMd2Trecursive_t{x:f32,ptr:!fir.box<!fir.ptr<!fir.type<_QMd2Trecursive_t>>>}>>{{.*}}) {
+! CHECK-LABEL: func.func @_QMd2Ptest_recursive_type(
+! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.type<_QMd2Trecursive_t{x:f32,ptr:!fir.box<!fir.ptr<!fir.type<_QMd2Trecursive_t>>>}>>{{.*}}) {
subroutine test_recursive_type(some_recursive)
type(recursive_t) :: some_recursive
end subroutine
diff --git a/flang/test/Lower/do_loop.f90 b/flang/test/Lower/do_loop.f90
index d3535280d6dd6..b98a0e7108113 100644
--- a/flang/test/Lower/do_loop.f90
+++ b/flang/test/Lower/do_loop.f90
@@ -1,6 +1,5 @@
-! RUN: bbc --use-desc-for-alloc=false -emit-fir -hlfir=false -o - %s | FileCheck %s
-! RUN: %flang_fc1 -mllvm --use-desc-for-alloc=false -emit-fir -flang-deprecated-no-hlfir -o - %s | FileCheck %s
-! RUN: %flang_fc1 -mllvm --use-desc-for-alloc=false -emit-fir -flang-deprecated-no-hlfir -fwrapv -o - %s | FileCheck %s --check-prefix=NO-NSW
+! RUN: %flang_fc1 -emit-hlfir -o - %s | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir -fwrapv -o - %s | FileCheck %s --check-prefix=NO-NSW
! Simple tests for structured ordered loops with loop-control.
! Tests the structure of the loop, storage to index variable and return and
@@ -12,27 +11,28 @@
! CHECK-LABEL: simple_loop
subroutine simple_loop
! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_loopEi"}
+ ! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[I_REF]]
integer :: i
! CHECK: %[[C1:.*]] = arith.constant 1 : i32
- ! CHECK: %[[C1_CVT:.*]] = fir.convert %c1_i32 : (i32) -> index
+ ! CHECK: %[[C1_CVT:.*]] = fir.convert %[[C1]] : (i32) -> index
! CHECK: %[[C5:.*]] = arith.constant 5 : i32
- ! CHECK: %[[C5_CVT:.*]] = fir.convert %c5_i32 : (i32) -> index
- ! CHECK: %[[C1:.*]] = arith.constant 1 : index
+ ! CHECK: %[[C5_CVT:.*]] = fir.convert %[[C5]] : (i32) -> index
+ ! CHECK: %[[C1_STEP:.*]] = arith.constant 1 : index
! CHECK: %[[LB:.*]] = fir.convert %[[C1_CVT]] : (index) -> i32
! CHECK: %[[LI_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =
- ! CHECK-SAME: %[[C1_CVT]] to %[[C5_CVT]] step %[[C1]]
+ ! CHECK-SAME: %[[C1_CVT]] to %[[C5_CVT]] step %[[C1_STEP]]
! CHECK-SAME: iter_args(%[[IV:.*]] = %[[LB]]) -> (i32) {
do i=1,5
- ! CHECK: fir.store %[[IV]] to %[[I_REF]] : !fir.ref<i32>
- ! CHECK: %[[STEPCAST:.*]] = fir.convert %[[C1]] : (index) -> i32
- ! CHECK: %[[IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[IV]] to %[[I_DECL]]#0 : !fir.ref<i32>
+ ! CHECK: %[[STEPCAST:.*]] = fir.convert %[[C1_STEP]] : (index) -> i32
+ ! CHECK: %[[IVLOAD:.*]] = fir.load %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[IVINC:.*]] = arith.addi %[[IVLOAD]], %[[STEPCAST]] overflow<nsw> : i32
! CHECK: fir.result %[[IVINC]] : i32
! CHECK: }
end do
- ! CHECK: fir.store %[[LI_RES]] to %[[I_REF]] : !fir.ref<i32>
- ! CHECK: %[[I:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[LI_RES]] to %[[I_DECL]]#0 : !fir.ref<i32>
+ ! CHECK: %[[I:.*]] = fir.load %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %{{.*}} = fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[I]]) {{.*}}: (!fir.ref<i8>, i32) -> i1
print *, i
end subroutine
@@ -41,9 +41,13 @@ subroutine simple_loop
! CHECK-LABEL: nested_loop
subroutine nested_loop
! CHECK: %[[ARR_REF:.*]] = fir.alloca !fir.array<5x5xi32> {bindc_name = "arr", uniq_name = "_QFnested_loopEarr"}
+ ! CHECK: %[[ARR_DECL:.*]]:2 = hlfir.declare %[[ARR_REF]]
! CHECK: %[[ASUM_REF:.*]] = fir.alloca i32 {bindc_name = "asum", uniq_name = "_QFnested_loopEasum"}
+ ! CHECK: %[[ASUM_DECL:.*]]:2 = hlfir.declare %[[ASUM_REF]]
! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_loopEi"}
+ ! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[I_REF]]
! CHECK: %[[J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_loopEj"}
+ ! CHECK: %[[J_DECL:.*]]:2 = hlfir.declare %[[J_REF]]
integer :: asum, arr(5,5)
integer :: i, j
asum = 0
@@ -57,7 +61,7 @@ subroutine nested_loop
! CHECK-SAME: %[[S_I_CVT]] to %[[E_I_CVT]] step %[[ST_I]]
! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i32) {
do i=1,5
- ! CHECK: fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[I_IV]] to %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[S_J:.*]] = arith.constant 1 : i32
! CHECK: %[[S_J_CVT:.*]] = fir.convert %[[S_J]] : (i32) -> index
! CHECK: %[[E_J:.*]] = arith.constant 5 : i32
@@ -68,35 +72,31 @@ subroutine nested_loop
! CHECK-SAME: %[[S_J_CVT]] to %[[E_J_CVT]] step %[[ST_J]]
! CHECK-SAME: iter_args(%[[J_IV:.*]] = %[[J_LB]]) -> (i32) {
do j=1,5
- ! CHECK: fir.store %[[J_IV]] to %[[J_REF]] : !fir.ref<i32>
- ! CHECK: %[[ASUM:.*]] = fir.load %[[ASUM_REF]] : !fir.ref<i32>
- ! CHECK: %[[I:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[J_IV]] to %[[J_DECL]]#0 : !fir.ref<i32>
+ ! CHECK: %[[ASUM:.*]] = fir.load %[[ASUM_DECL]]#0 : !fir.ref<i32>
+ ! CHECK: %[[I:.*]] = fir.load %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_CVT:.*]] = fir.convert %[[I]] : (i32) -> i64
- ! CHECK: %[[C1_I:.*]] = arith.constant 1 : i64
- ! CHECK: %[[I_INDX:.*]] = arith.subi %[[I_CVT]], %[[C1_I]] : i64
- ! CHECK: %[[J:.*]] = fir.load %[[J_REF]] : !fir.ref<i32>
+ ! CHECK: %[[J:.*]] = fir.load %[[J_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[J_CVT:.*]] = fir.convert %[[J]] : (i32) -> i64
- ! CHECK: %[[C1_J:.*]] = arith.constant 1 : i64
- ! CHECK: %[[J_INDX:.*]] = arith.subi %[[J_CVT]], %[[C1_J]] : i64
- ! CHECK: %[[ARR_IJ_REF:.*]] = fir.coordinate_of %[[ARR_REF]], %[[I_INDX]], %[[J_INDX]] : (!fir.ref<!fir.array<5x5xi32>>, i64, i64) -> !fir.ref<i32>
+ ! CHECK: %[[ARR_IJ_REF:.*]] = hlfir.designate %[[ARR_DECL]]#0 (%[[I_CVT]], %[[J_CVT]])
! CHECK: %[[ARR_VAL:.*]] = fir.load %[[ARR_IJ_REF]] : !fir.ref<i32>
! CHECK: %[[ASUM_NEW:.*]] = arith.addi %[[ASUM]], %[[ARR_VAL]] : i32
- ! CHECK: fir.store %[[ASUM_NEW]] to %[[ASUM_REF]] : !fir.ref<i32>
+ ! CHECK: hlfir.assign %[[ASUM_NEW]] to %[[ASUM_DECL]]#0 : i32, !fir.ref<i32>
asum = asum + arr(i,j)
! CHECK: %[[J_STEPCAST:.*]] = fir.convert %[[ST_J]] : (index) -> i32
- ! CHECK: %[[J_IVLOAD:.*]] = fir.load %[[J_REF]] : !fir.ref<i32>
+ ! CHECK: %[[J_IVLOAD:.*]] = fir.load %[[J_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[J_IVINC:.*]] = arith.addi %[[J_IVLOAD]], %[[J_STEPCAST]] overflow<nsw> : i32
! CHECK: fir.result %[[J_IVINC]] : i32
! CHECK: }
end do
- ! CHECK: fir.store %[[J_RES]] to %[[J_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[J_RES]] to %[[J_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[ST_I]] : (index) -> i32
- ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i32
! CHECK: fir.result %[[I_IVINC]] : i32
! CHECK: }
end do
- ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[I_RES]] to %[[I_DECL]]#0 : !fir.ref<i32>
end subroutine
! Test a downcounting loop
@@ -104,6 +104,7 @@ subroutine nested_loop
subroutine down_counting_loop()
integer :: i
! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFdown_counting_loopEi"}
+ ! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[I_REF]]
! CHECK: %[[C5:.*]] = arith.constant 5 : i32
! CHECK: %[[C5_CVT:.*]] = fir.convert %[[C5]] : (i32) -> index
@@ -116,14 +117,14 @@ subroutine down_counting_loop()
! CHECK-SAME: %[[C5_CVT]] to %[[C1_CVT]] step %[[CMINUS1_STEP_CVT]]
! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i32) {
do i=5,1,-1
- ! CHECK: fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[I_IV]] to %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[CMINUS1_STEP_CVT]] : (index) -> i32
- ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i32
! CHECK: fir.result %[[I_IVINC]] : i32
! CHECK: }
end do
- ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[I_RES]] to %[[I_DECL]]#0 : !fir.ref<i32>
end subroutine
! Test a general loop with a variable step
@@ -131,62 +132,69 @@ subroutine down_counting_loop()
! CHECK-SAME: (%[[S_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}, %[[E_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "e"}, %[[ST_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "st"}) {
subroutine loop_with_variable_step(s,e,st)
integer :: s, e, st
- ! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFloop_with_variable_stepEi"}
- ! CHECK: %[[S:.*]] = fir.load %[[S_REF]] : !fir.ref<i32>
+ ! CHECK-DAG: %[[E_DECL:.*]]:2 = hlfir.declare %[[E_REF]]
+ ! CHECK-DAG: %[[S_DECL:.*]]:2 = hlfir.declare %[[S_REF]]
+ ! CHECK-DAG: %[[ST_DECL:.*]]:2 = hlfir.declare %[[ST_REF]]
+ ! CHECK-DAG: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFloop_with_variable_stepEi"}
+ ! CHECK-DAG: %[[I_DECL:.*]]:2 = hlfir.declare %[[I_REF]]
+ ! CHECK: %[[S:.*]] = fir.load %[[S_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[S_CVT:.*]] = fir.convert %[[S]] : (i32) -> index
- ! CHECK: %[[E:.*]] = fir.load %[[E_REF]] : !fir.ref<i32>
+ ! CHECK: %[[E:.*]] = fir.load %[[E_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[E_CVT:.*]] = fir.convert %[[E]] : (i32) -> index
- ! CHECK: %[[ST:.*]] = fir.load %[[ST_REF]] : !fir.ref<i32>
+ ! CHECK: %[[ST:.*]] = fir.load %[[ST_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[ST_CVT:.*]] = fir.convert %[[ST]] : (i32) -> index
! CHECK: %[[I_LB:.*]] = fir.convert %[[S_CVT]] : (index) -> i32
! CHECK: %[[I_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =
! CHECK-SAME: %[[S_CVT]] to %[[E_CVT]] step %[[ST_CVT]]
! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i32) {
do i=s,e,st
- ! CHECK: fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[I_IV]] to %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[ST_CVT]] : (index) -> i32
- ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i32
! CHECK: fir.result %[[I_IVINC]] : i32
! CHECK: }
end do
- ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i32>
+ ! CHECK: fir.store %[[I_RES]] to %[[I_DECL]]#0 : !fir.ref<i32>
end subroutine
! Test usage of pointer variables as index, start, end and step variables
! CHECK-LABEL: loop_with_pointer_variables
! CHECK-SAME: (%[[S_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "s", fir.target}, %[[E_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "e", fir.target}, %[[ST_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "st", fir.target}) {
subroutine loop_with_pointer_variables(s,e,st)
-! CHECK: %[[E_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEeptr.addr"}
-! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", fir.target, uniq_name = "_QFloop_with_pointer_variablesEi"}
-! CHECK: %[[I_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEiptr.addr"}
-! CHECK: %[[S_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEsptr.addr"}
-! CHECK: %[[ST_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEstptr.addr"}
+! CHECK-DAG: %[[E_PTR_REF:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "eptr", uniq_name = "_QFloop_with_pointer_variablesEeptr"}
+! CHECK-DAG: %[[E_PTR_DECL:.*]]:2 = hlfir.declare %[[E_PTR_REF]]
+! CHECK-DAG: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", fir.target, uniq_name = "_QFloop_with_pointer_variablesEi"}
+! CHECK-DAG: %[[I_DECL:.*]]:2 = hlfir.declare %[[I_REF]]
+! CHECK-DAG: %[[I_PTR_REF:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "iptr", uniq_name = "_QFloop_with_pointer_variablesEiptr"}
+! CHECK-DAG: %[[I_PTR_DECL:.*]]:2 = hlfir.declare %[[I_PTR_REF]]
+! CHECK-DAG: %[[S_PTR_REF:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "sptr", uniq_name = "_QFloop_with_pointer_variablesEsptr"}
+! CHECK-DAG: %[[S_PTR_DECL:.*]]:2 = hlfir.declare %[[S_PTR_REF]]
+! CHECK-DAG: %[[ST_PTR_REF:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "stptr", uniq_name = "_QFloop_with_pointer_variablesEstptr"}
+! CHECK-DAG: %[[ST_PTR_DECL:.*]]:2 = hlfir.declare %[[ST_PTR_REF]]
integer, target :: i
integer, target :: s, e, st
integer, pointer :: iptr, sptr, eptr, stptr
-! CHECK: %[[I_PTR:.*]] = fir.convert %[[I_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK: fir.store %[[I_PTR]] to %[[I_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
-! CHECK: %[[S_PTR:.*]] = fir.convert %[[S_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK: fir.store %[[S_PTR]] to %[[S_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
-! CHECK: %[[E_PTR:.*]] = fir.convert %[[E_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK: fir.store %[[E_PTR]] to %[[E_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
-! CHECK: %[[ST_PTR:.*]] = fir.convert %[[ST_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>
-! CHECK: fir.store %[[ST_PTR]] to %[[ST_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
+! CHECK: %[[I_PTR:.*]] = fir.embox %[[I_DECL]]#0 : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
+! CHECK: fir.store %[[I_PTR]] to %[[I_PTR_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
iptr => i
sptr => s
eptr => e
stptr => st
-! CHECK: %[[I_PTR:.*]] = fir.load %[[I_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
-! CHECK: %[[S_PTR:.*]] = fir.load %[[S_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
+! CHECK: %[[I_BOX:.*]] = fir.load %[[I_PTR_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK: %[[I_PTR:.*]] = fir.box_addr %[[I_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
+! CHECK: %[[S_BOX:.*]] = fir.load %[[S_PTR_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK: %[[S_PTR:.*]] = fir.box_addr %[[S_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
! CHECK: %[[S:.*]] = fir.load %[[S_PTR]] : !fir.ptr<i32>
! CHECK: %[[S_CVT:.*]] = fir.convert %[[S]] : (i32) -> index
-! CHECK: %[[E_PTR:.*]] = fir.load %[[E_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
+! CHECK: %[[E_BOX:.*]] = fir.load %[[E_PTR_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK: %[[E_PTR:.*]] = fir.box_addr %[[E_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
! CHECK: %[[E:.*]] = fir.load %[[E_PTR]] : !fir.ptr<i32>
! CHECK: %[[E_CVT:.*]] = fir.convert %[[E]] : (i32) -> index
-! CHECK: %[[ST_PTR:.*]] = fir.load %[[ST_PTR_REF]] : !fir.ref<!fir.ptr<i32>>
+! CHECK: %[[ST_BOX:.*]] = fir.load %[[ST_PTR_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK: %[[ST_PTR:.*]] = fir.box_addr %[[ST_BOX]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
! CHECK: %[[ST:.*]] = fir.load %[[ST_PTR]] : !fir.ptr<i32>
! CHECK: %[[ST_CVT:.*]] = fir.convert %[[ST]] : (i32) -> index
! CHECK: %[[I_LB:.*]] = fir.convert %[[S_CVT]] : (index) -> i32
@@ -208,13 +216,17 @@ subroutine loop_with_pointer_variables(s,e,st)
! CHECK-LABEL: loop_with_non_default_integer
! CHECK-SAME: (%[[S_REF:.*]]: !fir.ref<i64> {fir.bindc_name = "s"}, %[[E_REF:.*]]: !fir.ref<i64> {fir.bindc_name = "e"}, %[[ST_REF:.*]]: !fir.ref<i64> {fir.bindc_name = "st"}) {
subroutine loop_with_non_default_integer(s,e,st)
- ! CHECK: %[[I_REF:.*]] = fir.alloca i64 {bindc_name = "i", uniq_name = "_QFloop_with_non_default_integerEi"}
+ ! CHECK-DAG: %[[E_DECL:.*]]:2 = hlfir.declare %[[E_REF]]
+ ! CHECK-DAG: %[[S_DECL:.*]]:2 = hlfir.declare %[[S_REF]]
+ ! CHECK-DAG: %[[ST_DECL:.*]]:2 = hlfir.declare %[[ST_REF]]
+ ! CHECK-DAG: %[[I_REF:.*]] = fir.alloca i64 {bindc_name = "i", uniq_name = "_QFloop_with_non_default_integerEi"}
+ ! CHECK-DAG: %[[I_DECL:.*]]:2 = hlfir.declare %[[I_REF]]
integer(kind=8):: i
- ! CHECK: %[[S:.*]] = fir.load %[[S_REF]] : !fir.ref<i64>
+ ! CHECK: %[[S:.*]] = fir.load %[[S_DECL]]#0 : !fir.ref<i64>
! CHECK: %[[S_CVT:.*]] = fir.convert %[[S]] : (i64) -> index
- ! CHECK: %[[E:.*]] = fir.load %[[E_REF]] : !fir.ref<i64>
+ ! CHECK: %[[E:.*]] = fir.load %[[E_DECL]]#0 : !fir.ref<i64>
! CHECK: %[[E_CVT:.*]] = fir.convert %[[E]] : (i64) -> index
- ! CHECK: %[[ST:.*]] = fir.load %[[ST_REF]] : !fir.ref<i64>
+ ! CHECK: %[[ST:.*]] = fir.load %[[ST_DECL]]#0 : !fir.ref<i64>
! CHECK: %[[ST_CVT:.*]] = fir.convert %[[ST]] : (i64) -> index
integer(kind=8) :: s, e, st
@@ -223,14 +235,14 @@ subroutine loop_with_non_default_integer(s,e,st)
! CHECK-SAME: %[[S_CVT]] to %[[E_CVT]] step %[[ST_CVT]]
! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i64) {
do i=s,e,st
- ! CHECK: fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i64>
+ ! CHECK: fir.store %[[I_IV]] to %[[I_DECL]]#0 : !fir.ref<i64>
! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[ST_CVT]] : (index) -> i64
- ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i64>
+ ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_DECL]]#0 : !fir.ref<i64>
! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i64
! CHECK: fir.result %[[I_IVINC]] : i64
end do
! CHECK: }
- ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i64>
+ ! CHECK: fir.store %[[I_RES]] to %[[I_DECL]]#0 : !fir.ref<i64>
end subroutine
! Test real loop control.
@@ -239,9 +251,13 @@ subroutine loop_with_non_default_integer(s,e,st)
subroutine loop_with_real_control(s,e,st)
! CHECK-DAG: %[[INDEX_REF:.*]] = fir.alloca index
! CHECK-DAG: %[[X_REF:.*]] = fir.alloca f32 {bindc_name = "x", uniq_name = "_QFloop_with_real_controlEx"}
- ! CHECK-DAG: %[[S:.*]] = fir.load %[[S_REF]] : !fir.ref<f32>
- ! CHECK-DAG: %[[E:.*]] = fir.load %[[E_REF]] : !fir.ref<f32>
- ! CHECK-DAG: %[[ST:.*]] = fir.load %[[ST_REF]] : !fir.ref<f32>
+ ! CHECK-DAG: %[[X_DECL:.*]]:2 = hlfir.declare %[[X_REF]]
+ ! CHECK-DAG: %[[E_DECL:.*]]:2 = hlfir.declare %[[E_REF]]
+ ! CHECK-DAG: %[[S_DECL:.*]]:2 = hlfir.declare %[[S_REF]]
+ ! CHECK-DAG: %[[ST_DECL:.*]]:2 = hlfir.declare %[[ST_REF]]
+ ! CHECK: %[[S:.*]] = fir.load %[[S_DECL]]#0 : !fir.ref<f32>
+ ! CHECK: %[[E:.*]] = fir.load %[[E_DECL]]#0 : !fir.ref<f32>
+ ! CHECK: %[[ST:.*]] = fir.load %[[ST_DECL]]#0 : !fir.ref<f32>
! CHECK: fir.store %[[ST]] to %[[ST_VAR:.*]] : !fir.ref<f32>
real :: x, s, e, st
@@ -250,7 +266,7 @@ subroutine loop_with_real_control(s,e,st)
! CHECK: %[[HIGH:.*]] = arith.divf %[[RANGE]], %[[ST]] {{.*}}: f32
! CHECK: %[[HIGH_INDEX:.*]] = fir.convert %[[HIGH]] : (f32) -> index
! CHECK: fir.store %[[HIGH_INDEX]] to %[[INDEX_REF]] : !fir.ref<index>
- ! CHECK: fir.store %[[S]] to %[[X_REF]] : !fir.ref<f32>
+ ! CHECK: fir.store %[[S]] to %[[X_DECL]]#0 : !fir.ref<f32>
! CHECK: br ^[[HDR:.*]]
! CHECK: ^[[HDR]]: // 2 preds: ^{{.*}}, ^[[EXIT:.*]]
@@ -264,10 +280,10 @@ subroutine loop_with_real_control(s,e,st)
! CHECK-DAG: %[[C1:.*]] = arith.constant 1 : index
! CHECK: %[[INC:.*]] = arith.subi %[[INDEX2]], %[[C1]] : index
! CHECK: fir.store %[[INC]] to %[[INDEX_REF]] : !fir.ref<index>
- ! CHECK: %[[X2:.*]] = fir.load %[[X_REF]] : !fir.ref<f32>
+ ! CHECK: %[[X2:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<f32>
! CHECK: %[[ST_VAL:.*]] = fir.load %[[ST_VAR]] : !fir.ref<f32>
! CHECK: %[[XINC:.*]] = arith.addf %[[X2]], %[[ST_VAL]] {{.*}}: f32
- ! CHECK: fir.store %[[XINC]] to %[[X_REF]] : !fir.ref<f32>
+ ! CHECK: fir.store %[[XINC]] to %[[X_DECL]]#0 : !fir.ref<f32>
! CHECK: br ^[[HDR]]
end do
end subroutine
diff --git a/flang/test/Lower/do_loop_unstructured.f90 b/flang/test/Lower/do_loop_unstructured.f90
index 9c7d874a1aac8..4182ab0b6aefa 100644
--- a/flang/test/Lower/do_loop_unstructured.f90
+++ b/flang/test/Lower/do_loop_unstructured.f90
@@ -1,6 +1,5 @@
-! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
-! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -o - %s | FileCheck %s
-! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fwrapv -o - %s | FileCheck %s --check-prefix=NO-NSW
+! RUN: %flang_fc1 -emit-hlfir -o - %s | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir -fwrapv -o - %s | FileCheck %s --check-prefix=NO-NSW
! Tests for unstructured loops.
@@ -20,6 +19,7 @@ subroutine simple_unstructured()
! CHECK-LABEL: simple_unstructured
! CHECK: %[[TRIP_VAR_REF:.*]] = fir.alloca i32
! CHECK: %[[LOOP_VAR_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_unstructuredEi"}
+! CHECK: %[[LOOP_VAR_DECL:.*]]:2 = hlfir.declare %[[LOOP_VAR_REF]]
! CHECK: %[[ONE:.*]] = arith.constant 1 : i32
! CHECK: %[[HUNDRED:.*]] = arith.constant 100 : i32
! CHECK: %[[STEP_ONE:.*]] = arith.constant 1 : i32
@@ -27,7 +27,7 @@ subroutine simple_unstructured()
! CHECK: %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[STEP_ONE]] : i32
! CHECK: %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[STEP_ONE]] : i32
! CHECK: fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
-! CHECK: fir.store %[[ONE]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[ONE]] to %[[LOOP_VAR_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER:.*]]
! CHECK: ^[[HEADER]]:
! CHECK: %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>
@@ -39,10 +39,10 @@ subroutine simple_unstructured()
! CHECK: %[[ONE_1:.*]] = arith.constant 1 : i32
! CHECK: %[[TRIP_VAR_NEXT:.*]] = arith.subi %[[TRIP_VAR]], %[[ONE_1]] : i32
! CHECK: fir.store %[[TRIP_VAR_NEXT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
-! CHECK: %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_REF]] : !fir.ref<i32>
+! CHECK: %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[STEP_ONE_2:.*]] = arith.constant 1 : i32
! CHECK: %[[LOOP_VAR_NEXT:.*]] = arith.addi %[[LOOP_VAR]], %[[STEP_ONE_2]] overflow<nsw> : i32
-! CHECK: fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER]]
! CHECK: ^[[EXIT]]:
! CHECK: return
@@ -59,6 +59,7 @@ subroutine simple_unstructured_with_step()
! CHECK-LABEL: simple_unstructured_with_step
! CHECK: %[[TRIP_VAR_REF:.*]] = fir.alloca i32
! CHECK: %[[LOOP_VAR_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_unstructured_with_stepEi"}
+! CHECK: %[[LOOP_VAR_DECL:.*]]:2 = hlfir.declare %[[LOOP_VAR_REF]]
! CHECK: %[[ONE:.*]] = arith.constant 1 : i32
! CHECK: %[[HUNDRED:.*]] = arith.constant 100 : i32
! CHECK: %[[STEP:.*]] = arith.constant 2 : i32
@@ -66,7 +67,7 @@ subroutine simple_unstructured_with_step()
! CHECK: %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[STEP]] : i32
! CHECK: %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[STEP]] : i32
! CHECK: fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
-! CHECK: fir.store %[[ONE]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[ONE]] to %[[LOOP_VAR_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER:.*]]
! CHECK: ^[[HEADER]]:
! CHECK: %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>
@@ -78,10 +79,10 @@ subroutine simple_unstructured_with_step()
! CHECK: %[[ONE_1:.*]] = arith.constant 1 : i32
! CHECK: %[[TRIP_VAR_NEXT:.*]] = arith.subi %[[TRIP_VAR]], %[[ONE_1]] : i32
! CHECK: fir.store %[[TRIP_VAR_NEXT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>
-! CHECK: %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_REF]] : !fir.ref<i32>
+! CHECK: %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[STEP_2:.*]] = arith.constant 2 : i32
! CHECK: %[[LOOP_VAR_NEXT:.*]] = arith.addi %[[LOOP_VAR]], %[[STEP_2]] overflow<nsw> : i32
-! CHECK: fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER]]
! CHECK: ^[[EXIT]]:
! CHECK: return
@@ -104,8 +105,11 @@ subroutine nested_unstructured()
! CHECK: %[[TRIP_VAR_J_REF:.*]] = fir.alloca i32
! CHECK: %[[TRIP_VAR_I_REF:.*]] = fir.alloca i32
! CHECK: %[[LOOP_VAR_I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_unstructuredEi"}
+! CHECK: %[[LOOP_VAR_I_DECL:.*]]:2 = hlfir.declare %[[LOOP_VAR_I_REF]]
! CHECK: %[[LOOP_VAR_J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_unstructuredEj"}
+! CHECK: %[[LOOP_VAR_J_DECL:.*]]:2 = hlfir.declare %[[LOOP_VAR_J_REF]]
! CHECK: %[[LOOP_VAR_K_REF:.*]] = fir.alloca i32 {bindc_name = "k", uniq_name = "_QFnested_unstructuredEk"}
+! CHECK: %[[LOOP_VAR_K_DECL:.*]]:2 = hlfir.declare %[[LOOP_VAR_K_REF]]
! CHECK: %[[I_START:.*]] = arith.constant 1 : i32
! CHECK: %[[I_END:.*]] = arith.constant 100 : i32
! CHECK: %[[I_STEP:.*]] = arith.constant 1 : i32
@@ -113,7 +117,7 @@ subroutine nested_unstructured()
! CHECK: %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[I_STEP]] : i32
! CHECK: %[[TRIP_COUNT_I:.*]] = arith.divsi %[[TMP2]], %[[I_STEP]] : i32
! CHECK: fir.store %[[TRIP_COUNT_I]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
-! CHECK: fir.store %[[I_START]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[I_START]] to %[[LOOP_VAR_I_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER_I:.*]]
! CHECK: ^[[HEADER_I]]:
! CHECK: %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
@@ -128,7 +132,7 @@ subroutine nested_unstructured()
! CHECK: %[[TMP4:.*]] = arith.addi %[[TMP3]], %[[J_STEP]] : i32
! CHECK: %[[TRIP_COUNT_J:.*]] = arith.divsi %[[TMP4]], %[[J_STEP]] : i32
! CHECK: fir.store %[[TRIP_COUNT_J]] to %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
-! CHECK: fir.store %[[J_START]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[J_START]] to %[[LOOP_VAR_J_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER_J:.*]]
! CHECK: ^[[HEADER_J]]:
! CHECK: %[[TRIP_VAR_J:.*]] = fir.load %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
@@ -143,7 +147,7 @@ subroutine nested_unstructured()
! CHECK: %[[TMP4:.*]] = arith.addi %[[TMP3]], %[[K_STEP]] : i32
! CHECK: %[[TRIP_COUNT_K:.*]] = arith.divsi %[[TMP4]], %[[K_STEP]] : i32
! CHECK: fir.store %[[TRIP_COUNT_K]] to %[[TRIP_VAR_K_REF]] : !fir.ref<i32>
-! CHECK: fir.store %[[K_START]] to %[[LOOP_VAR_K_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[K_START]] to %[[LOOP_VAR_K_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER_K:.*]]
! CHECK: ^[[HEADER_K]]:
! CHECK: %[[TRIP_VAR_K:.*]] = fir.load %[[TRIP_VAR_K_REF]] : !fir.ref<i32>
@@ -155,30 +159,30 @@ subroutine nested_unstructured()
! CHECK: %[[ONE_1:.*]] = arith.constant 1 : i32
! CHECK: %[[TRIP_VAR_K_NEXT:.*]] = arith.subi %[[TRIP_VAR_K]], %[[ONE_1]] : i32
! CHECK: fir.store %[[TRIP_VAR_K_NEXT]] to %[[TRIP_VAR_K_REF]] : !fir.ref<i32>
-! CHECK: %[[LOOP_VAR_K:.*]] = fir.load %[[LOOP_VAR_K_REF]] : !fir.ref<i32>
+! CHECK: %[[LOOP_VAR_K:.*]] = fir.load %[[LOOP_VAR_K_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[K_STEP_2:.*]] = arith.constant 1 : i32
! CHECK: %[[LOOP_VAR_K_NEXT:.*]] = arith.addi %[[LOOP_VAR_K]], %[[K_STEP_2]] overflow<nsw> : i32
-! CHECK: fir.store %[[LOOP_VAR_K_NEXT]] to %[[LOOP_VAR_K_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[LOOP_VAR_K_NEXT]] to %[[LOOP_VAR_K_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER_K]]
! CHECK: ^[[EXIT_K]]:
! CHECK: %[[TRIP_VAR_J:.*]] = fir.load %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
! CHECK: %[[ONE_1:.*]] = arith.constant 1 : i32
! CHECK: %[[TRIP_VAR_J_NEXT:.*]] = arith.subi %[[TRIP_VAR_J]], %[[ONE_1]] : i32
! CHECK: fir.store %[[TRIP_VAR_J_NEXT]] to %[[TRIP_VAR_J_REF]] : !fir.ref<i32>
-! CHECK: %[[LOOP_VAR_J:.*]] = fir.load %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
+! CHECK: %[[LOOP_VAR_J:.*]] = fir.load %[[LOOP_VAR_J_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[J_STEP_2:.*]] = arith.constant 1 : i32
! CHECK: %[[LOOP_VAR_J_NEXT:.*]] = arith.addi %[[LOOP_VAR_J]], %[[J_STEP_2]] overflow<nsw> : i32
-! CHECK: fir.store %[[LOOP_VAR_J_NEXT]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[LOOP_VAR_J_NEXT]] to %[[LOOP_VAR_J_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER_J]]
! CHECK: ^[[EXIT_J]]:
! CHECK: %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
! CHECK: %[[ONE_1:.*]] = arith.constant 1 : i32
! CHECK: %[[TRIP_VAR_I_NEXT:.*]] = arith.subi %[[TRIP_VAR_I]], %[[ONE_1]] : i32
! CHECK: fir.store %[[TRIP_VAR_I_NEXT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
-! CHECK: %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
+! CHECK: %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_STEP_2:.*]] = arith.constant 1 : i32
! CHECK: %[[LOOP_VAR_I_NEXT:.*]] = arith.addi %[[LOOP_VAR_I]], %[[I_STEP_2]] overflow<nsw> : i32
-! CHECK: fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER_I]]
! CHECK: ^[[EXIT_I]]:
! CHECK: return
@@ -197,7 +201,9 @@ subroutine nested_structured_in_unstructured()
! CHECK-LABEL: nested_structured_in_unstructured
! CHECK: %[[TRIP_VAR_I_REF:.*]] = fir.alloca i32
! CHECK: %[[LOOP_VAR_I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_structured_in_unstructuredEi"}
+! CHECK: %[[LOOP_VAR_I_DECL:.*]]:2 = hlfir.declare %[[LOOP_VAR_I_REF]]
! CHECK: %[[LOOP_VAR_J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_structured_in_unstructuredEj"}
+! CHECK: %[[LOOP_VAR_J_DECL:.*]]:2 = hlfir.declare %[[LOOP_VAR_J_REF]]
! CHECK: %[[I_START:.*]] = arith.constant 1 : i32
! CHECK: %[[I_END:.*]] = arith.constant 100 : i32
! CHECK: %[[I_STEP:.*]] = arith.constant 1 : i32
@@ -205,7 +211,7 @@ subroutine nested_structured_in_unstructured()
! CHECK: %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[I_STEP]] : i32
! CHECK: %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[I_STEP]] : i32
! CHECK: fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
-! CHECK: fir.store %[[I_START]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[I_START]] to %[[LOOP_VAR_I_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER:.*]]
! CHECK: ^[[HEADER]]:
! CHECK: %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
@@ -216,18 +222,18 @@ subroutine nested_structured_in_unstructured()
! CHECK: %{{.*}} = fir.do_loop %[[J_INDEX:[^ ]*]] =
! CHECK-SAME: %{{.*}} to %{{.*}} step %[[ST:[^ ]*]]
! CHECK-SAME: iter_args(%[[J_IV:.*]] = %{{.*}}) -> (i32) {
-! CHECK: fir.store %[[J_IV]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
-! CHECK: %[[LOOP_VAR_J:.*]] = fir.load %[[LOOP_VAR_J_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[J_IV]] to %[[LOOP_VAR_J_DECL]]#0 : !fir.ref<i32>
+! CHECK: %[[LOOP_VAR_J:.*]] = fir.load %[[LOOP_VAR_J_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[LOOP_VAR_J_NEXT:.*]] = arith.addi %[[LOOP_VAR_J]], %{{[^ ]*}} overflow<nsw> : i32
! CHECK: }
! CHECK: %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
! CHECK: %[[C1_3:.*]] = arith.constant 1 : i32
! CHECK: %[[TRIP_VAR_I_NEXT:.*]] = arith.subi %[[TRIP_VAR_I]], %[[C1_3]] : i32
! CHECK: fir.store %[[TRIP_VAR_I_NEXT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>
-! CHECK: %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
+! CHECK: %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_DECL]]#0 : !fir.ref<i32>
! CHECK: %[[I_STEP_2:.*]] = arith.constant 1 : i32
! CHECK: %[[LOOP_VAR_I_NEXT:.*]] = arith.addi %[[LOOP_VAR_I]], %[[I_STEP_2]] overflow<nsw> : i32
-! CHECK: fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>
+! CHECK: fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_DECL]]#0 : !fir.ref<i32>
! CHECK: cf.br ^[[HEADER]]
! CHECK: ^[[EXIT]]:
! CHECK: return
More information about the flang-commits
mailing list