xref: /llvm-project/flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir (revision 5d38e6e42a90f5d469b5ff9e25e5e8865606776a)
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