|
| 1 | +// RUN: fir-opt --opt-bufferization %s | FileCheck %s |
| 2 | + |
| 3 | +// leslie3d case with two allocatable module variables |
| 4 | +// that cannot alias: |
| 5 | +// module les3d_data |
| 6 | +// implicit real*8 (a-h,o-z) |
| 7 | +// integer imax, jmax, kmax |
| 8 | +// double precision,allocatable,dimension(:,:,:,:,:) :: q |
| 9 | +// double precision,allocatable,dimension(:,:,:,:) :: du |
| 10 | +// end module les3d_data |
| 11 | +// subroutine update() |
| 12 | +// use les3d_data |
| 13 | +// implicit real*8(a-h,o-z) |
| 14 | +// i2 = imax - 1 |
| 15 | +// do k = 1, kmax - 1 |
| 16 | +// do j = 1, jmax - 1 |
| 17 | +// q(1:i2,j,k,1,m) = (q(1:i2,j,k,1,m) + du(1:i2,j,k,1)) |
| 18 | +// end do |
| 19 | +// end do |
| 20 | +// end subroutine update |
| 21 | + |
| 22 | +func.func @_QPupdate() { |
| 23 | + %c1 = arith.constant 1 : index |
| 24 | + %c0 = arith.constant 0 : index |
| 25 | + %c1_i32 = arith.constant 1 : i32 |
| 26 | + %0 = fir.address_of(@_QMles3d_dataEdu) : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?xf64>>>> |
| 27 | + %1:2 = hlfir.declare %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMles3d_dataEdu"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?xf64>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?xf64>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?xf64>>>>) |
| 28 | + %2 = fir.alloca i32 {bindc_name = "i2", uniq_name = "_QFupdateEi2"} |
| 29 | + %3:2 = hlfir.declare %2 {uniq_name = "_QFupdateEi2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 30 | + %4 = fir.address_of(@_QMles3d_dataEimax) : !fir.ref<i32> |
| 31 | + %5:2 = hlfir.declare %4 {uniq_name = "_QMles3d_dataEimax"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 32 | + %6 = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFupdateEj"} |
| 33 | + %7:2 = hlfir.declare %6 {uniq_name = "_QFupdateEj"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 34 | + %8 = fir.address_of(@_QMles3d_dataEjmax) : !fir.ref<i32> |
| 35 | + %9:2 = hlfir.declare %8 {uniq_name = "_QMles3d_dataEjmax"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 36 | + %10 = fir.alloca i32 {bindc_name = "k", uniq_name = "_QFupdateEk"} |
| 37 | + %11:2 = hlfir.declare %10 {uniq_name = "_QFupdateEk"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 38 | + %12 = fir.address_of(@_QMles3d_dataEkmax) : !fir.ref<i32> |
| 39 | + %13:2 = hlfir.declare %12 {uniq_name = "_QMles3d_dataEkmax"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 40 | + %14 = fir.alloca i32 {bindc_name = "m", uniq_name = "_QFupdateEm"} |
| 41 | + %15:2 = hlfir.declare %14 {uniq_name = "_QFupdateEm"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 42 | + %16 = fir.address_of(@_QMles3d_dataEq) : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?x?xf64>>>> |
| 43 | + %17:2 = hlfir.declare %16 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMles3d_dataEq"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?x?xf64>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?x?xf64>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?x?xf64>>>>) |
| 44 | + %18 = fir.load %5#0 : !fir.ref<i32> |
| 45 | + %19 = arith.subi %18, %c1_i32 : i32 |
| 46 | + hlfir.assign %19 to %3#0 : i32, !fir.ref<i32> |
| 47 | + %20 = fir.load %13#0 : !fir.ref<i32> |
| 48 | + %21 = arith.subi %20, %c1_i32 : i32 |
| 49 | + %22 = fir.convert %21 : (i32) -> index |
| 50 | + %23 = fir.convert %c1 : (index) -> i32 |
| 51 | + %24:2 = fir.do_loop %arg0 = %c1 to %22 step %c1 iter_args(%arg1 = %23) -> (index, i32) { |
| 52 | + fir.store %arg1 to %11#1 : !fir.ref<i32> |
| 53 | + %25 = fir.load %9#0 : !fir.ref<i32> |
| 54 | + %26 = arith.subi %25, %c1_i32 : i32 |
| 55 | + %27 = fir.convert %26 : (i32) -> index |
| 56 | + %28:2 = fir.do_loop %arg2 = %c1 to %27 step %c1 iter_args(%arg3 = %23) -> (index, i32) { |
| 57 | + fir.store %arg3 to %7#1 : !fir.ref<i32> |
| 58 | + %32 = fir.load %17#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?x?xf64>>>> |
| 59 | + %33 = fir.load %3#0 : !fir.ref<i32> |
| 60 | + %34 = fir.convert %33 : (i32) -> index |
| 61 | + %35 = arith.cmpi sgt, %34, %c0 : index |
| 62 | + %36 = arith.select %35, %34, %c0 : index |
| 63 | + %37 = fir.load %7#0 : !fir.ref<i32> |
| 64 | + %38 = fir.convert %37 : (i32) -> i64 |
| 65 | + %39 = fir.load %11#0 : !fir.ref<i32> |
| 66 | + %40 = fir.convert %39 : (i32) -> i64 |
| 67 | + %41 = fir.load %15#0 : !fir.ref<i32> |
| 68 | + %42 = fir.convert %41 : (i32) -> i64 |
| 69 | + %43 = fir.shape %36 : (index) -> !fir.shape<1> |
| 70 | + %44 = hlfir.designate %32 (%c1:%34:%c1, %38, %40, %c1, %42) shape %43 : (!fir.box<!fir.heap<!fir.array<?x?x?x?x?xf64>>>, index, index, index, i64, i64, index, i64, !fir.shape<1>) -> !fir.box<!fir.array<?xf64>> |
| 71 | + %45 = fir.load %1#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?x?x?xf64>>>> |
| 72 | + %46 = hlfir.designate %45 (%c1:%34:%c1, %38, %40, %c1) shape %43 : (!fir.box<!fir.heap<!fir.array<?x?x?x?xf64>>>, index, index, index, i64, i64, index, !fir.shape<1>) -> !fir.box<!fir.array<?xf64>> |
| 73 | + %47 = hlfir.elemental %43 unordered : (!fir.shape<1>) -> !hlfir.expr<?xf64> { |
| 74 | + ^bb0(%arg4: index): |
| 75 | + %51 = hlfir.designate %44 (%arg4) : (!fir.box<!fir.array<?xf64>>, index) -> !fir.ref<f64> |
| 76 | + %52 = hlfir.designate %46 (%arg4) : (!fir.box<!fir.array<?xf64>>, index) -> !fir.ref<f64> |
| 77 | + %53 = fir.load %51 : !fir.ref<f64> |
| 78 | + %54 = fir.load %52 : !fir.ref<f64> |
| 79 | + %55 = arith.addf %53, %54 fastmath<fast> : f64 |
| 80 | + %56 = hlfir.no_reassoc %55 : f64 |
| 81 | + hlfir.yield_element %56 : f64 |
| 82 | + } |
| 83 | + hlfir.assign %47 to %44 : !hlfir.expr<?xf64>, !fir.box<!fir.array<?xf64>> |
| 84 | + hlfir.destroy %47 : !hlfir.expr<?xf64> |
| 85 | + %48 = arith.addi %arg2, %c1 : index |
| 86 | + %49 = fir.load %7#1 : !fir.ref<i32> |
| 87 | + %50 = arith.addi %49, %23 : i32 |
| 88 | + fir.result %48, %50 : index, i32 |
| 89 | + } |
| 90 | + fir.store %28#1 to %7#1 : !fir.ref<i32> |
| 91 | + %29 = arith.addi %arg0, %c1 : index |
| 92 | + %30 = fir.load %11#1 : !fir.ref<i32> |
| 93 | + %31 = arith.addi %30, %23 : i32 |
| 94 | + fir.result %29, %31 : index, i32 |
| 95 | + } |
| 96 | + fir.store %24#1 to %11#1 : !fir.ref<i32> |
| 97 | + return |
| 98 | +} |
| 99 | +// CHECK-LABEL: func.func @_QPupdate() { |
| 100 | +// CHECK-NOT: hlfir.assign {{.*}}!fir.box<!fir.array<?xf64>> |
| 101 | +// CHECK: hlfir.assign %{{.*}} to %{{.*}} : f64, !fir.ref<f64> |
| 102 | +// CHECK-NOT: hlfir.assign {{.*}}!fir.box<!fir.array<?xf64>> |
0 commit comments