1// Test hlfir.forall operation parse, verify (no errors), and unparse. 2// RUN: fir-opt %s | fir-opt | FileCheck %s 3 4func.func @forall_test(%x: !fir.box<!fir.array<?xf32>>, %x2: !fir.box<!fir.array<?x?xf32>>) { 5 %c1 = arith.constant 1 : index 6 %c10 = arith.constant 10 : index 7 hlfir.forall lb { 8 hlfir.yield %c1 : index 9 } ub { 10 hlfir.yield %c10 : index 11 } (%i : index) { 12 hlfir.region_assign { 13 %res = fir.call @foo(%i) : (index) -> f32 14 hlfir.yield %res : f32 15 } to { 16 %xi = hlfir.designate %x(%i) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 17 hlfir.yield %xi : !fir.ref<f32> 18 } 19 hlfir.forall lb { 20 hlfir.yield %c1 : index 21 } ub { 22 hlfir.yield %c10 : index 23 } (%j : index) { 24 hlfir.region_assign { 25 %jf = fir.convert %j : (index) -> f32 26 hlfir.yield %jf : f32 27 } to { 28 %xij = hlfir.designate %x2(%i, %j) : (!fir.box<!fir.array<?x?xf32>>, index, index) -> !fir.ref<f32> 29 hlfir.yield %xij : !fir.ref<f32> 30 } 31 } 32 } 33 return 34} 35// CHECK-LABEL: func.func @forall_test( 36// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>, 37// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?x?xf32>>) { 38// CHECK: %[[VAL_2:.*]] = arith.constant 1 : index 39// CHECK: %[[VAL_3:.*]] = arith.constant 10 : index 40// CHECK: hlfir.forall lb { 41// CHECK: hlfir.yield %[[VAL_2]] : index 42// CHECK: } ub { 43// CHECK: hlfir.yield %[[VAL_3]] : index 44// CHECK: } (%[[VAL_4:.*]]: index) { 45// CHECK: hlfir.region_assign { 46// CHECK: %[[VAL_5:.*]] = fir.call @foo(%[[VAL_4]]) : (index) -> f32 47// CHECK: hlfir.yield %[[VAL_5]] : f32 48// CHECK: } to { 49// CHECK: %[[VAL_6:.*]] = hlfir.designate %[[VAL_0]] (%[[VAL_4]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 50// CHECK: hlfir.yield %[[VAL_6]] : !fir.ref<f32> 51// CHECK: } 52// CHECK: hlfir.forall lb { 53// CHECK: hlfir.yield %[[VAL_2]] : index 54// CHECK: } ub { 55// CHECK: hlfir.yield %[[VAL_3]] : index 56// CHECK: } (%[[VAL_7:.*]]: index) { 57// CHECK: hlfir.region_assign { 58// CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (index) -> f32 59// CHECK: hlfir.yield %[[VAL_8]] : f32 60// CHECK: } to { 61// CHECK: %[[VAL_9:.*]] = hlfir.designate %[[VAL_1]] (%[[VAL_4]], %[[VAL_7]]) : (!fir.box<!fir.array<?x?xf32>>, index, index) -> !fir.ref<f32> 62// CHECK: hlfir.yield %[[VAL_9]] : !fir.ref<f32> 63// CHECK: } 64// CHECK: } 65// CHECK: } 66 67func.func @forall_test_step(%x : !fir.box<!fir.array<10xf32>>, %y: !fir.box<!fir.array<?xf32>>) { 68 hlfir.forall lb { 69 %c1 = arith.constant 1 : index 70 hlfir.yield %c1 : index 71 } ub { 72 %c10 = arith.constant 10 : index 73 hlfir.yield %c10 : index 74 } step { 75 %c2 = arith.constant 2 : index 76 hlfir.yield %c2 : index 77 } (%i : index) { 78 hlfir.region_assign { 79 %yi = hlfir.designate %y(%i) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 80 %val = fir.load %yi : !fir.ref<f32> 81 hlfir.yield %val : f32 82 } to { 83 %xi = hlfir.designate %x(%i) : (!fir.box<!fir.array<10xf32>>, index) -> !fir.ref<f32> 84 hlfir.yield %xi : !fir.ref<f32> 85 } 86 } 87 return 88} 89// CHECK-LABEL: func.func @forall_test_step( 90// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<10xf32>>, 91// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xf32>>) { 92// CHECK: hlfir.forall lb { 93// CHECK: %[[VAL_2:.*]] = arith.constant 1 : index 94// CHECK: hlfir.yield %[[VAL_2]] : index 95// CHECK: } ub { 96// CHECK: %[[VAL_3:.*]] = arith.constant 10 : index 97// CHECK: hlfir.yield %[[VAL_3]] : index 98// CHECK: } step { 99// CHECK: %[[VAL_4:.*]] = arith.constant 2 : index 100// CHECK: hlfir.yield %[[VAL_4]] : index 101// CHECK: } (%[[VAL_5:.*]]: index) { 102// CHECK: hlfir.region_assign { 103// CHECK: %[[VAL_6:.*]] = hlfir.designate %[[VAL_1]] (%[[VAL_5]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 104// CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_6]] : !fir.ref<f32> 105// CHECK: hlfir.yield %[[VAL_7]] : f32 106// CHECK: } to { 107// CHECK: %[[VAL_8:.*]] = hlfir.designate %[[VAL_0]] (%[[VAL_5]]) : (!fir.box<!fir.array<10xf32>>, index) -> !fir.ref<f32> 108// CHECK: hlfir.yield %[[VAL_8]] : !fir.ref<f32> 109// CHECK: } 110// CHECK: } 111