163 lines · plain
1// RUN: fir-opt --bufferize-hlfir %s | FileCheck %s2 3// Checks that we correctly identify when to use the lowering to4// omp.workshare.loop_wrapper5 6// CHECK-LABEL: @should_parallelize_07// CHECK: omp.workshare.loop_wrapper8func.func @should_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {9 omp.workshare {10 %c42 = arith.constant 42 : index11 %c1_i32 = arith.constant 1 : i3212 %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 : i3217 }18 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>19 hlfir.destroy %elemental : !hlfir.expr<42xi32>20 omp.terminator21 }22 return23}24 25// CHECK-LABEL: @should_parallelize_126// CHECK: omp.workshare.loop_wrapper27func.func @should_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {28 omp.parallel {29 omp.workshare {30 %c42 = arith.constant 42 : index31 %c1_i32 = arith.constant 1 : i3232 %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 : i3237 }38 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>39 hlfir.destroy %elemental : !hlfir.expr<42xi32>40 omp.terminator41 }42 omp.terminator43 }44 return45}46 47 48// CHECK-LABEL: @should_not_parallelize_049// CHECK-NOT: omp.workshare.loop_wrapper50func.func @should_not_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {51 omp.workshare {52 omp.single {53 %c42 = arith.constant 42 : index54 %c1_i32 = arith.constant 1 : i3255 %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 : i3260 }61 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>62 hlfir.destroy %elemental : !hlfir.expr<42xi32>63 omp.terminator64 }65 omp.terminator66 }67 return68}69 70// CHECK-LABEL: @should_not_parallelize_171// CHECK-NOT: omp.workshare.loop_wrapper72func.func @should_not_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {73 omp.workshare {74 omp.critical {75 %c42 = arith.constant 42 : index76 %c1_i32 = arith.constant 1 : i3277 %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 : i3282 }83 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>84 hlfir.destroy %elemental : !hlfir.expr<42xi32>85 omp.terminator86 }87 omp.terminator88 }89 return90}91 92// CHECK-LABEL: @should_not_parallelize_293// CHECK-NOT: omp.workshare.loop_wrapper94func.func @should_not_parallelize_2(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {95 omp.workshare {96 omp.parallel {97 %c42 = arith.constant 42 : index98 %c1_i32 = arith.constant 1 : i3299 %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 : i32104 }105 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>106 hlfir.destroy %elemental : !hlfir.expr<42xi32>107 omp.terminator108 }109 omp.terminator110 }111 return112}113 114// CHECK-LABEL: @should_not_parallelize_3115// CHECK-NOT: omp.workshare.loop_wrapper116func.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 : index122 %c1_i32 = arith.constant 1 : i32123 %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 : i32128 }129 hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>130 hlfir.destroy %elemental : !hlfir.expr<42xi32>131 omp.terminator132 }133 omp.terminator134 }135 omp.terminator136 }137 omp.terminator138 }139 return140}141 142// CHECK-LABEL: @should_not_parallelize_4143// CHECK-NOT: omp.workshare.loop_wrapper144func.func @should_not_parallelize_4(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {145 omp.workshare {146 ^bb1:147 %c42 = arith.constant 42 : index148 %c1_i32 = arith.constant 1 : i32149 %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 : i32154 }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 ^bb2158 ^bb2:159 omp.terminator160 }161 return162}163