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