1// RUN: fir-opt %s -opt-bufferization | FileCheck %s 2 3func.func @_QPtest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "array"}, %arg1: !fir.ref<i32> {fir.bindc_name = "val"}, %arg2: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "m"}) { 4 %c0 = arith.constant 0 : index 5 %0:2 = hlfir.declare %arg0 {uniq_name = "_QFtestEarray"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>) 6 %1:2 = hlfir.declare %arg2 {uniq_name = "_QFtestEm"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>) 7 %2:2 = hlfir.declare %arg1 {uniq_name = "_QFtestEval"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 8 %3 = fir.load %2#0 : !fir.ref<i32> 9 %4:3 = fir.box_dims %0#0, %c0 : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) 10 %5 = fir.shape %4#1 : (index) -> !fir.shape<1> 11 %6 = hlfir.elemental %5 unordered : (!fir.shape<1>) -> !hlfir.expr<?x!fir.logical<4>> { 12 ^bb0(%arg3: index): 13 %8 = hlfir.designate %0#0 (%arg3) : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32> 14 %9 = fir.load %8 : !fir.ref<i32> 15 %10 = arith.cmpi sge, %9, %3 : i32 16 %11 = fir.convert %10 : (i1) -> !fir.logical<4> 17 hlfir.yield_element %11 : !fir.logical<4> 18 } 19 %7 = hlfir.maxloc %0#0 mask %6 {fastmath = #arith.fastmath<contract>} : (!fir.box<!fir.array<?xi32>>, !hlfir.expr<?x!fir.logical<4>>) -> !hlfir.expr<1xi32> 20 hlfir.assign %7 to %1#0 : !hlfir.expr<1xi32>, !fir.box<!fir.array<?xi32>> 21 hlfir.destroy %7 : !hlfir.expr<1xi32> 22 hlfir.destroy %6 : !hlfir.expr<?x!fir.logical<4>> 23 return 24} 25// CHECK-LABEL: func.func @_QPtest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "array"}, %arg1: !fir.ref<i32> {fir.bindc_name = "val"}, %arg2: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "m"}) { 26// CHECK-NEXT: %true = arith.constant true 27// CHECK-NEXT: %c-2147483648_i32 = arith.constant -2147483648 : i32 28// CHECK-NEXT: %c1_i32 = arith.constant 1 : i32 29// CHECK-NEXT: %c0 = arith.constant 0 : index 30// CHECK-NEXT: %c1 = arith.constant 1 : index 31// CHECK-NEXT: %c0_i32 = arith.constant 0 : i32 32// CHECK-NEXT: %[[V0:.*]] = fir.alloca i32 33// CHECK-NEXT: %[[RES:.*]] = fir.alloca !fir.array<1xi32> 34// CHECK-NEXT: %[[V1:.*]]:2 = hlfir.declare %arg0 {uniq_name = "_QFtestEarray"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>) 35// CHECK-NEXT: %[[V2:.*]]:2 = hlfir.declare %arg2 {uniq_name = "_QFtestEm"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>) 36// CHECK-NEXT: %[[V3:.*]]:2 = hlfir.declare %arg1 {uniq_name = "_QFtestEval"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 37// CHECK-NEXT: %[[V4:.*]] = fir.load %[[V3]]#0 : !fir.ref<i32> 38// CHECK-NEXT: %[[V8:.*]] = hlfir.designate %[[RES]] (%c1) : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32> 39// CHECK-NEXT: fir.store %c0_i32 to %[[V8]] : !fir.ref<i32> 40// CHECK-NEXT: fir.store %c0_i32 to %[[V0]] : !fir.ref<i32> 41// CHECK-NEXT: %[[V9:.*]]:3 = fir.box_dims %[[V1]]#0, %c0 : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) 42// CHECK-NEXT: %[[V10:.*]] = arith.subi %[[V9]]#1, %c1 : index 43// CHECK-NEXT: %[[V11:.*]] = fir.do_loop %arg3 = %c0 to %[[V10]] step %c1 iter_args(%arg4 = %c-2147483648_i32) -> (i32) { 44// CHECK-NEXT: %[[V14:.*]] = arith.addi %arg3, %c1 : index 45// CHECK-NEXT: %[[V15:.*]] = hlfir.designate %[[V1]]#0 (%[[V14]]) : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32> 46// CHECK-NEXT: %[[V16:.*]] = fir.load %[[V15]] : !fir.ref<i32> 47// CHECK-NEXT: %[[V17:.*]] = arith.cmpi sge, %[[V16]], %[[V4]] : i32 48// CHECK-NEXT: %[[V18:.*]] = fir.if %[[V17]] -> (i32) { 49// CHECK-NEXT: %[[ISFIRST:.*]] = fir.load %[[V0]] : !fir.ref<i32> 50// CHECK-NEXT: %[[V19:.*]] = hlfir.designate %[[V1]]#0 (%[[V14]]) : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32> 51// CHECK-NEXT: %[[V20:.*]] = fir.load %[[V19]] : !fir.ref<i32> 52// CHECK-NEXT: %[[V21:.*]] = arith.cmpi sgt, %[[V20]], %arg4 : i32 53// CHECK-NEXT: %[[ISFIRSTL:.*]] = fir.convert %[[ISFIRST]] : (i32) -> i1 54// CHECK-NEXT: %[[ISFIRSTNOT:.*]] = arith.xori %[[ISFIRSTL]], %true : i1 55// CHECK-NEXT: %[[ORCOND:.*]] = arith.ori %[[V21]], %[[ISFIRSTNOT]] : i1 56// CHECK-NEXT: %[[V22:.*]] = fir.if %[[ORCOND]] -> (i32) { 57// CHECK-NEXT: fir.store %c1_i32 to %[[V0]] : !fir.ref<i32> 58// CHECK-NEXT: %[[V23:.*]] = hlfir.designate %[[RES]] (%c1) : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32> 59// CHECK-NEXT: %[[V24:.*]] = fir.convert %[[V14]] : (index) -> i32 60// CHECK-NEXT: fir.store %[[V24]] to %[[V23]] : !fir.ref<i32> 61// CHECK-NEXT: fir.result %[[V20]] : i32 62// CHECK-NEXT: } else { 63// CHECK-NEXT: fir.result %arg4 : i32 64// CHECK-NEXT: } 65// CHECK-NEXT: fir.result %[[V22]] : i32 66// CHECK-NEXT: } else { 67// CHECK-NEXT: fir.result %arg4 : i32 68// CHECK-NEXT: } 69// CHECK-NEXT: fir.result %[[V18]] : i32 70// CHECK-NEXT: } 71// CHECK-NEXT: hlfir.assign %[[RES]] to %[[V2]]#0 : !fir.ref<!fir.array<1xi32>>, !fir.box<!fir.array<?xi32>> 72// CHECK-NEXT: return 73// CHECK-NEXT: } 74 75 76 77func.func @_QPtest_float(%arg0: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "array"}, %arg1: !fir.ref<f32> {fir.bindc_name = "val"}, %arg2: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "m"}) { 78 %c0 = arith.constant 0 : index 79 %0:2 = hlfir.declare %arg0 {uniq_name = "_QFtestEarray"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>) 80 %1:2 = hlfir.declare %arg2 {uniq_name = "_QFtestEm"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>) 81 %2:2 = hlfir.declare %arg1 {uniq_name = "_QFtestEval"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>) 82 %3 = fir.load %2#0 : !fir.ref<f32> 83 %4:3 = fir.box_dims %0#0, %c0 : (!fir.box<!fir.array<?xf32>>, index) -> (index, index, index) 84 %5 = fir.shape %4#1 : (index) -> !fir.shape<1> 85 %6 = hlfir.elemental %5 unordered : (!fir.shape<1>) -> !hlfir.expr<?x!fir.logical<4>> { 86 ^bb0(%arg3: index): 87 %8 = hlfir.designate %0#0 (%arg3) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 88 %9 = fir.load %8 : !fir.ref<f32> 89 %10 = arith.cmpf oge, %9, %3 : f32 90 %11 = fir.convert %10 : (i1) -> !fir.logical<4> 91 hlfir.yield_element %11 : !fir.logical<4> 92 } 93 %7 = hlfir.maxloc %0#0 mask %6 {fastmath = #arith.fastmath<contract>} : (!fir.box<!fir.array<?xf32>>, !hlfir.expr<?x!fir.logical<4>>) -> !hlfir.expr<1xi32> 94 hlfir.assign %7 to %1#0 : !hlfir.expr<1xi32>, !fir.box<!fir.array<?xi32>> 95 hlfir.destroy %7 : !hlfir.expr<1xi32> 96 hlfir.destroy %6 : !hlfir.expr<?x!fir.logical<4>> 97 return 98} 99// CHECK-LABEL: _QPtest_float 100// CHECK: %cst = arith.constant 0xFF800000 : f32 101// CHECK: %[[V11:.*]] = fir.do_loop %arg3 = %c0 to %[[V10:.*]] step %c1 iter_args(%arg4 = %cst) -> (f32) { 102// CHECK-NEXT: %[[V14:.*]] = arith.addi %arg3, %c1 : index 103// CHECK-NEXT: %[[V15:.*]] = hlfir.designate %[[V1:.*]]#0 (%[[V14]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 104// CHECK-NEXT: %[[V16:.*]] = fir.load %[[V15]] : !fir.ref<f32> 105// CHECK-NEXT: %[[V17:.*]] = arith.cmpf oge, %[[V16]], %[[V4:.*]] : f32 106// CHECK-NEXT: %[[V18:.*]] = fir.if %[[V17]] -> (f32) { 107// CHECK-NEXT: %[[ISFIRST:.*]] = fir.load %[[V0:.*]] : !fir.ref<i32> 108// CHECK-NEXT: %[[V19:.*]] = hlfir.designate %[[V1]]#0 (%[[V14]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 109// CHECK-NEXT: %[[V20:.*]] = fir.load %[[V19]] : !fir.ref<f32> 110// CHECK-NEXT: %[[NEW_MIN:.*]] = arith.cmpf ogt, %[[V20]], %arg4 fastmath<contract> : f32 111// CHECK-NEXT: %[[CONDRED:.*]] = arith.cmpf une, %arg4, %arg4 fastmath<contract> : f32 112// CHECK-NEXT: %[[CONDELEM:.*]] = arith.cmpf oeq, %[[V20]], %[[V20]] fastmath<contract> : f32 113// CHECK-NEXT: %[[ANDCOND:.*]] = arith.andi %[[CONDRED]], %[[CONDELEM]] : i1 114// CHECK-NEXT: %[[NEW_MIN2:.*]] = arith.ori %[[NEW_MIN]], %[[ANDCOND]] : i1 115// CHECK-NEXT: %[[ISFIRSTL:.*]] = fir.convert %[[ISFIRST]] : (i32) -> i1 116// CHECK-NEXT: %[[ISFIRSTNOT:.*]] = arith.xori %[[ISFIRSTL]], %true : i1 117// CHECK-NEXT: %[[ORCOND:.*]] = arith.ori %[[NEW_MIN2]], %[[ISFIRSTNOT]] : i1 118// CHECK-NEXT: %[[V22:.*]] = fir.if %[[ORCOND]] -> (f32) { 119// CHECK-NEXT: fir.store %c1_i32 to %[[V0]] : !fir.ref<i32> 120// CHECK-NEXT: %[[V23:.*]] = hlfir.designate %{{.}} (%c1) : (!fir.ref<!fir.array<1xi32>>, index) -> !fir.ref<i32> 121// CHECK-NEXT: %[[V24:.*]] = fir.convert %[[V14]] : (index) -> i32 122// CHECK-NEXT: fir.store %[[V24]] to %[[V23]] : !fir.ref<i32> 123// CHECK-NEXT: fir.result %[[V20]] : f32 124// CHECK-NEXT: } else { 125// CHECK-NEXT: fir.result %arg4 : f32 126// CHECK-NEXT: } 127// CHECK-NEXT: fir.result %[[V22]] : f32 128// CHECK-NEXT: } else { 129// CHECK-NEXT: fir.result %arg4 : f32 130// CHECK-NEXT: } 131// CHECK-NEXT: fir.result %[[V18]] : f32 132// CHECK-NEXT: } 133 134