brintos

brintos / llvm-project-archived public Read only

0
0
Text · 45.4 KiB · 15a3e39 Raw
794 lines · plain
1// Test that the redundant fir.[un]pack_array operations2// are optimized away, when the source is statically known3// to be contiguous.4// RUN: fir-opt --optimize-array-repacking %s | FileCheck %s5 6// FIR is produced by compiling the sources with -mllvm -inline-all.7// module inner8// contains9//   subroutine inner_repack1(x)10//     real :: x(:)11//   end subroutine inner_repack112//   subroutine inner_repack2(x)13//     real :: x(:,:)14//   end subroutine inner_repack215// end module inner16 17// subroutine test_explicit_shape_cst(x)18//   real :: x(100)19//   call repack(x(1:50))20// contains21//   subroutine repack(x)22//     real :: x(:)23//   end subroutine repack24// end subroutine test_explicit_shape_cst25//26// CHECK-LABEL:   func.func @_QPtest_explicit_shape_cst(27// CHECK-NOT: fir.{{.*}}pack_array28func.func @_QPtest_explicit_shape_cst(%arg0: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "x"}) {29  %c50 = arith.constant 50 : index30  %c1 = arith.constant 1 : index31  %c100 = arith.constant 100 : index32  %0 = fir.dummy_scope : !fir.dscope33  %1 = fir.shape %c100 : (index) -> !fir.shape<1>34  %2 = fir.declare %arg0(%1) dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_cstEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<100xf32>>35  %3 = fir.shape %c50 : (index) -> !fir.shape<1>36  %4 = fir.array_coor %2(%1) %c1 : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>37  %5 = fir.convert %4 : (!fir.ref<f32>) -> !fir.ref<!fir.array<50xf32>>38  %6 = fir.embox %5(%3) : (!fir.ref<!fir.array<50xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<50xf32>>39  %7 = fir.convert %6 : (!fir.box<!fir.array<50xf32>>) -> !fir.box<!fir.array<?xf32>>40  %8 = fir.dummy_scope : !fir.dscope41  %9 = fir.pack_array %7 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>42  %10 = fir.declare %9 dummy_scope %8 {uniq_name = "_QFtest_explicit_shape_cstFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>43  fir.unpack_array %9 to %7 heap : !fir.box<!fir.array<?xf32>>44  return45}46 47// subroutine test_explicit_shape_var(x, n, l, u)48//   integer :: n, l, u49//   real :: x(n)50//   call repack(x(l:u))51// contains52//   subroutine repack(x)53//     real :: x(:)54//   end subroutine repack55// end subroutine test_explicit_shape_var56//57// CHECK-LABEL:   func.func @_QPtest_explicit_shape_var(58// CHECK-NOT: fir.{{.*}}pack_array59func.func @_QPtest_explicit_shape_var(%arg0: !fir.ref<!fir.array<?xf32>> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "n"}, %arg2: !fir.ref<i32> {fir.bindc_name = "l"}, %arg3: !fir.ref<i32> {fir.bindc_name = "u"}) {60  %c1 = arith.constant 1 : index61  %c0 = arith.constant 0 : index62  %0 = fir.dummy_scope : !fir.dscope63  %1 = fir.declare %arg2 dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_varEl"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>64  %2 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_varEn"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>65  %3 = fir.declare %arg3 dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_varEu"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>66  %4 = fir.load %2 : !fir.ref<i32>67  %5 = fir.convert %4 : (i32) -> index68  %6 = arith.cmpi sgt, %5, %c0 : index69  %7 = arith.select %6, %5, %c0 : index70  %8 = fir.shape %7 : (index) -> !fir.shape<1>71  %9 = fir.declare %arg0(%8) dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_varEx"} : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<?xf32>>72  %10 = fir.load %1 : !fir.ref<i32>73  %11 = fir.load %3 : !fir.ref<i32>74  %12 = fir.convert %10 : (i32) -> index75  %13 = fir.convert %11 : (i32) -> index76  %14 = fir.slice %12, %13, %c1 : (index, index, index) -> !fir.slice<1>77  %15 = fir.embox %9(%8) [%14] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>78  %16 = fir.dummy_scope : !fir.dscope79  %17 = fir.pack_array %15 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>80  %18 = fir.declare %17 dummy_scope %16 {uniq_name = "_QFtest_explicit_shape_varFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>81  fir.unpack_array %17 to %15 heap : !fir.box<!fir.array<?xf32>>82  return83}84 85// subroutine test_assumed_size_cst(x)86//   real :: x(*)87//   call repack(x(1:50))88// contains89//   subroutine repack(x)90//     real :: x(:)91//   end subroutine repack92// end subroutine test_assumed_size_cst93//94// CHECK-LABEL:   func.func @_QPtest_assumed_size_cst(95// CHECK-NOT: fir.{{.*}}pack_array96func.func @_QPtest_assumed_size_cst(%arg0: !fir.ref<!fir.array<?xf32>> {fir.bindc_name = "x"}) {97  %c50 = arith.constant 50 : index98  %c1 = arith.constant 1 : index99  %c-1 = arith.constant -1 : index100  %0 = fir.dummy_scope : !fir.dscope101  %1 = fir.shape %c-1 : (index) -> !fir.shape<1>102  %2 = fir.declare %arg0(%1) dummy_scope %0 {uniq_name = "_QFtest_assumed_size_cstEx"} : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<?xf32>>103  %3 = fir.shape %c50 : (index) -> !fir.shape<1>104  %4 = fir.array_coor %2(%1) %c1 : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>105  %5 = fir.convert %4 : (!fir.ref<f32>) -> !fir.ref<!fir.array<50xf32>>106  %6 = fir.embox %5(%3) : (!fir.ref<!fir.array<50xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<50xf32>>107  %7 = fir.convert %6 : (!fir.box<!fir.array<50xf32>>) -> !fir.box<!fir.array<?xf32>>108  %8 = fir.dummy_scope : !fir.dscope109  %9 = fir.pack_array %7 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>110  %10 = fir.declare %9 dummy_scope %8 {uniq_name = "_QFtest_assumed_size_cstFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>111  fir.unpack_array %9 to %7 heap : !fir.box<!fir.array<?xf32>>112  return113}114 115// subroutine test_assumed_size_var(x, l, u)116//   integer :: l, u117//   real :: x(*)118//   call repack(x(l:u))119// contains120//   subroutine repack(x)121//     real :: x(:)122//   end subroutine repack123// end subroutine test_assumed_size_var124//125// CHECK-LABEL:   func.func @_QPtest_assumed_size_var(126// CHECK-NOT: fir.{{.*}}pack_array127func.func @_QPtest_assumed_size_var(%arg0: !fir.ref<!fir.array<?xf32>> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "l"}, %arg2: !fir.ref<i32> {fir.bindc_name = "u"}) {128  %c1 = arith.constant 1 : index129  %c-1 = arith.constant -1 : index130  %0 = fir.dummy_scope : !fir.dscope131  %1 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFtest_assumed_size_varEl"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>132  %2 = fir.declare %arg2 dummy_scope %0 {uniq_name = "_QFtest_assumed_size_varEu"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>133  %3 = fir.shape %c-1 : (index) -> !fir.shape<1>134  %4 = fir.declare %arg0(%3) dummy_scope %0 {uniq_name = "_QFtest_assumed_size_varEx"} : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<?xf32>>135  %5 = fir.load %1 : !fir.ref<i32>136  %6 = fir.load %2 : !fir.ref<i32>137  %7 = fir.convert %5 : (i32) -> index138  %8 = fir.convert %6 : (i32) -> index139  %9 = fir.slice %7, %8, %c1 : (index, index, index) -> !fir.slice<1>140  %10 = fir.embox %4(%3) [%9] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>141  %11 = fir.dummy_scope : !fir.dscope142  %12 = fir.pack_array %10 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>143  %13 = fir.declare %12 dummy_scope %11 {uniq_name = "_QFtest_assumed_size_varFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>144  fir.unpack_array %12 to %10 heap : !fir.box<!fir.array<?xf32>>145  return146}147 148// subroutine test_allocatable_cst(x)149//   real, allocatable :: x(:)150//   call repack(x(10:50))151// contains152//   subroutine repack(x)153//     real :: x(:)154//   end subroutine repack155// end subroutine test_allocatable_cst156//157// CHECK-LABEL:   func.func @_QPtest_allocatable_cst(158// CHECK-NOT: fir.{{.*}}pack_array159func.func @_QPtest_allocatable_cst(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {fir.bindc_name = "x"}) {160  %c0 = arith.constant 0 : index161  %c41 = arith.constant 41 : index162  %c10 = arith.constant 10 : index163  %0 = fir.dummy_scope : !fir.dscope164  %1 = fir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest_allocatable_cstEx"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.dscope) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>165  %2 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>166  %3 = fir.shape %c41 : (index) -> !fir.shape<1>167  %4 = fir.box_addr %2 : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>168  %5:3 = fir.box_dims %2, %c0 : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)169  %6 = fir.shape_shift %5#0, %5#1 : (index, index) -> !fir.shapeshift<1>170  %7 = fir.array_coor %4(%6) %c10 : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, index) -> !fir.ref<f32>171  %8 = fir.convert %7 : (!fir.ref<f32>) -> !fir.ref<!fir.array<41xf32>>172  %9 = fir.embox %8(%3) : (!fir.ref<!fir.array<41xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<41xf32>>173  %10 = fir.convert %9 : (!fir.box<!fir.array<41xf32>>) -> !fir.box<!fir.array<?xf32>>174  %11 = fir.dummy_scope : !fir.dscope175  %12 = fir.pack_array %10 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>176  %13 = fir.declare %12 dummy_scope %11 {uniq_name = "_QFtest_allocatable_cstFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>177  fir.unpack_array %12 to %10 heap : !fir.box<!fir.array<?xf32>>178  return179}180 181// subroutine test_allocatable_var(x, l, u)182//   integer :: l, u183//   real, allocatable :: x(:)184//   call repack(x(l:u))185// contains186//   subroutine repack(x)187//     real :: x(:)188//   end subroutine repack189// end subroutine test_allocatable_var190//191// CHECK-LABEL:   func.func @_QPtest_allocatable_var(192// CHECK-NOT: fir.{{.*}}pack_array193func.func @_QPtest_allocatable_var(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "l"}, %arg2: !fir.ref<i32> {fir.bindc_name = "u"}) {194  %c0 = arith.constant 0 : index195  %c1 = arith.constant 1 : index196  %0 = fir.dummy_scope : !fir.dscope197  %1 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFtest_allocatable_varEl"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>198  %2 = fir.declare %arg2 dummy_scope %0 {uniq_name = "_QFtest_allocatable_varEu"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>199  %3 = fir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest_allocatable_varEx"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.dscope) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>200  %4 = fir.load %3 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>201  %5 = fir.load %1 : !fir.ref<i32>202  %6 = fir.load %2 : !fir.ref<i32>203  %7 = fir.convert %5 : (i32) -> index204  %8 = fir.convert %6 : (i32) -> index205  %9 = fir.box_addr %4 : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>206  %10:3 = fir.box_dims %4, %c0 : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)207  %11 = fir.shape_shift %10#0, %10#1 : (index, index) -> !fir.shapeshift<1>208  %12 = fir.slice %7, %8, %c1 : (index, index, index) -> !fir.slice<1>209  %13 = fir.embox %9(%11) [%12] : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>210  %14 = fir.dummy_scope : !fir.dscope211  %15 = fir.pack_array %13 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>212  %16 = fir.declare %15 dummy_scope %14 {uniq_name = "_QFtest_allocatable_varFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>213  fir.unpack_array %15 to %13 heap : !fir.box<!fir.array<?xf32>>214  return215}216 217// subroutine test_allocatable_full(x)218//   real, allocatable :: x(:,:)219//   call repack(x(:,:))220// contains221//   subroutine repack(x)222//     real :: x(:,:)223//   end subroutine repack224// end subroutine test_allocatable_full225//226// CHECK-LABEL:   func.func @_QPtest_allocatable_full(227// CHECK-NOT: fir.{{.*}}pack_array228func.func @_QPtest_allocatable_full(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>> {fir.bindc_name = "x"}) {229  %c1 = arith.constant 1 : index230  %c0 = arith.constant 0 : index231  %0 = fir.dummy_scope : !fir.dscope232  %1 = fir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest_allocatable_fullEx"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>, !fir.dscope) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>233  %2 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>234  %3:3 = fir.box_dims %2, %c0 : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>, index) -> (index, index, index)235  %4:3 = fir.box_dims %2, %c1 : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>, index) -> (index, index, index)236  %5 = arith.addi %3#0, %3#1 : index237  %6 = arith.subi %5, %c1 : index238  %7 = arith.addi %4#0, %4#1 : index239  %8 = arith.subi %7, %c1 : index240  %9 = fir.box_addr %2 : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>) -> !fir.heap<!fir.array<?x?xf32>>241  %10 = fir.shape_shift %3#0, %3#1, %4#0, %4#1 : (index, index, index, index) -> !fir.shapeshift<2>242  %11 = fir.slice %3#0, %6, %c1, %4#0, %8, %c1 : (index, index, index, index, index, index) -> !fir.slice<2>243  %12 = fir.embox %9(%10) [%11] : (!fir.heap<!fir.array<?x?xf32>>, !fir.shapeshift<2>, !fir.slice<2>) -> !fir.box<!fir.array<?x?xf32>>244  %13 = fir.dummy_scope : !fir.dscope245  %14 = fir.pack_array %12 heap innermost : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<!fir.array<?x?xf32>>246  %15 = fir.declare %14 dummy_scope %13 {uniq_name = "_QFtest_allocatable_fullFrepackEx"} : (!fir.box<!fir.array<?x?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xf32>>247  fir.unpack_array %14 to %12 heap : !fir.box<!fir.array<?x?xf32>>248  return249}250 251// subroutine test_explicit_shape_cst_chain(x)252//   real :: x(100)253//   call repack(x(1:50))254// contains255//   subroutine repack(x)256//     use inner257//     real :: x(:)258//     call inner_repack1(x)259//   end subroutine repack260// end subroutine test_explicit_shape_cst_chain261//262// CHECK-LABEL:   func.func @_QPtest_explicit_shape_cst_chain(263// CHECK-NOT: fir.{{.*}}pack_array264func.func @_QPtest_explicit_shape_cst_chain(%arg0: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "x"}) {265  %c50 = arith.constant 50 : index266  %c1 = arith.constant 1 : index267  %c100 = arith.constant 100 : index268  %0 = fir.dummy_scope : !fir.dscope269  %1 = fir.shape %c100 : (index) -> !fir.shape<1>270  %2 = fir.declare %arg0(%1) dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_cst_chainEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<100xf32>>271  %3 = fir.shape %c50 : (index) -> !fir.shape<1>272  %4 = fir.array_coor %2(%1) %c1 : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>273  %5 = fir.convert %4 : (!fir.ref<f32>) -> !fir.ref<!fir.array<50xf32>>274  %6 = fir.embox %5(%3) : (!fir.ref<!fir.array<50xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<50xf32>>275  %7 = fir.convert %6 : (!fir.box<!fir.array<50xf32>>) -> !fir.box<!fir.array<?xf32>>276  %8 = fir.dummy_scope : !fir.dscope277  %9 = fir.pack_array %7 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>278  %10 = fir.declare %9 dummy_scope %8 {uniq_name = "_QFtest_explicit_shape_cst_chainFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>279  %11 = fir.rebox %10 : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>280  %12 = fir.dummy_scope : !fir.dscope281  %13 = fir.pack_array %11 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>282  %14 = fir.declare %13 dummy_scope %12 {uniq_name = "_QMinnerFinner_repack1Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>283  fir.unpack_array %13 to %11 heap : !fir.box<!fir.array<?xf32>>284  fir.unpack_array %9 to %7 heap : !fir.box<!fir.array<?xf32>>285  return286}287 288// subroutine test_explicit_shape_var_chain(x, n, l, u)289//   integer :: n, l, u290//   real :: x(n)291//   call repack(x(l:u))292// contains293//   subroutine repack(x)294//     use inner295//     real :: x(:)296//     call inner_repack1(x)297//   end subroutine repack298// end subroutine test_explicit_shape_var_chain299//300// CHECK-LABEL:   func.func @_QPtest_explicit_shape_var_chain(301// CHECK-NOT: fir.{{.*}}pack_array302func.func @_QPtest_explicit_shape_var_chain(%arg0: !fir.ref<!fir.array<?xf32>> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "n"}, %arg2: !fir.ref<i32> {fir.bindc_name = "l"}, %arg3: !fir.ref<i32> {fir.bindc_name = "u"}) {303  %c1 = arith.constant 1 : index304  %c0 = arith.constant 0 : index305  %0 = fir.dummy_scope : !fir.dscope306  %1 = fir.declare %arg2 dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_var_chainEl"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>307  %2 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_var_chainEn"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>308  %3 = fir.declare %arg3 dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_var_chainEu"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>309  %4 = fir.load %2 : !fir.ref<i32>310  %5 = fir.convert %4 : (i32) -> index311  %6 = arith.cmpi sgt, %5, %c0 : index312  %7 = arith.select %6, %5, %c0 : index313  %8 = fir.shape %7 : (index) -> !fir.shape<1>314  %9 = fir.declare %arg0(%8) dummy_scope %0 {uniq_name = "_QFtest_explicit_shape_var_chainEx"} : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<?xf32>>315  %10 = fir.load %1 : !fir.ref<i32>316  %11 = fir.load %3 : !fir.ref<i32>317  %12 = fir.convert %10 : (i32) -> index318  %13 = fir.convert %11 : (i32) -> index319  %14 = fir.slice %12, %13, %c1 : (index, index, index) -> !fir.slice<1>320  %15 = fir.embox %9(%8) [%14] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>321  %16 = fir.dummy_scope : !fir.dscope322  %17 = fir.pack_array %15 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>323  %18 = fir.declare %17 dummy_scope %16 {uniq_name = "_QFtest_explicit_shape_var_chainFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>324  %19 = fir.rebox %18 : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>325  %20 = fir.dummy_scope : !fir.dscope326  %21 = fir.pack_array %19 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>327  %22 = fir.declare %21 dummy_scope %20 {uniq_name = "_QMinnerFinner_repack1Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>328  fir.unpack_array %21 to %19 heap : !fir.box<!fir.array<?xf32>>329  fir.unpack_array %17 to %15 heap : !fir.box<!fir.array<?xf32>>330  return331}332 333// subroutine test_assumed_size_cst_chain(x)334//   real :: x(*)335//   call repack(x(1:50))336// contains337//   subroutine repack(x)338//     use inner339//     real :: x(:)340//     call inner_repack1(x)341//   end subroutine repack342// end subroutine test_assumed_size_cst_chain343//344// CHECK-LABEL:   func.func @_QPtest_assumed_size_cst_chain(345// CHECK-NOT: fir.{{.*}}pack_array346func.func @_QPtest_assumed_size_cst_chain(%arg0: !fir.ref<!fir.array<?xf32>> {fir.bindc_name = "x"}) {347  %c50 = arith.constant 50 : index348  %c1 = arith.constant 1 : index349  %c-1 = arith.constant -1 : index350  %0 = fir.dummy_scope : !fir.dscope351  %1 = fir.shape %c-1 : (index) -> !fir.shape<1>352  %2 = fir.declare %arg0(%1) dummy_scope %0 {uniq_name = "_QFtest_assumed_size_cst_chainEx"} : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<?xf32>>353  %3 = fir.shape %c50 : (index) -> !fir.shape<1>354  %4 = fir.array_coor %2(%1) %c1 : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, index) -> !fir.ref<f32>355  %5 = fir.convert %4 : (!fir.ref<f32>) -> !fir.ref<!fir.array<50xf32>>356  %6 = fir.embox %5(%3) : (!fir.ref<!fir.array<50xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<50xf32>>357  %7 = fir.convert %6 : (!fir.box<!fir.array<50xf32>>) -> !fir.box<!fir.array<?xf32>>358  %8 = fir.dummy_scope : !fir.dscope359  %9 = fir.pack_array %7 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>360  %10 = fir.declare %9 dummy_scope %8 {uniq_name = "_QFtest_assumed_size_cst_chainFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>361  %11 = fir.rebox %10 : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>362  %12 = fir.dummy_scope : !fir.dscope363  %13 = fir.pack_array %11 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>364  %14 = fir.declare %13 dummy_scope %12 {uniq_name = "_QMinnerFinner_repack1Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>365  fir.unpack_array %13 to %11 heap : !fir.box<!fir.array<?xf32>>366  fir.unpack_array %9 to %7 heap : !fir.box<!fir.array<?xf32>>367  return368}369 370// subroutine test_assumed_size_var_chain(x, l, u)371//   integer :: l, u372//   real :: x(*)373//   call repack(x(l:u))374// contains375//   subroutine repack(x)376//     use inner377//     real :: x(:)378//     call inner_repack1(x)379//   end subroutine repack380// end subroutine test_assumed_size_var_chain381//382// CHECK-LABEL:   func.func @_QPtest_assumed_size_var_chain(383// CHECK-NOT: fir.{{.*}}pack_array384func.func @_QPtest_assumed_size_var_chain(%arg0: !fir.ref<!fir.array<?xf32>> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "l"}, %arg2: !fir.ref<i32> {fir.bindc_name = "u"}) {385  %c1 = arith.constant 1 : index386  %c-1 = arith.constant -1 : index387  %0 = fir.dummy_scope : !fir.dscope388  %1 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFtest_assumed_size_var_chainEl"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>389  %2 = fir.declare %arg2 dummy_scope %0 {uniq_name = "_QFtest_assumed_size_var_chainEu"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>390  %3 = fir.shape %c-1 : (index) -> !fir.shape<1>391  %4 = fir.declare %arg0(%3) dummy_scope %0 {uniq_name = "_QFtest_assumed_size_var_chainEx"} : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<?xf32>>392  %5 = fir.load %1 : !fir.ref<i32>393  %6 = fir.load %2 : !fir.ref<i32>394  %7 = fir.convert %5 : (i32) -> index395  %8 = fir.convert %6 : (i32) -> index396  %9 = fir.slice %7, %8, %c1 : (index, index, index) -> !fir.slice<1>397  %10 = fir.embox %4(%3) [%9] : (!fir.ref<!fir.array<?xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>398  %11 = fir.dummy_scope : !fir.dscope399  %12 = fir.pack_array %10 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>400  %13 = fir.declare %12 dummy_scope %11 {uniq_name = "_QFtest_assumed_size_var_chainFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>401  %14 = fir.rebox %13 : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>402  %15 = fir.dummy_scope : !fir.dscope403  %16 = fir.pack_array %14 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>404  %17 = fir.declare %16 dummy_scope %15 {uniq_name = "_QMinnerFinner_repack1Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>405  fir.unpack_array %16 to %14 heap : !fir.box<!fir.array<?xf32>>406  fir.unpack_array %12 to %10 heap : !fir.box<!fir.array<?xf32>>407  return408}409 410// subroutine test_allocatable_cst_chain(x)411//   real, allocatable :: x(:)412//   call repack(x(10:50))413// contains414//   subroutine repack(x)415//     use inner416//     real :: x(:)417//     call inner_repack1(x)418//   end subroutine repack419// end subroutine test_allocatable_cst_chain420//421// CHECK-LABEL:   func.func @_QPtest_allocatable_cst_chain(422// CHECK-NOT: fir.{{.*}}pack_array423func.func @_QPtest_allocatable_cst_chain(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {fir.bindc_name = "x"}) {424  %c0 = arith.constant 0 : index425  %c41 = arith.constant 41 : index426  %c10 = arith.constant 10 : index427  %0 = fir.dummy_scope : !fir.dscope428  %1 = fir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest_allocatable_cst_chainEx"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.dscope) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>429  %2 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>430  %3 = fir.shape %c41 : (index) -> !fir.shape<1>431  %4 = fir.box_addr %2 : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>432  %5:3 = fir.box_dims %2, %c0 : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)433  %6 = fir.shape_shift %5#0, %5#1 : (index, index) -> !fir.shapeshift<1>434  %7 = fir.array_coor %4(%6) %c10 : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, index) -> !fir.ref<f32>435  %8 = fir.convert %7 : (!fir.ref<f32>) -> !fir.ref<!fir.array<41xf32>>436  %9 = fir.embox %8(%3) : (!fir.ref<!fir.array<41xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<41xf32>>437  %10 = fir.convert %9 : (!fir.box<!fir.array<41xf32>>) -> !fir.box<!fir.array<?xf32>>438  %11 = fir.dummy_scope : !fir.dscope439  %12 = fir.pack_array %10 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>440  %13 = fir.declare %12 dummy_scope %11 {uniq_name = "_QFtest_allocatable_cst_chainFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>441  %14 = fir.rebox %13 : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>442  %15 = fir.dummy_scope : !fir.dscope443  %16 = fir.pack_array %14 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>444  %17 = fir.declare %16 dummy_scope %15 {uniq_name = "_QMinnerFinner_repack1Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>445  fir.unpack_array %16 to %14 heap : !fir.box<!fir.array<?xf32>>446  fir.unpack_array %12 to %10 heap : !fir.box<!fir.array<?xf32>>447  return448}449 450// subroutine test_allocatable_var_chain(x, l, u)451//   integer :: l, u452//   real, allocatable :: x(:)453//   call repack(x(l:u))454// contains455//   subroutine repack(x)456//     use inner457//     real :: x(:)458//     call inner_repack1(x)459//   end subroutine repack460// end subroutine test_allocatable_var_chain461//462// CHECK-LABEL:   func.func @_QPtest_allocatable_var_chain(463// CHECK-NOT: fir.{{.*}}pack_array464func.func @_QPtest_allocatable_var_chain(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "l"}, %arg2: !fir.ref<i32> {fir.bindc_name = "u"}) {465  %c0 = arith.constant 0 : index466  %c1 = arith.constant 1 : index467  %0 = fir.dummy_scope : !fir.dscope468  %1 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFtest_allocatable_var_chainEl"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>469  %2 = fir.declare %arg2 dummy_scope %0 {uniq_name = "_QFtest_allocatable_var_chainEu"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>470  %3 = fir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest_allocatable_var_chainEx"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>, !fir.dscope) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>471  %4 = fir.load %3 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>472  %5 = fir.load %1 : !fir.ref<i32>473  %6 = fir.load %2 : !fir.ref<i32>474  %7 = fir.convert %5 : (i32) -> index475  %8 = fir.convert %6 : (i32) -> index476  %9 = fir.box_addr %4 : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>477  %10:3 = fir.box_dims %4, %c0 : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)478  %11 = fir.shape_shift %10#0, %10#1 : (index, index) -> !fir.shapeshift<1>479  %12 = fir.slice %7, %8, %c1 : (index, index, index) -> !fir.slice<1>480  %13 = fir.embox %9(%11) [%12] : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>481  %14 = fir.dummy_scope : !fir.dscope482  %15 = fir.pack_array %13 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>483  %16 = fir.declare %15 dummy_scope %14 {uniq_name = "_QFtest_allocatable_var_chainFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>484  %17 = fir.rebox %16 : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>485  %18 = fir.dummy_scope : !fir.dscope486  %19 = fir.pack_array %17 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>487  %20 = fir.declare %19 dummy_scope %18 {uniq_name = "_QMinnerFinner_repack1Ex"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>488  fir.unpack_array %19 to %17 heap : !fir.box<!fir.array<?xf32>>489  fir.unpack_array %15 to %13 heap : !fir.box<!fir.array<?xf32>>490  return491}492 493// subroutine test_allocatable_full_chain(x)494//   real, allocatable :: x(:,:)495//   call repack(x(:,:))496// contains497//   subroutine repack(x)498//     use inner499//     real :: x(:,:)500//     call inner_repack2(x)501//   end subroutine repack502// end subroutine test_allocatable_full_chain503//504// CHECK-LABEL:   func.func @_QPtest_allocatable_full_chain(505// CHECK-NOT: fir.{{.*}}pack_array506func.func @_QPtest_allocatable_full_chain(%arg0: !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>> {fir.bindc_name = "x"}) {507  %c1 = arith.constant 1 : index508  %c0 = arith.constant 0 : index509  %0 = fir.dummy_scope : !fir.dscope510  %1 = fir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest_allocatable_full_chainEx"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>, !fir.dscope) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>511  %2 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>512  %3:3 = fir.box_dims %2, %c0 : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>, index) -> (index, index, index)513  %4:3 = fir.box_dims %2, %c1 : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>, index) -> (index, index, index)514  %5 = arith.addi %3#0, %3#1 : index515  %6 = arith.subi %5, %c1 : index516  %7 = arith.addi %4#0, %4#1 : index517  %8 = arith.subi %7, %c1 : index518  %9 = fir.box_addr %2 : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>) -> !fir.heap<!fir.array<?x?xf32>>519  %10 = fir.shape_shift %3#0, %3#1, %4#0, %4#1 : (index, index, index, index) -> !fir.shapeshift<2>520  %11 = fir.slice %3#0, %6, %c1, %4#0, %8, %c1 : (index, index, index, index, index, index) -> !fir.slice<2>521  %12 = fir.embox %9(%10) [%11] : (!fir.heap<!fir.array<?x?xf32>>, !fir.shapeshift<2>, !fir.slice<2>) -> !fir.box<!fir.array<?x?xf32>>522  %13 = fir.dummy_scope : !fir.dscope523  %14 = fir.pack_array %12 heap innermost : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<!fir.array<?x?xf32>>524  %15 = fir.declare %14 dummy_scope %13 {uniq_name = "_QFtest_allocatable_full_chainFrepackEx"} : (!fir.box<!fir.array<?x?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xf32>>525  %16 = fir.rebox %15 : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<!fir.array<?x?xf32>>526  %17 = fir.dummy_scope : !fir.dscope527  %18 = fir.pack_array %16 heap innermost : (!fir.box<!fir.array<?x?xf32>>) -> !fir.box<!fir.array<?x?xf32>>528  %19 = fir.declare %18 dummy_scope %17 {uniq_name = "_QMinnerFinner_repack2Ex"} : (!fir.box<!fir.array<?x?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xf32>>529  fir.unpack_array %18 to %16 heap : !fir.box<!fir.array<?x?xf32>>530  fir.unpack_array %14 to %12 heap : !fir.box<!fir.array<?x?xf32>>531  return532}533 534// TODO: if both fir.pack_array have the same property,535// then the second one is redundant, because the first536// repack makes 'x' contiguous.537// subroutine neg_test_assumed_shape(x)538//   real :: x(:)539//   call repack(x(1:50))540// contains541//   subroutine repack(x)542//     real :: x(:)543//   end subroutine repack544// end subroutine neg_test_assumed_shape545//546// CHECK-LABEL:   func.func @_QPneg_test_assumed_shape(547// CHECK: fir.pack_array548// CHECK: fir.pack_array549// CHECK: fir.unpack_array550// CHECK: fir.unpack_array551func.func @_QPneg_test_assumed_shape(%arg0: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {552  %c50 = arith.constant 50 : index553  %c1 = arith.constant 1 : index554  %0 = fir.dummy_scope : !fir.dscope555  %1 = fir.pack_array %arg0 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>556  %2 = fir.declare %1 dummy_scope %0 {uniq_name = "_QFneg_test_assumed_shapeEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>557  %3 = fir.rebox %2 : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>558  %4 = fir.slice %c1, %c50, %c1 : (index, index, index) -> !fir.slice<1>559  %5 = fir.rebox %3 [%4] : (!fir.box<!fir.array<?xf32>>, !fir.slice<1>) -> !fir.box<!fir.array<50xf32>>560  %6 = fir.convert %5 : (!fir.box<!fir.array<50xf32>>) -> !fir.box<!fir.array<?xf32>>561  %7 = fir.dummy_scope : !fir.dscope562  %8 = fir.pack_array %6 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>563  %9 = fir.declare %8 dummy_scope %7 {uniq_name = "_QFneg_test_assumed_shapeFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>564  fir.unpack_array %8 to %6 heap : !fir.box<!fir.array<?xf32>>565  fir.unpack_array %1 to %arg0 heap : !fir.box<!fir.array<?xf32>>566  return567}568 569// subroutine neg_test_non_contig_slice_cst(x)570//   real :: x(100)571//   call repack(x(1:50:2))572// contains573//   subroutine repack(x)574//     real :: x(:)575//   end subroutine repack576// end subroutine neg_test_non_contig_slice_cst577//578// CHECK-LABEL:   func.func @_QPneg_test_non_contig_slice_cst(579// CHECK: fir.pack_array580// CHECK: fir.unpack_array581func.func @_QPneg_test_non_contig_slice_cst(%arg0: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "x"}) {582  %c2 = arith.constant 2 : index583  %c50 = arith.constant 50 : index584  %c1 = arith.constant 1 : index585  %c100 = arith.constant 100 : index586  %0 = fir.dummy_scope : !fir.dscope587  %1 = fir.shape %c100 : (index) -> !fir.shape<1>588  %2 = fir.declare %arg0(%1) dummy_scope %0 {uniq_name = "_QFneg_test_non_contig_slice_cstEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<100xf32>>589  %3 = fir.slice %c1, %c50, %c2 : (index, index, index) -> !fir.slice<1>590  %4 = fir.embox %2(%1) [%3] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<25xf32>>591  %5 = fir.convert %4 : (!fir.box<!fir.array<25xf32>>) -> !fir.box<!fir.array<?xf32>>592  %6 = fir.dummy_scope : !fir.dscope593  %7 = fir.pack_array %5 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>594  %8 = fir.declare %7 dummy_scope %6 {uniq_name = "_QFneg_test_non_contig_slice_cstFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>595  fir.unpack_array %7 to %5 heap : !fir.box<!fir.array<?xf32>>596  return597}598 599// subroutine neg_test_non_contig_slice_var(x, s)600//   integer :: s601//   real :: x(100)602//   call repack(x(1:50:s))603// contains604//   subroutine repack(x)605//     real :: x(:)606//   end subroutine repack607// end subroutine neg_test_non_contig_slice_var608//609// CHECK-LABEL:   func.func @_QPneg_test_non_contig_slice_var(610// CHECK: fir.pack_array611// CHECK: fir.unpack_array612func.func @_QPneg_test_non_contig_slice_var(%arg0: !fir.ref<!fir.array<100xf32>> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "s"}) {613  %c50 = arith.constant 50 : index614  %c1 = arith.constant 1 : index615  %c100 = arith.constant 100 : index616  %0 = fir.dummy_scope : !fir.dscope617  %1 = fir.declare %arg1 dummy_scope %0 {uniq_name = "_QFneg_test_non_contig_slice_varEs"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>618  %2 = fir.shape %c100 : (index) -> !fir.shape<1>619  %3 = fir.declare %arg0(%2) dummy_scope %0 {uniq_name = "_QFneg_test_non_contig_slice_varEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.dscope) -> !fir.ref<!fir.array<100xf32>>620  %4 = fir.load %1 : !fir.ref<i32>621  %5 = fir.convert %4 : (i32) -> index622  %6 = fir.slice %c1, %c50, %5 : (index, index, index) -> !fir.slice<1>623  %7 = fir.embox %3(%2) [%6] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<?xf32>>624  %8 = fir.dummy_scope : !fir.dscope625  %9 = fir.pack_array %7 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>626  %10 = fir.declare %9 dummy_scope %8 {uniq_name = "_QFneg_test_non_contig_slice_varFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>627  fir.unpack_array %9 to %7 heap : !fir.box<!fir.array<?xf32>>628  return629}630 631// subroutine neg_test_pointer(x)632//   real, pointer :: x(:)633//   call repack(x(1:50))634// contains635//   subroutine repack(x)636//     real :: x(:)637//   end subroutine repack638// end subroutine neg_test_pointer639//640// CHECK-LABEL:   func.func @_QPneg_test_pointer(641// CHECK: fir.pack_array642// CHECK: fir.unpack_array643func.func @_QPneg_test_pointer(%arg0: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> {fir.bindc_name = "x"}) {644  %c0 = arith.constant 0 : index645  %c50 = arith.constant 50 : index646  %c1 = arith.constant 1 : index647  %0 = fir.dummy_scope : !fir.dscope648  %1 = fir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFneg_test_pointerEx"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>, !fir.dscope) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>649  %2 = fir.load %1 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>650  %3:3 = fir.box_dims %2, %c0 : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index)651  %4 = fir.shift %3#0 : (index) -> !fir.shift<1>652  %5 = fir.slice %c1, %c50, %c1 : (index, index, index) -> !fir.slice<1>653  %6 = fir.rebox %2(%4) [%5] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, !fir.shift<1>, !fir.slice<1>) -> !fir.box<!fir.array<50xf32>>654  %7 = fir.convert %6 : (!fir.box<!fir.array<50xf32>>) -> !fir.box<!fir.array<?xf32>>655  %8 = fir.dummy_scope : !fir.dscope656  %9 = fir.pack_array %7 heap whole : (!fir.box<!fir.array<?xf32>>) -> !fir.box<!fir.array<?xf32>>657  %10 = fir.declare %9 dummy_scope %8 {uniq_name = "_QFneg_test_pointerFrepackEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>658  fir.unpack_array %9 to %7 heap : !fir.box<!fir.array<?xf32>>659  return660}661 662// Test a long chain of fir.pack_array operations.663// The rewriter used to use a down-top traversal that optimized664// fir.pack_array operations starting from the innermost one.665// The rewriter did not converge in 10 (default) iterations666// causing the pass to report a failure.667// A top-down traversal should fix this an allow optimizing668// all the repackings.669// CHECK-LABEL:   func.func @test_long_chain(670// CHECK-NOT: fir.pack_array671// CHECK-NOT: fir.unpack_array672func.func @test_long_chain(%pred: i1) {673  %c10 = arith.constant 10 : index674  %3 = fir.dummy_scope : !fir.dscope675  %4 = fir.address_of(@aaa) : !fir.ref<!fir.array<10x10xi32>>676  %5 = fir.shape %c10, %c10 : (index, index) -> !fir.shape<2>677  %6 = fir.declare %4(%5) {uniq_name = "aaa"} : (!fir.ref<!fir.array<10x10xi32>>, !fir.shape<2>) -> !fir.ref<!fir.array<10x10xi32>>678  %9 = fir.embox %6(%5) : (!fir.ref<!fir.array<10x10xi32>>, !fir.shape<2>) -> !fir.box<!fir.array<10x10xi32>>679  %10 = fir.convert %9 : (!fir.box<!fir.array<10x10xi32>>) -> !fir.box<!fir.array<?x?xi32>>680  %11 = fir.dummy_scope : !fir.dscope681  %12 = fir.pack_array %10 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>682  %13 = fir.declare %12 dummy_scope %11 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>683  %14 = fir.rebox %13 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>684  cf.cond_br %pred, ^bb17, ^bb1685^bb1:  // pred: ^bb0686  %20 = fir.dummy_scope : !fir.dscope687  %21 = fir.pack_array %14 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>688  %22 = fir.declare %21 dummy_scope %20 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>689  %23 = fir.rebox %22 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>690  %28 = fir.dummy_scope : !fir.dscope691  %29 = fir.pack_array %23 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>692  %30 = fir.declare %29 dummy_scope %28 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>693  %31 = fir.rebox %30 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>694  cf.cond_br %pred, ^bb16, ^bb2695^bb2:  // pred: ^bb1696  %37 = fir.dummy_scope : !fir.dscope697  %38 = fir.pack_array %31 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>698  %39 = fir.declare %38 dummy_scope %37 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>699  %40 = fir.rebox %39 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>700  %45 = fir.dummy_scope : !fir.dscope701  %46 = fir.pack_array %40 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>702  %47 = fir.declare %46 dummy_scope %45 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>703  %48 = fir.rebox %47 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>704  cf.cond_br %pred, ^bb15, ^bb3705^bb3:  // pred: ^bb2706  %54 = fir.dummy_scope : !fir.dscope707  %55 = fir.pack_array %48 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>708  %56 = fir.declare %55 dummy_scope %54 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>709  %57 = fir.rebox %56 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>710  %62 = fir.dummy_scope : !fir.dscope711  %63 = fir.pack_array %57 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>712  %64 = fir.declare %63 dummy_scope %62 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>713  %65 = fir.rebox %64 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>714  cf.cond_br %pred, ^bb14, ^bb4715^bb4:  // pred: ^bb3716  %71 = fir.dummy_scope : !fir.dscope717  %72 = fir.pack_array %65 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>718  %73 = fir.declare %72 dummy_scope %71 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>719  %74 = fir.rebox %73 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>720  %79 = fir.dummy_scope : !fir.dscope721  %80 = fir.pack_array %74 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>722  %81 = fir.declare %80 dummy_scope %79 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>723  %82 = fir.rebox %81 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>724  cf.cond_br %pred, ^bb13, ^bb5725^bb5:  // pred: ^bb4726  %88 = fir.dummy_scope : !fir.dscope727  %89 = fir.pack_array %82 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>728  %90 = fir.declare %89 dummy_scope %88 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>729  %91 = fir.rebox %90 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>730  %96 = fir.dummy_scope : !fir.dscope731  %97 = fir.pack_array %91 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>732  %98 = fir.declare %97 dummy_scope %96 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>733  %99 = fir.rebox %98 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>734  cf.cond_br %pred, ^bb12, ^bb6735^bb6:  // pred: ^bb5736  %105 = fir.dummy_scope : !fir.dscope737  %106 = fir.pack_array %99 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>738  %107 = fir.declare %106 dummy_scope %105 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>739  %108 = fir.rebox %107 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>740  %113 = fir.dummy_scope : !fir.dscope741  %114 = fir.pack_array %108 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>742  %115 = fir.declare %114 dummy_scope %113 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>743  %116 = fir.rebox %115 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>744  cf.cond_br %pred, ^bb11, ^bb7745^bb7:  // pred: ^bb6746  %122 = fir.dummy_scope : !fir.dscope747  %123 = fir.pack_array %116 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>748  %124 = fir.declare %123 dummy_scope %122 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>749  %125 = fir.rebox %124 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>750  %130 = fir.dummy_scope : !fir.dscope751  %131 = fir.pack_array %125 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>752  %132 = fir.declare %131 dummy_scope %130 {uniq_name = "aaa"} : (!fir.box<!fir.array<?x?xi32>>, !fir.dscope) -> !fir.box<!fir.array<?x?xi32>>753  %133 = fir.rebox %132 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>754  cf.cond_br %pred, ^bb9, ^bb8755^bb8:  // pred: ^bb7756  %139 = fir.dummy_scope : !fir.dscope757  %140 = fir.pack_array %133 heap innermost : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<!fir.array<?x?xi32>>758  fir.unpack_array %140 to %133 heap : !fir.box<!fir.array<?x?xi32>>759  cf.br ^bb9760^bb9:  // 2 preds: ^bb7, ^bb8761  fir.unpack_array %131 to %125 heap : !fir.box<!fir.array<?x?xi32>>762  cf.br ^bb10763^bb10:  // pred: ^bb9764  fir.unpack_array %123 to %116 heap : !fir.box<!fir.array<?x?xi32>>765  cf.br ^bb11766^bb11:  // 2 preds: ^bb6, ^bb10767  fir.unpack_array %114 to %108 heap : !fir.box<!fir.array<?x?xi32>>768  fir.unpack_array %106 to %99 heap : !fir.box<!fir.array<?x?xi32>>769  cf.br ^bb12770^bb12:  // 2 preds: ^bb5, ^bb11771  fir.unpack_array %97 to %91 heap : !fir.box<!fir.array<?x?xi32>>772  fir.unpack_array %89 to %82 heap : !fir.box<!fir.array<?x?xi32>>773  cf.br ^bb13774^bb13:  // 2 preds: ^bb4, ^bb12775  fir.unpack_array %80 to %74 heap : !fir.box<!fir.array<?x?xi32>>776  fir.unpack_array %72 to %65 heap : !fir.box<!fir.array<?x?xi32>>777  cf.br ^bb14778^bb14:  // 2 preds: ^bb3, ^bb13779  fir.unpack_array %63 to %57 heap : !fir.box<!fir.array<?x?xi32>>780  fir.unpack_array %55 to %48 heap : !fir.box<!fir.array<?x?xi32>>781  cf.br ^bb15782^bb15:  // 2 preds: ^bb2, ^bb14783  fir.unpack_array %46 to %40 heap : !fir.box<!fir.array<?x?xi32>>784  fir.unpack_array %38 to %31 heap : !fir.box<!fir.array<?x?xi32>>785  cf.br ^bb16786^bb16:  // 2 preds: ^bb1, ^bb15787  fir.unpack_array %29 to %23 heap : !fir.box<!fir.array<?x?xi32>>788  fir.unpack_array %21 to %14 heap : !fir.box<!fir.array<?x?xi32>>789  cf.br ^bb17790^bb17:  // 2 preds: ^bb0, ^bb16791  fir.unpack_array %12 to %10 heap : !fir.box<!fir.array<?x?xi32>>792  return793}794