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 22func.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>> 103