1// RUN: fir-opt --bufferize-hlfir %s | FileCheck %s 2 3// Checks that we correctly identify when to use the lowering to 4// omp.workshare.loop_wrapper 5 6// CHECK-LABEL: @should_parallelize_0 7// CHECK: omp.workshare.loop_wrapper 8func.func @should_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) { 9 omp.workshare { 10 %c42 = arith.constant 42 : index 11 %c1_i32 = arith.constant 1 : i32 12 %shape = fir.shape %c42 : (index) -> !fir.shape<1> 13 %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>) 14 %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { 15 ^bb0(%i: index): 16 hlfir.yield_element %c1_i32 : i32 17 } 18 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>> 19 hlfir.destroy %elemental : !hlfir.expr<42xi32> 20 omp.terminator 21 } 22 return 23} 24 25// CHECK-LABEL: @should_parallelize_1 26// CHECK: omp.workshare.loop_wrapper 27func.func @should_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) { 28 omp.parallel { 29 omp.workshare { 30 %c42 = arith.constant 42 : index 31 %c1_i32 = arith.constant 1 : i32 32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> 33 %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>) 34 %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { 35 ^bb0(%i: index): 36 hlfir.yield_element %c1_i32 : i32 37 } 38 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>> 39 hlfir.destroy %elemental : !hlfir.expr<42xi32> 40 omp.terminator 41 } 42 omp.terminator 43 } 44 return 45} 46 47 48// CHECK-LABEL: @should_not_parallelize_0 49// CHECK-NOT: omp.workshare.loop_wrapper 50func.func @should_not_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) { 51 omp.workshare { 52 omp.single { 53 %c42 = arith.constant 42 : index 54 %c1_i32 = arith.constant 1 : i32 55 %shape = fir.shape %c42 : (index) -> !fir.shape<1> 56 %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>) 57 %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { 58 ^bb0(%i: index): 59 hlfir.yield_element %c1_i32 : i32 60 } 61 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>> 62 hlfir.destroy %elemental : !hlfir.expr<42xi32> 63 omp.terminator 64 } 65 omp.terminator 66 } 67 return 68} 69 70// CHECK-LABEL: @should_not_parallelize_1 71// CHECK-NOT: omp.workshare.loop_wrapper 72func.func @should_not_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) { 73 omp.workshare { 74 omp.critical { 75 %c42 = arith.constant 42 : index 76 %c1_i32 = arith.constant 1 : i32 77 %shape = fir.shape %c42 : (index) -> !fir.shape<1> 78 %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>) 79 %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { 80 ^bb0(%i: index): 81 hlfir.yield_element %c1_i32 : i32 82 } 83 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>> 84 hlfir.destroy %elemental : !hlfir.expr<42xi32> 85 omp.terminator 86 } 87 omp.terminator 88 } 89 return 90} 91 92// CHECK-LABEL: @should_not_parallelize_2 93// CHECK-NOT: omp.workshare.loop_wrapper 94func.func @should_not_parallelize_2(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) { 95 omp.workshare { 96 omp.parallel { 97 %c42 = arith.constant 42 : index 98 %c1_i32 = arith.constant 1 : i32 99 %shape = fir.shape %c42 : (index) -> !fir.shape<1> 100 %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>) 101 %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { 102 ^bb0(%i: index): 103 hlfir.yield_element %c1_i32 : i32 104 } 105 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>> 106 hlfir.destroy %elemental : !hlfir.expr<42xi32> 107 omp.terminator 108 } 109 omp.terminator 110 } 111 return 112} 113 114// CHECK-LABEL: @should_not_parallelize_3 115// CHECK-NOT: omp.workshare.loop_wrapper 116func.func @should_not_parallelize_3(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) { 117 omp.workshare { 118 omp.parallel { 119 omp.workshare { 120 omp.parallel { 121 %c42 = arith.constant 42 : index 122 %c1_i32 = arith.constant 1 : i32 123 %shape = fir.shape %c42 : (index) -> !fir.shape<1> 124 %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>) 125 %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { 126 ^bb0(%i: index): 127 hlfir.yield_element %c1_i32 : i32 128 } 129 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>> 130 hlfir.destroy %elemental : !hlfir.expr<42xi32> 131 omp.terminator 132 } 133 omp.terminator 134 } 135 omp.terminator 136 } 137 omp.terminator 138 } 139 return 140} 141 142// CHECK-LABEL: @should_not_parallelize_4 143// CHECK-NOT: omp.workshare.loop_wrapper 144func.func @should_not_parallelize_4(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) { 145 omp.workshare { 146 ^bb1: 147 %c42 = arith.constant 42 : index 148 %c1_i32 = arith.constant 1 : i32 149 %shape = fir.shape %c42 : (index) -> !fir.shape<1> 150 %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>) 151 %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { 152 ^bb0(%i: index): 153 hlfir.yield_element %c1_i32 : i32 154 } 155 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>> 156 hlfir.destroy %elemental : !hlfir.expr<42xi32> 157 cf.br ^bb2 158 ^bb2: 159 omp.terminator 160 } 161 return 162} 163