@@ -124,3 +124,114 @@ llvm.func @omp_teams_branching_shared(%condition: i1, %arg0: i32, %arg1: f32, %a
124124// CHECK-NEXT: br label
125125// CHECK: ret void
126126
127+ // -----
128+
129+ llvm.func @beforeTeams ()
130+ llvm.func @duringTeams ()
131+ llvm.func @afterTeams ()
132+
133+ // CHECK-LABEL: @omp_teams_thread_limit
134+ // CHECK-SAME: (i32 [[THREAD_LIMIT:.+]])
135+ llvm.func @omp_teams_thread_limit (%threadLimit: i32 ) {
136+ // CHECK-NEXT: call void @beforeTeams()
137+ llvm.call @beforeTeams () : () -> ()
138+ // CHECK: [[THREAD_NUM:%.+]] = call i32 @__kmpc_global_thread_num
139+ // CHECK-NEXT: call void @__kmpc_push_num_teams_51({{.+}}, i32 [[THREAD_NUM]], i32 0, i32 0, i32 [[THREAD_LIMIT]])
140+ // CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @1, i32 0, ptr [[OUTLINED_FN:.+]])
141+ omp.teams thread_limit (%threadLimit : i32 ) {
142+ llvm.call @duringTeams () : () -> ()
143+ omp.terminator
144+ }
145+ // CHECK: call void @afterTeams
146+ llvm.call @afterTeams () : () -> ()
147+ // CHECK: ret void
148+ llvm.return
149+ }
150+
151+ // CHECK: define internal void [[OUTLINED_FN]](ptr {{.+}}, ptr {{.+}})
152+ // CHECK: call void @duringTeams()
153+ // CHECK: ret void
154+
155+ // -----
156+
157+ llvm.func @beforeTeams ()
158+ llvm.func @duringTeams ()
159+ llvm.func @afterTeams ()
160+
161+ // CHECK-LABEL: @omp_teams_num_teams_upper
162+ // CHECK-SAME: (i32 [[NUM_TEAMS_UPPER:.+]])
163+ llvm.func @omp_teams_num_teams_upper (%numTeamsUpper: i32 ) {
164+ // CHECK-NEXT: call void @beforeTeams()
165+ llvm.call @beforeTeams () : () -> ()
166+ // CHECK: [[THREAD_NUM:%.+]] = call i32 @__kmpc_global_thread_num
167+ // CHECK-NEXT: call void @__kmpc_push_num_teams_51({{.+}}, i32 [[THREAD_NUM]], i32 [[NUM_TEAMS_UPPER]], i32 [[NUM_TEAMS_UPPER]], i32 0)
168+ // CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @1, i32 0, ptr [[OUTLINED_FN:.+]])
169+ omp.teams num_teams (to %numTeamsUpper : i32 ) {
170+ llvm.call @duringTeams () : () -> ()
171+ omp.terminator
172+ }
173+ // CHECK: call void @afterTeams
174+ llvm.call @afterTeams () : () -> ()
175+ // CHECK: ret void
176+ llvm.return
177+ }
178+
179+ // CHECK: define internal void [[OUTLINED_FN]](ptr {{.+}}, ptr {{.+}})
180+ // CHECK: call void @duringTeams()
181+ // CHECK: ret void
182+
183+ // -----
184+
185+ llvm.func @beforeTeams ()
186+ llvm.func @duringTeams ()
187+ llvm.func @afterTeams ()
188+
189+ // CHECK-LABEL: @omp_teams_num_teams_lower_and_upper
190+ // CHECK-SAME: (i32 [[NUM_TEAMS_LOWER:.+]], i32 [[NUM_TEAMS_UPPER:.+]])
191+ llvm.func @omp_teams_num_teams_lower_and_upper (%numTeamsLower: i32 , %numTeamsUpper: i32 ) {
192+ // CHECK-NEXT: call void @beforeTeams()
193+ llvm.call @beforeTeams () : () -> ()
194+ // CHECK: [[THREAD_NUM:%.+]] = call i32 @__kmpc_global_thread_num
195+ // CHECK-NEXT: call void @__kmpc_push_num_teams_51({{.+}}, i32 [[THREAD_NUM]], i32 [[NUM_TEAMS_LOWER]], i32 [[NUM_TEAMS_UPPER]], i32 0)
196+ // CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @1, i32 0, ptr [[OUTLINED_FN:.+]])
197+ omp.teams num_teams (%numTeamsLower : i32 to %numTeamsUpper: i32 ) {
198+ llvm.call @duringTeams () : () -> ()
199+ omp.terminator
200+ }
201+ // CHECK: call void @afterTeams
202+ llvm.call @afterTeams () : () -> ()
203+ // CHECK: ret void
204+ llvm.return
205+ }
206+
207+ // CHECK: define internal void [[OUTLINED_FN]](ptr {{.+}}, ptr {{.+}})
208+ // CHECK: call void @duringTeams()
209+ // CHECK: ret void
210+
211+ // -----
212+
213+ llvm.func @beforeTeams ()
214+ llvm.func @duringTeams ()
215+ llvm.func @afterTeams ()
216+
217+ // CHECK-LABEL: @omp_teams_num_teams_and_thread_limit
218+ // CHECK-SAME: (i32 [[NUM_TEAMS_LOWER:.+]], i32 [[NUM_TEAMS_UPPER:.+]], i32 [[THREAD_LIMIT:.+]])
219+ llvm.func @omp_teams_num_teams_and_thread_limit (%numTeamsLower: i32 , %numTeamsUpper: i32 , %threadLimit: i32 ) {
220+ // CHECK-NEXT: call void @beforeTeams()
221+ llvm.call @beforeTeams () : () -> ()
222+ // CHECK: [[THREAD_NUM:%.+]] = call i32 @__kmpc_global_thread_num
223+ // CHECK-NEXT: call void @__kmpc_push_num_teams_51({{.+}}, i32 [[THREAD_NUM]], i32 [[NUM_TEAMS_LOWER]], i32 [[NUM_TEAMS_UPPER]], i32 [[THREAD_LIMIT]])
224+ // CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @1, i32 0, ptr [[OUTLINED_FN:.+]])
225+ omp.teams num_teams (%numTeamsLower : i32 to %numTeamsUpper: i32 ) thread_limit (%threadLimit: i32 ) {
226+ llvm.call @duringTeams () : () -> ()
227+ omp.terminator
228+ }
229+ // CHECK: call void @afterTeams
230+ llvm.call @afterTeams () : () -> ()
231+ // CHECK: ret void
232+ llvm.return
233+ }
234+
235+ // CHECK: define internal void [[OUTLINED_FN]](ptr {{.+}}, ptr {{.+}})
236+ // CHECK: call void @duringTeams()
237+ // CHECK: ret void
0 commit comments