blob: d87dee6184b0d2bd97e2923f0bc3290b872f8c86 [file] [log] [blame]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
2// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK1
Chirag Khandelwalc2041062021-04-29 19:06:07 +05303// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.0 %s
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t.0 -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK2
Alexey Bataeva8a9153a2017-12-29 18:07:07 +00005
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07006// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK3
Chirag Khandelwalc2041062021-04-29 19:06:07 +05307// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.1 %s
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07008// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -std=c++11 -include-pch %t.1 -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK4
Johannes Doerfertb3c06db2019-11-04 23:00:36 -06009
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050010// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
Chirag Khandelwalc2041062021-04-29 19:06:07 +053011// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.2 %s
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050012// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t.2 -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000013
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070014// RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK7
Chirag Khandelwalc2041062021-04-29 19:06:07 +053015// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.3 %s
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070016// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t.3 -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK8
Saiyedul Islameaa341f2020-08-13 07:27:15 +000017
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070018// RUN: %clang_cc1 -verify -fopenmp -fopenmp-enable-irbuilder -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK9
Chirag Khandelwalc2041062021-04-29 19:06:07 +053019// RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.4 %s
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070020// RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -std=c++11 -include-pch %t.4 -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK10
Saiyedul Islameaa341f2020-08-13 07:27:15 +000021
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050022// RUN: %clang_cc1 -verify -fopenmp-simd -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
Chirag Khandelwalc2041062021-04-29 19:06:07 +053023// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.5 %s
Johannes Doerfert6ff380f2021-05-18 21:52:53 -050024// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t.5 -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
Saiyedul Islameaa341f2020-08-13 07:27:15 +000025
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000026// expected-no-diagnostics
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000027#ifndef HEADER
28#define HEADER
29
Alexey Bataev87933c72015-09-18 08:07:34 +000030float flag;
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000031int main (int argc, char **argv) {
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000032#pragma omp parallel
33{
Alexey Bataev87933c72015-09-18 08:07:34 +000034#pragma omp cancel parallel if(flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000035 argv[0][0] = argc;
Jonas Hahnfeld20fce722017-02-17 18:32:51 +000036#pragma omp barrier
37 argv[0][0] += argc;
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000038}
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000039#pragma omp sections
40{
41#pragma omp cancel sections
42}
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000043#pragma omp sections
44{
45#pragma omp cancel sections
46#pragma omp section
47 {
48#pragma omp cancel sections
49 }
50}
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000051#pragma omp for
52for (int i = 0; i < argc; ++i) {
Alexey Bataev87933c72015-09-18 08:07:34 +000053#pragma omp cancel for if(cancel: flag)
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000054}
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000055#pragma omp task
56{
57#pragma omp cancel taskgroup
58}
Alexey Bataev25e5b442015-09-15 12:52:43 +000059#pragma omp parallel sections
60{
61#pragma omp cancel sections
62}
Alexey Bataev25e5b442015-09-15 12:52:43 +000063#pragma omp parallel sections
64{
65#pragma omp cancel sections
66#pragma omp section
67 {
68#pragma omp cancel sections
69 }
70}
Alexey Bataev957d8562016-11-17 15:12:05 +000071int r = 0;
72#pragma omp parallel for reduction(+: r)
Alexey Bataev25e5b442015-09-15 12:52:43 +000073for (int i = 0; i < argc; ++i) {
74#pragma omp cancel for
Alexey Bataev957d8562016-11-17 15:12:05 +000075 r += i;
Alexey Bataev25e5b442015-09-15 12:52:43 +000076}
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000077 return argc;
78}
79
Alexey Bataev7d5d33e2015-07-06 05:50:32 +000080#endif
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070081// CHECK1-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +090082// CHECK1-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -070083// CHECK1-NEXT: entry:
84// CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
85// CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
86// CHECK1-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
87// CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
88// CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
89// CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
90// CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
91// CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
92// CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_1:%.*]] = alloca i32, align 4
93// CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_2:%.*]] = alloca i32, align 4
94// CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_3:%.*]] = alloca i32, align 4
95// CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_4:%.*]] = alloca i32, align 4
96// CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_5:%.*]] = alloca i32, align 4
97// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
98// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4
99// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
100// CHECK1-NEXT: [[DOTCAPTURE_EXPR_21:%.*]] = alloca i32, align 4
101// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4
102// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
103// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
104// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
105// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
106// CHECK1-NEXT: [[I24:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700107// CHECK1-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700108// CHECK1-NEXT: [[R:%.*]] = alloca i32, align 4
109// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
110// CHECK1-NEXT: store i32 0, i32* [[RETVAL]], align 4
111// CHECK1-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
112// CHECK1-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700113// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i8*** [[ARGV_ADDR]], i32* [[ARGC_ADDR]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700114// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
115// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
116// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
117// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -0700118// CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700119// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
120// CHECK1-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
121// CHECK1-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 [[TMP1]], i32 0
122// CHECK1-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
123// CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
124// CHECK1-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700125// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
126// CHECK1: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700127// CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
128// CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
129// CHECK1-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700130// CHECK1-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
131// CHECK1: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700132// CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
133// CHECK1-NEXT: switch i32 [[TMP7]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700134// CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
135// CHECK1-NEXT: ]
136// CHECK1: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700137// CHECK1-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
138// CHECK1-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0
139// CHECK1-NEXT: br i1 [[TMP9]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700140// CHECK1: .cancel.exit:
141// CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]]
142// CHECK1: .cancel.continue:
143// CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
144// CHECK1: .omp.sections.exit:
145// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
146// CHECK1: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700147// CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
148// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP10]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700149// CHECK1-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
150// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
151// CHECK1: omp.inner.for.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700152// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700153// CHECK1-NEXT: br label [[CANCEL_CONT:%.*]]
154// CHECK1: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700155// CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700156// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
157// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
158// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_3]], align 4
159// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_4]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -0700160// CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_4]], i32* [[DOTOMP_SECTIONS_LB_1]], i32* [[DOTOMP_SECTIONS_UB_2]], i32* [[DOTOMP_SECTIONS_ST_3]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700161// CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
162// CHECK1-NEXT: [[TMP12:%.*]] = icmp slt i32 [[TMP11]], 1
163// CHECK1-NEXT: [[TMP13:%.*]] = select i1 [[TMP12]], i32 [[TMP11]], i32 1
164// CHECK1-NEXT: store i32 [[TMP13]], i32* [[DOTOMP_SECTIONS_UB_2]], align 4
165// CHECK1-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
166// CHECK1-NEXT: store i32 [[TMP14]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700167// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND6:%.*]]
168// CHECK1: omp.inner.for.cond6:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700169// CHECK1-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
170// CHECK1-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
171// CHECK1-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700172// CHECK1-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY8:%.*]], label [[OMP_INNER_FOR_END18:%.*]]
173// CHECK1: omp.inner.for.body8:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700174// CHECK1-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
175// CHECK1-NEXT: switch i32 [[TMP17]], label [[DOTOMP_SECTIONS_EXIT15:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700176// CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE9:%.*]]
177// CHECK1-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE12:%.*]]
178// CHECK1-NEXT: ]
179// CHECK1: .omp.sections.case9:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700180// CHECK1-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
181// CHECK1-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
182// CHECK1-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT10:%.*]], label [[DOTCANCEL_CONTINUE11:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700183// CHECK1: .cancel.exit10:
184// CHECK1-NEXT: br label [[CANCEL_EXIT19:%.*]]
185// CHECK1: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700186// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700187// CHECK1-NEXT: br label [[CANCEL_CONT]]
188// CHECK1: .cancel.continue11:
189// CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
190// CHECK1: .omp.sections.case12:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700191// CHECK1-NEXT: [[TMP20:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
192// CHECK1-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
193// CHECK1-NEXT: br i1 [[TMP21]], label [[DOTCANCEL_EXIT13:%.*]], label [[DOTCANCEL_CONTINUE14:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700194// CHECK1: .cancel.exit13:
195// CHECK1-NEXT: br label [[CANCEL_EXIT19]]
196// CHECK1: .cancel.continue14:
197// CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
198// CHECK1: .omp.sections.exit15:
199// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC16:%.*]]
200// CHECK1: omp.inner.for.inc16:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700201// CHECK1-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
202// CHECK1-NEXT: [[INC17:%.*]] = add nsw i32 [[TMP22]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700203// CHECK1-NEXT: store i32 [[INC17]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
204// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND6]]
205// CHECK1: omp.inner.for.end18:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700206// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700207// CHECK1-NEXT: br label [[CANCEL_CONT20:%.*]]
208// CHECK1: cancel.cont20:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700209// CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700210// CHECK1-NEXT: [[TMP23:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
211// CHECK1-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR_]], align 4
212// CHECK1-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
213// CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP24]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700214// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
215// CHECK1-NEXT: [[SUB22:%.*]] = sub nsw i32 [[DIV]], 1
216// CHECK1-NEXT: store i32 [[SUB22]], i32* [[DOTCAPTURE_EXPR_21]], align 4
217// CHECK1-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700218// CHECK1-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
219// CHECK1-NEXT: [[CMP23:%.*]] = icmp slt i32 0, [[TMP25]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700220// CHECK1-NEXT: br i1 [[CMP23]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
221// CHECK1: omp.precond.then:
222// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700223// CHECK1-NEXT: [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
224// CHECK1-NEXT: store i32 [[TMP26]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700225// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
226// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -0700227// CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700228// CHECK1-NEXT: [[TMP27:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
229// CHECK1-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
230// CHECK1-NEXT: [[CMP25:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700231// CHECK1-NEXT: br i1 [[CMP25]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
232// CHECK1: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700233// CHECK1-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700234// CHECK1-NEXT: br label [[COND_END:%.*]]
235// CHECK1: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700236// CHECK1-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700237// CHECK1-NEXT: br label [[COND_END]]
238// CHECK1: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700239// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE]] ], [ [[TMP30]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700240// CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700241// CHECK1-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
242// CHECK1-NEXT: store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700243// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND26:%.*]]
244// CHECK1: omp.inner.for.cond26:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700245// CHECK1-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
246// CHECK1-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
247// CHECK1-NEXT: [[CMP27:%.*]] = icmp sle i32 [[TMP32]], [[TMP33]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700248// CHECK1-NEXT: br i1 [[CMP27]], label [[OMP_INNER_FOR_BODY28:%.*]], label [[OMP_INNER_FOR_END33:%.*]]
249// CHECK1: omp.inner.for.body28:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700250// CHECK1-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
251// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP34]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700252// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
253// CHECK1-NEXT: store i32 [[ADD]], i32* [[I24]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700254// CHECK1-NEXT: [[TMP35:%.*]] = load float, float* @flag, align 4
255// CHECK1-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP35]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700256// CHECK1-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
257// CHECK1: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700258// CHECK1-NEXT: [[TMP36:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2)
259// CHECK1-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 0
260// CHECK1-NEXT: br i1 [[TMP37]], label [[DOTCANCEL_EXIT29:%.*]], label [[DOTCANCEL_CONTINUE30:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700261// CHECK1: .cancel.exit29:
262// CHECK1-NEXT: br label [[CANCEL_EXIT34:%.*]]
263// CHECK1: cancel.exit19:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700264// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700265// CHECK1-NEXT: br label [[CANCEL_CONT20]]
266// CHECK1: .cancel.continue30:
267// CHECK1-NEXT: br label [[OMP_IF_END:%.*]]
268// CHECK1: omp_if.else:
269// CHECK1-NEXT: br label [[OMP_IF_END]]
270// CHECK1: omp_if.end:
271// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
272// CHECK1: omp.body.continue:
273// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC31:%.*]]
274// CHECK1: omp.inner.for.inc31:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700275// CHECK1-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
276// CHECK1-NEXT: [[ADD32:%.*]] = add nsw i32 [[TMP38]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700277// CHECK1-NEXT: store i32 [[ADD32]], i32* [[DOTOMP_IV]], align 4
278// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND26]]
279// CHECK1: omp.inner.for.end33:
280// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
281// CHECK1: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700282// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700283// CHECK1-NEXT: br label [[OMP_PRECOND_END]]
284// CHECK1: cancel.exit34:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700285// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700286// CHECK1-NEXT: br label [[CANCEL_CONT35:%.*]]
287// CHECK1: omp.precond.end:
288// CHECK1-NEXT: br label [[CANCEL_CONT35]]
289// CHECK1: cancel.cont35:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700290// CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700291// CHECK1-NEXT: [[TMP39:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
292// CHECK1-NEXT: [[TMP40:%.*]] = bitcast i8* [[TMP39]] to %struct.kmp_task_t_with_privates*
293// CHECK1-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP40]], i32 0, i32 0
294// CHECK1-NEXT: [[TMP42:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP39]])
295// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
296// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700297// CHECK1-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700298// CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
299// CHECK1-NEXT: [[TMP43:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
300// CHECK1-NEXT: ret i32 [[TMP43]]
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530301//
302//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700303// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900304// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700305// CHECK1-NEXT: entry:
306// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
307// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700308// CHECK1-NEXT: [[ARGV_ADDR:%.*]] = alloca i8***, align 8
309// CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700310// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
311// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700312// CHECK1-NEXT: store i8*** [[ARGV]], i8**** [[ARGV_ADDR]], align 8
313// CHECK1-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
314// CHECK1-NEXT: [[TMP0:%.*]] = load i8***, i8**** [[ARGV_ADDR]], align 8
315// CHECK1-NEXT: [[TMP1:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
316// CHECK1-NEXT: [[TMP2:%.*]] = load float, float* @flag, align 4
317// CHECK1-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP2]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700318// CHECK1-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
319// CHECK1: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700320// CHECK1-NEXT: [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
321// CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
322// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i32 1)
323// CHECK1-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
324// CHECK1-NEXT: br i1 [[TMP6]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700325// CHECK1: .cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700326// CHECK1-NEXT: [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
327// CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
328// CHECK1-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP8]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700329// CHECK1-NEXT: br label [[RETURN:%.*]]
330// CHECK1: .cancel.continue:
331// CHECK1-NEXT: br label [[OMP_IF_END:%.*]]
332// CHECK1: omp_if.else:
333// CHECK1-NEXT: br label [[OMP_IF_END]]
334// CHECK1: omp_if.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700335// CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[TMP1]], align 4
336// CHECK1-NEXT: [[CONV:%.*]] = trunc i32 [[TMP10]] to i8
337// CHECK1-NEXT: [[TMP11:%.*]] = load i8**, i8*** [[TMP0]], align 8
338// CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP11]], i64 0
339// CHECK1-NEXT: [[TMP12:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
340// CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[TMP12]], i64 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700341// CHECK1-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX1]], align 1
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700342// CHECK1-NEXT: [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
343// CHECK1-NEXT: [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
344// CHECK1-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP14]])
345// CHECK1-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
346// CHECK1-NEXT: br i1 [[TMP16]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700347// CHECK1: .cancel.exit2:
348// CHECK1-NEXT: br label [[RETURN]]
349// CHECK1: .cancel.continue3:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700350// CHECK1-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP1]], align 4
351// CHECK1-NEXT: [[TMP18:%.*]] = load i8**, i8*** [[TMP0]], align 8
352// CHECK1-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8*, i8** [[TMP18]], i64 0
353// CHECK1-NEXT: [[TMP19:%.*]] = load i8*, i8** [[ARRAYIDX4]], align 8
354// CHECK1-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i8, i8* [[TMP19]], i64 0
355// CHECK1-NEXT: [[TMP20:%.*]] = load i8, i8* [[ARRAYIDX5]], align 1
356// CHECK1-NEXT: [[CONV6:%.*]] = sext i8 [[TMP20]] to i32
357// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV6]], [[TMP17]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700358// CHECK1-NEXT: [[CONV7:%.*]] = trunc i32 [[ADD]] to i8
359// CHECK1-NEXT: store i8 [[CONV7]], i8* [[ARRAYIDX5]], align 1
360// CHECK1-NEXT: br label [[RETURN]]
361// CHECK1: return:
362// CHECK1-NEXT: ret void
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530363//
364//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700365// CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900366// CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700367// CHECK1-NEXT: entry:
368// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
369// CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
370// CHECK1-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
371// CHECK1-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
372// CHECK1-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700373// CHECK1-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700374// CHECK1-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
375// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
376// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
377// CHECK1-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
378// CHECK1-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
379// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
380// CHECK1-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
381// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
382// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
383// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
384// CHECK1-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700385// CHECK1-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700386// CHECK1-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -0400387// CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
388// CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
389// CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
390// CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
391// CHECK1-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
392// CHECK1-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
393// CHECK1-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
394// CHECK1-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
395// CHECK1-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700396// CHECK1-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
397// CHECK1-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Joseph Huber9ce02ea2021-06-24 14:39:12 -0400398// CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700399// CHECK1-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2:[0-9]+]]
400// CHECK1-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
401// CHECK1-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
402// CHECK1: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -0400403// CHECK1-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700404// CHECK1-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT:%.*]]
405// CHECK1: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -0400406// CHECK1-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700407// CHECK1-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]]
408// CHECK1: .omp_outlined..1.exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -0400409// CHECK1-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700410// CHECK1-NEXT: ret i32 0
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530411//
412//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700413// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900414// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700415// CHECK1-NEXT: entry:
416// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
417// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
418// CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
419// CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
420// CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
421// CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
422// CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
423// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
424// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
425// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
426// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
427// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
428// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700429// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
430// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
431// CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
432// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
433// CHECK1-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0
434// CHECK1-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 0
435// CHECK1-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
436// CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
437// CHECK1-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700438// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
439// CHECK1: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700440// CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
441// CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
442// CHECK1-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700443// CHECK1-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
444// CHECK1: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700445// CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
446// CHECK1-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700447// CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
448// CHECK1-NEXT: ]
449// CHECK1: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700450// CHECK1-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
451// CHECK1-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
452// CHECK1-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700453// CHECK1: .cancel.exit:
454// CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]]
455// CHECK1: .cancel.continue:
456// CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
457// CHECK1: .omp.sections.exit:
458// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
459// CHECK1: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700460// CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
461// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700462// CHECK1-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
463// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
464// CHECK1: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700465// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700466// CHECK1-NEXT: br label [[CANCEL_CONT:%.*]]
467// CHECK1: cancel.cont:
468// CHECK1-NEXT: ret void
469// CHECK1: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700470// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700471// CHECK1-NEXT: br label [[CANCEL_CONT]]
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530472//
473//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700474// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900475// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700476// CHECK1-NEXT: entry:
477// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
478// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
479// CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
480// CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
481// CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
482// CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
483// CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
484// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
485// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
486// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
487// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
488// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
489// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700490// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
491// CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
492// CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
493// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
494// CHECK1-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 1
495// CHECK1-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 1
496// CHECK1-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
497// CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
498// CHECK1-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700499// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
500// CHECK1: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700501// CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
502// CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
503// CHECK1-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700504// CHECK1-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
505// CHECK1: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700506// CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
507// CHECK1-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700508// CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
509// CHECK1-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE1:%.*]]
510// CHECK1-NEXT: ]
511// CHECK1: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700512// CHECK1-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
513// CHECK1-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
514// CHECK1-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700515// CHECK1: .cancel.exit:
516// CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]]
517// CHECK1: .cancel.continue:
518// CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
519// CHECK1: .omp.sections.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700520// CHECK1-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
521// CHECK1-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
522// CHECK1-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700523// CHECK1: .cancel.exit2:
524// CHECK1-NEXT: br label [[CANCEL_EXIT]]
525// CHECK1: .cancel.continue3:
526// CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
527// CHECK1: .omp.sections.exit:
528// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
529// CHECK1: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700530// CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
531// CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700532// CHECK1-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
533// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
534// CHECK1: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700535// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700536// CHECK1-NEXT: br label [[CANCEL_CONT:%.*]]
537// CHECK1: cancel.cont:
538// CHECK1-NEXT: ret void
539// CHECK1: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700540// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700541// CHECK1-NEXT: br label [[CANCEL_CONT]]
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530542//
543//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700544// CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900545// CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700546// CHECK1-NEXT: entry:
547// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
548// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700549// CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
550// CHECK1-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700551// CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
552// CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4
553// CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
554// CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
555// CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4
556// CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
557// CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
558// CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
559// CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700560// CHECK1-NEXT: [[R3:%.*]] = alloca i32, align 4
561// CHECK1-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700562// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
563// CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
564// CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700565// CHECK1-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
566// CHECK1-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
567// CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
568// CHECK1-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
569// CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
570// CHECK1-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
571// CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
572// CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700573// CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
574// CHECK1-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
575// CHECK1-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
576// CHECK1-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700577// CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
578// CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700579// CHECK1-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
580// CHECK1: omp.precond.then:
581// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700582// CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
583// CHECK1-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700584// CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
585// CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700586// CHECK1-NEXT: store i32 0, i32* [[R3]], align 4
587// CHECK1-NEXT: [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
588// CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
589// CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6]], i32 [[TMP7]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
590// CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
591// CHECK1-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
592// CHECK1-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]
593// CHECK1-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700594// CHECK1: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700595// CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700596// CHECK1-NEXT: br label [[COND_END:%.*]]
597// CHECK1: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700598// CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700599// CHECK1-NEXT: br label [[COND_END]]
600// CHECK1: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700601// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700602// CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700603// CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
604// CHECK1-NEXT: store i32 [[TMP12]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700605// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
606// CHECK1: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700607// CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
608// CHECK1-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
609// CHECK1-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
610// CHECK1-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700611// CHECK1: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700612// CHECK1-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
613// CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700614// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700615// CHECK1-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
616// CHECK1-NEXT: [[TMP16:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
617// CHECK1-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP16]], align 4
618// CHECK1-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP17]], i32 2)
619// CHECK1-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
620// CHECK1-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700621// CHECK1: .cancel.exit:
622// CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]]
623// CHECK1: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700624// CHECK1-NEXT: [[TMP20:%.*]] = load i32, i32* [[I4]], align 4
625// CHECK1-NEXT: [[TMP21:%.*]] = load i32, i32* [[R3]], align 4
626// CHECK1-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP20]]
627// CHECK1-NEXT: store i32 [[ADD7]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700628// CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
629// CHECK1: omp.body.continue:
630// CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
631// CHECK1: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700632// CHECK1-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
633// CHECK1-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP22]], 1
634// CHECK1-NEXT: store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700635// CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]]
636// CHECK1: omp.inner.for.end:
637// CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
638// CHECK1: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700639// CHECK1-NEXT: [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
640// CHECK1-NEXT: [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
641// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP24]])
642// CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
643// CHECK1-NEXT: [[TMP26:%.*]] = bitcast i32* [[R3]] to i8*
644// CHECK1-NEXT: store i8* [[TMP26]], i8** [[TMP25]], align 8
645// CHECK1-NEXT: [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
646// CHECK1-NEXT: [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
647// CHECK1-NEXT: [[TMP29:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
648// CHECK1-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB7:[0-9]+]], i32 [[TMP28]], i32 1, i64 8, i8* [[TMP29]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
649// CHECK1-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700650// CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
651// CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
652// CHECK1-NEXT: ]
653// CHECK1: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700654// CHECK1-NEXT: [[TMP31:%.*]] = load i32, i32* [[TMP1]], align 4
655// CHECK1-NEXT: [[TMP32:%.*]] = load i32, i32* [[R3]], align 4
656// CHECK1-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP31]], [[TMP32]]
657// CHECK1-NEXT: store i32 [[ADD9]], i32* [[TMP1]], align 4
658// CHECK1-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB7]], i32 [[TMP28]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700659// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
660// CHECK1: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700661// CHECK1-NEXT: [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
662// CHECK1-NEXT: [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
663// CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP34]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700664// CHECK1-NEXT: br label [[CANCEL_CONT:%.*]]
665// CHECK1: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700666// CHECK1-NEXT: [[TMP35:%.*]] = load i32, i32* [[R3]], align 4
667// CHECK1-NEXT: [[TMP36:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP35]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700668// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
669// CHECK1: .omp.reduction.default:
670// CHECK1-NEXT: br label [[OMP_PRECOND_END]]
671// CHECK1: omp.precond.end:
672// CHECK1-NEXT: br label [[CANCEL_CONT]]
673// CHECK1: cancel.cont:
674// CHECK1-NEXT: ret void
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530675//
676//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700677// CHECK1-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900678// CHECK1-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700679// CHECK1-NEXT: entry:
680// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
681// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
682// CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
683// CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
684// CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
685// CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
686// CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
687// CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
688// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
689// CHECK1-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
690// CHECK1-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
691// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
692// CHECK1-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
693// CHECK1-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
694// CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
695// CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
696// CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
697// CHECK1-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
698// CHECK1-NEXT: ret void
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530699//
700//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700701// CHECK2-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900702// CHECK2-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700703// CHECK2-NEXT: entry:
704// CHECK2-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
705// CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
706// CHECK2-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
707// CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
708// CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
709// CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
710// CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
711// CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
712// CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_1:%.*]] = alloca i32, align 4
713// CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_2:%.*]] = alloca i32, align 4
714// CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_3:%.*]] = alloca i32, align 4
715// CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_4:%.*]] = alloca i32, align 4
716// CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_5:%.*]] = alloca i32, align 4
717// CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
718// CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4
719// CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
720// CHECK2-NEXT: [[DOTCAPTURE_EXPR_21:%.*]] = alloca i32, align 4
721// CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4
722// CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
723// CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
724// CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
725// CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
726// CHECK2-NEXT: [[I24:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700727// CHECK2-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700728// CHECK2-NEXT: [[R:%.*]] = alloca i32, align 4
729// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
730// CHECK2-NEXT: store i32 0, i32* [[RETVAL]], align 4
731// CHECK2-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
732// CHECK2-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700733// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i8*** [[ARGV_ADDR]], i32* [[ARGC_ADDR]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700734// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
735// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
736// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
737// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -0700738// CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700739// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
740// CHECK2-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
741// CHECK2-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 [[TMP1]], i32 0
742// CHECK2-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
743// CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
744// CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700745// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
746// CHECK2: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700747// CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
748// CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
749// CHECK2-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700750// CHECK2-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
751// CHECK2: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700752// CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
753// CHECK2-NEXT: switch i32 [[TMP7]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700754// CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
755// CHECK2-NEXT: ]
756// CHECK2: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700757// CHECK2-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
758// CHECK2-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0
759// CHECK2-NEXT: br i1 [[TMP9]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700760// CHECK2: .cancel.exit:
761// CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]]
762// CHECK2: .cancel.continue:
763// CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
764// CHECK2: .omp.sections.exit:
765// CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
766// CHECK2: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700767// CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
768// CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP10]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700769// CHECK2-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
770// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]]
771// CHECK2: omp.inner.for.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700772// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700773// CHECK2-NEXT: br label [[CANCEL_CONT:%.*]]
774// CHECK2: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700775// CHECK2-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700776// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
777// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
778// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_3]], align 4
779// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_4]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -0700780// CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_4]], i32* [[DOTOMP_SECTIONS_LB_1]], i32* [[DOTOMP_SECTIONS_UB_2]], i32* [[DOTOMP_SECTIONS_ST_3]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700781// CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
782// CHECK2-NEXT: [[TMP12:%.*]] = icmp slt i32 [[TMP11]], 1
783// CHECK2-NEXT: [[TMP13:%.*]] = select i1 [[TMP12]], i32 [[TMP11]], i32 1
784// CHECK2-NEXT: store i32 [[TMP13]], i32* [[DOTOMP_SECTIONS_UB_2]], align 4
785// CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
786// CHECK2-NEXT: store i32 [[TMP14]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700787// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND6:%.*]]
788// CHECK2: omp.inner.for.cond6:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700789// CHECK2-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
790// CHECK2-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
791// CHECK2-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700792// CHECK2-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY8:%.*]], label [[OMP_INNER_FOR_END18:%.*]]
793// CHECK2: omp.inner.for.body8:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700794// CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
795// CHECK2-NEXT: switch i32 [[TMP17]], label [[DOTOMP_SECTIONS_EXIT15:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700796// CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE9:%.*]]
797// CHECK2-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE12:%.*]]
798// CHECK2-NEXT: ]
799// CHECK2: .omp.sections.case9:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700800// CHECK2-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
801// CHECK2-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
802// CHECK2-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT10:%.*]], label [[DOTCANCEL_CONTINUE11:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700803// CHECK2: .cancel.exit10:
804// CHECK2-NEXT: br label [[CANCEL_EXIT19:%.*]]
805// CHECK2: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700806// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700807// CHECK2-NEXT: br label [[CANCEL_CONT]]
808// CHECK2: .cancel.continue11:
809// CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
810// CHECK2: .omp.sections.case12:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700811// CHECK2-NEXT: [[TMP20:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
812// CHECK2-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
813// CHECK2-NEXT: br i1 [[TMP21]], label [[DOTCANCEL_EXIT13:%.*]], label [[DOTCANCEL_CONTINUE14:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700814// CHECK2: .cancel.exit13:
815// CHECK2-NEXT: br label [[CANCEL_EXIT19]]
816// CHECK2: .cancel.continue14:
817// CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
818// CHECK2: .omp.sections.exit15:
819// CHECK2-NEXT: br label [[OMP_INNER_FOR_INC16:%.*]]
820// CHECK2: omp.inner.for.inc16:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700821// CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
822// CHECK2-NEXT: [[INC17:%.*]] = add nsw i32 [[TMP22]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700823// CHECK2-NEXT: store i32 [[INC17]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
824// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND6]]
825// CHECK2: omp.inner.for.end18:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700826// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700827// CHECK2-NEXT: br label [[CANCEL_CONT20:%.*]]
828// CHECK2: cancel.cont20:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700829// CHECK2-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700830// CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
831// CHECK2-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR_]], align 4
832// CHECK2-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
833// CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP24]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700834// CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
835// CHECK2-NEXT: [[SUB22:%.*]] = sub nsw i32 [[DIV]], 1
836// CHECK2-NEXT: store i32 [[SUB22]], i32* [[DOTCAPTURE_EXPR_21]], align 4
837// CHECK2-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700838// CHECK2-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
839// CHECK2-NEXT: [[CMP23:%.*]] = icmp slt i32 0, [[TMP25]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700840// CHECK2-NEXT: br i1 [[CMP23]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
841// CHECK2: omp.precond.then:
842// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700843// CHECK2-NEXT: [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
844// CHECK2-NEXT: store i32 [[TMP26]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700845// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
846// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -0700847// CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700848// CHECK2-NEXT: [[TMP27:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
849// CHECK2-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
850// CHECK2-NEXT: [[CMP25:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700851// CHECK2-NEXT: br i1 [[CMP25]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
852// CHECK2: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700853// CHECK2-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700854// CHECK2-NEXT: br label [[COND_END:%.*]]
855// CHECK2: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700856// CHECK2-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700857// CHECK2-NEXT: br label [[COND_END]]
858// CHECK2: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700859// CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE]] ], [ [[TMP30]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700860// CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700861// CHECK2-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
862// CHECK2-NEXT: store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700863// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND26:%.*]]
864// CHECK2: omp.inner.for.cond26:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700865// CHECK2-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
866// CHECK2-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
867// CHECK2-NEXT: [[CMP27:%.*]] = icmp sle i32 [[TMP32]], [[TMP33]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700868// CHECK2-NEXT: br i1 [[CMP27]], label [[OMP_INNER_FOR_BODY28:%.*]], label [[OMP_INNER_FOR_END33:%.*]]
869// CHECK2: omp.inner.for.body28:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700870// CHECK2-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
871// CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP34]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700872// CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
873// CHECK2-NEXT: store i32 [[ADD]], i32* [[I24]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700874// CHECK2-NEXT: [[TMP35:%.*]] = load float, float* @flag, align 4
875// CHECK2-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP35]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700876// CHECK2-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
877// CHECK2: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700878// CHECK2-NEXT: [[TMP36:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2)
879// CHECK2-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 0
880// CHECK2-NEXT: br i1 [[TMP37]], label [[DOTCANCEL_EXIT29:%.*]], label [[DOTCANCEL_CONTINUE30:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700881// CHECK2: .cancel.exit29:
882// CHECK2-NEXT: br label [[CANCEL_EXIT34:%.*]]
883// CHECK2: cancel.exit19:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700884// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700885// CHECK2-NEXT: br label [[CANCEL_CONT20]]
886// CHECK2: .cancel.continue30:
887// CHECK2-NEXT: br label [[OMP_IF_END:%.*]]
888// CHECK2: omp_if.else:
889// CHECK2-NEXT: br label [[OMP_IF_END]]
890// CHECK2: omp_if.end:
891// CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
892// CHECK2: omp.body.continue:
893// CHECK2-NEXT: br label [[OMP_INNER_FOR_INC31:%.*]]
894// CHECK2: omp.inner.for.inc31:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700895// CHECK2-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
896// CHECK2-NEXT: [[ADD32:%.*]] = add nsw i32 [[TMP38]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700897// CHECK2-NEXT: store i32 [[ADD32]], i32* [[DOTOMP_IV]], align 4
898// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND26]]
899// CHECK2: omp.inner.for.end33:
900// CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
901// CHECK2: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700902// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700903// CHECK2-NEXT: br label [[OMP_PRECOND_END]]
904// CHECK2: cancel.exit34:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700905// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700906// CHECK2-NEXT: br label [[CANCEL_CONT35:%.*]]
907// CHECK2: omp.precond.end:
908// CHECK2-NEXT: br label [[CANCEL_CONT35]]
909// CHECK2: cancel.cont35:
Alexey Bataevc84a5442021-06-03 14:13:35 -0700910// CHECK2-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700911// CHECK2-NEXT: [[TMP39:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
912// CHECK2-NEXT: [[TMP40:%.*]] = bitcast i8* [[TMP39]] to %struct.kmp_task_t_with_privates*
913// CHECK2-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP40]], i32 0, i32 0
914// CHECK2-NEXT: [[TMP42:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP39]])
915// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
916// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700917// CHECK2-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700918// CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
919// CHECK2-NEXT: [[TMP43:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
920// CHECK2-NEXT: ret i32 [[TMP43]]
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530921//
922//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700923// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900924// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700925// CHECK2-NEXT: entry:
926// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
927// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700928// CHECK2-NEXT: [[ARGV_ADDR:%.*]] = alloca i8***, align 8
929// CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700930// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
931// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700932// CHECK2-NEXT: store i8*** [[ARGV]], i8**** [[ARGV_ADDR]], align 8
933// CHECK2-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
934// CHECK2-NEXT: [[TMP0:%.*]] = load i8***, i8**** [[ARGV_ADDR]], align 8
935// CHECK2-NEXT: [[TMP1:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
936// CHECK2-NEXT: [[TMP2:%.*]] = load float, float* @flag, align 4
937// CHECK2-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP2]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700938// CHECK2-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
939// CHECK2: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700940// CHECK2-NEXT: [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
941// CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
942// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i32 1)
943// CHECK2-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
944// CHECK2-NEXT: br i1 [[TMP6]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700945// CHECK2: .cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700946// CHECK2-NEXT: [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
947// CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
948// CHECK2-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP8]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700949// CHECK2-NEXT: br label [[RETURN:%.*]]
950// CHECK2: .cancel.continue:
951// CHECK2-NEXT: br label [[OMP_IF_END:%.*]]
952// CHECK2: omp_if.else:
953// CHECK2-NEXT: br label [[OMP_IF_END]]
954// CHECK2: omp_if.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700955// CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[TMP1]], align 4
956// CHECK2-NEXT: [[CONV:%.*]] = trunc i32 [[TMP10]] to i8
957// CHECK2-NEXT: [[TMP11:%.*]] = load i8**, i8*** [[TMP0]], align 8
958// CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP11]], i64 0
959// CHECK2-NEXT: [[TMP12:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
960// CHECK2-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[TMP12]], i64 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700961// CHECK2-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX1]], align 1
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700962// CHECK2-NEXT: [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
963// CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
964// CHECK2-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP14]])
965// CHECK2-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
966// CHECK2-NEXT: br i1 [[TMP16]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700967// CHECK2: .cancel.exit2:
968// CHECK2-NEXT: br label [[RETURN]]
969// CHECK2: .cancel.continue3:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700970// CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP1]], align 4
971// CHECK2-NEXT: [[TMP18:%.*]] = load i8**, i8*** [[TMP0]], align 8
972// CHECK2-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8*, i8** [[TMP18]], i64 0
973// CHECK2-NEXT: [[TMP19:%.*]] = load i8*, i8** [[ARRAYIDX4]], align 8
974// CHECK2-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i8, i8* [[TMP19]], i64 0
975// CHECK2-NEXT: [[TMP20:%.*]] = load i8, i8* [[ARRAYIDX5]], align 1
976// CHECK2-NEXT: [[CONV6:%.*]] = sext i8 [[TMP20]] to i32
977// CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV6]], [[TMP17]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700978// CHECK2-NEXT: [[CONV7:%.*]] = trunc i32 [[ADD]] to i8
979// CHECK2-NEXT: store i8 [[CONV7]], i8* [[ARRAYIDX5]], align 1
980// CHECK2-NEXT: br label [[RETURN]]
981// CHECK2: return:
982// CHECK2-NEXT: ret void
Chirag Khandelwalc2041062021-04-29 19:06:07 +0530983//
984//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700985// CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +0900986// CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700987// CHECK2-NEXT: entry:
988// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
989// CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
990// CHECK2-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
991// CHECK2-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
992// CHECK2-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -0700993// CHECK2-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -0700994// CHECK2-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
995// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
996// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
997// CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
998// CHECK2-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
999// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
1000// CHECK2-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
1001// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
1002// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
1003// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
1004// CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001005// CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001006// CHECK2-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001007// CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
1008// CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
1009// CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
1010// CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
1011// CHECK2-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
1012// CHECK2-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
1013// CHECK2-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
1014// CHECK2-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
1015// CHECK2-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001016// CHECK2-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
1017// CHECK2-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001018// CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001019// CHECK2-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2:[0-9]+]]
1020// CHECK2-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
1021// CHECK2-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
1022// CHECK2: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001023// CHECK2-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001024// CHECK2-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT:%.*]]
1025// CHECK2: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001026// CHECK2-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001027// CHECK2-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]]
1028// CHECK2: .omp_outlined..1.exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001029// CHECK2-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001030// CHECK2-NEXT: ret i32 0
Chirag Khandelwalc2041062021-04-29 19:06:07 +05301031//
1032//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001033// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001034// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001035// CHECK2-NEXT: entry:
1036// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1037// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1038// CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
1039// CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
1040// CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
1041// CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
1042// CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
1043// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1044// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1045// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1046// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1047// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
1048// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001049// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1050// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
1051// CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
1052// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1053// CHECK2-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0
1054// CHECK2-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 0
1055// CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
1056// CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1057// CHECK2-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001058// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1059// CHECK2: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001060// CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1061// CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1062// CHECK2-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001063// CHECK2-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1064// CHECK2: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001065// CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1066// CHECK2-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001067// CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
1068// CHECK2-NEXT: ]
1069// CHECK2: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001070// CHECK2-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
1071// CHECK2-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
1072// CHECK2-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001073// CHECK2: .cancel.exit:
1074// CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]]
1075// CHECK2: .cancel.continue:
1076// CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
1077// CHECK2: .omp.sections.exit:
1078// CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1079// CHECK2: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001080// CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1081// CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001082// CHECK2-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
1083// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]]
1084// CHECK2: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001085// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001086// CHECK2-NEXT: br label [[CANCEL_CONT:%.*]]
1087// CHECK2: cancel.cont:
1088// CHECK2-NEXT: ret void
1089// CHECK2: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001090// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001091// CHECK2-NEXT: br label [[CANCEL_CONT]]
Chirag Khandelwalc2041062021-04-29 19:06:07 +05301092//
1093//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001094// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001095// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001096// CHECK2-NEXT: entry:
1097// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1098// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1099// CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
1100// CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
1101// CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
1102// CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
1103// CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
1104// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1105// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1106// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1107// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1108// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
1109// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001110// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1111// CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
1112// CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
1113// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1114// CHECK2-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 1
1115// CHECK2-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 1
1116// CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
1117// CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1118// CHECK2-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001119// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1120// CHECK2: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001121// CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1122// CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1123// CHECK2-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001124// CHECK2-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1125// CHECK2: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001126// CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1127// CHECK2-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001128// CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
1129// CHECK2-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE1:%.*]]
1130// CHECK2-NEXT: ]
1131// CHECK2: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001132// CHECK2-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
1133// CHECK2-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
1134// CHECK2-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001135// CHECK2: .cancel.exit:
1136// CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]]
1137// CHECK2: .cancel.continue:
1138// CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
1139// CHECK2: .omp.sections.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001140// CHECK2-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
1141// CHECK2-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
1142// CHECK2-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001143// CHECK2: .cancel.exit2:
1144// CHECK2-NEXT: br label [[CANCEL_EXIT]]
1145// CHECK2: .cancel.continue3:
1146// CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
1147// CHECK2: .omp.sections.exit:
1148// CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1149// CHECK2: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001150// CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1151// CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001152// CHECK2-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
1153// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]]
1154// CHECK2: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001155// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001156// CHECK2-NEXT: br label [[CANCEL_CONT:%.*]]
1157// CHECK2: cancel.cont:
1158// CHECK2-NEXT: ret void
1159// CHECK2: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001160// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001161// CHECK2-NEXT: br label [[CANCEL_CONT]]
Chirag Khandelwalc2041062021-04-29 19:06:07 +05301162//
1163//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001164// CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001165// CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001166// CHECK2-NEXT: entry:
1167// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1168// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001169// CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
1170// CHECK2-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001171// CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1172// CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4
1173// CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1174// CHECK2-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1175// CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4
1176// CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1177// CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1178// CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1179// CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001180// CHECK2-NEXT: [[R3:%.*]] = alloca i32, align 4
1181// CHECK2-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001182// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
1183// CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1184// CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001185// CHECK2-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
1186// CHECK2-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
1187// CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
1188// CHECK2-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
1189// CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
1190// CHECK2-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
1191// CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1192// CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001193// CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1194// CHECK2-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1195// CHECK2-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1196// CHECK2-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001197// CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1198// CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001199// CHECK2-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1200// CHECK2: omp.precond.then:
1201// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001202// CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1203// CHECK2-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001204// CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1205// CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001206// CHECK2-NEXT: store i32 0, i32* [[R3]], align 4
1207// CHECK2-NEXT: [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1208// CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
1209// CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6]], i32 [[TMP7]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
1210// CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1211// CHECK2-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1212// CHECK2-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]
1213// CHECK2-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001214// CHECK2: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001215// CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001216// CHECK2-NEXT: br label [[COND_END:%.*]]
1217// CHECK2: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001218// CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001219// CHECK2-NEXT: br label [[COND_END]]
1220// CHECK2: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001221// CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001222// CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001223// CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1224// CHECK2-NEXT: store i32 [[TMP12]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001225// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1226// CHECK2: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001227// CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1228// CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1229// CHECK2-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
1230// CHECK2-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001231// CHECK2: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001232// CHECK2-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1233// CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001234// CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001235// CHECK2-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
1236// CHECK2-NEXT: [[TMP16:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1237// CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP16]], align 4
1238// CHECK2-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP17]], i32 2)
1239// CHECK2-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
1240// CHECK2-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001241// CHECK2: .cancel.exit:
1242// CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]]
1243// CHECK2: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001244// CHECK2-NEXT: [[TMP20:%.*]] = load i32, i32* [[I4]], align 4
1245// CHECK2-NEXT: [[TMP21:%.*]] = load i32, i32* [[R3]], align 4
1246// CHECK2-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP20]]
1247// CHECK2-NEXT: store i32 [[ADD7]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001248// CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
1249// CHECK2: omp.body.continue:
1250// CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1251// CHECK2: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001252// CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1253// CHECK2-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP22]], 1
1254// CHECK2-NEXT: store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001255// CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]]
1256// CHECK2: omp.inner.for.end:
1257// CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
1258// CHECK2: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001259// CHECK2-NEXT: [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1260// CHECK2-NEXT: [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
1261// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP24]])
1262// CHECK2-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
1263// CHECK2-NEXT: [[TMP26:%.*]] = bitcast i32* [[R3]] to i8*
1264// CHECK2-NEXT: store i8* [[TMP26]], i8** [[TMP25]], align 8
1265// CHECK2-NEXT: [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1266// CHECK2-NEXT: [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
1267// CHECK2-NEXT: [[TMP29:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
1268// CHECK2-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB7:[0-9]+]], i32 [[TMP28]], i32 1, i64 8, i8* [[TMP29]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
1269// CHECK2-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001270// CHECK2-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
1271// CHECK2-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
1272// CHECK2-NEXT: ]
1273// CHECK2: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001274// CHECK2-NEXT: [[TMP31:%.*]] = load i32, i32* [[TMP1]], align 4
1275// CHECK2-NEXT: [[TMP32:%.*]] = load i32, i32* [[R3]], align 4
1276// CHECK2-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP31]], [[TMP32]]
1277// CHECK2-NEXT: store i32 [[ADD9]], i32* [[TMP1]], align 4
1278// CHECK2-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB7]], i32 [[TMP28]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001279// CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
1280// CHECK2: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001281// CHECK2-NEXT: [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
1282// CHECK2-NEXT: [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
1283// CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP34]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001284// CHECK2-NEXT: br label [[CANCEL_CONT:%.*]]
1285// CHECK2: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001286// CHECK2-NEXT: [[TMP35:%.*]] = load i32, i32* [[R3]], align 4
1287// CHECK2-NEXT: [[TMP36:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP35]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001288// CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
1289// CHECK2: .omp.reduction.default:
1290// CHECK2-NEXT: br label [[OMP_PRECOND_END]]
1291// CHECK2: omp.precond.end:
1292// CHECK2-NEXT: br label [[CANCEL_CONT]]
1293// CHECK2: cancel.cont:
1294// CHECK2-NEXT: ret void
Chirag Khandelwalc2041062021-04-29 19:06:07 +05301295//
1296//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001297// CHECK2-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001298// CHECK2-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001299// CHECK2-NEXT: entry:
1300// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
1301// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
1302// CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
1303// CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
1304// CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
1305// CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
1306// CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
1307// CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
1308// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
1309// CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
1310// CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
1311// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
1312// CHECK2-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
1313// CHECK2-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
1314// CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
1315// CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
1316// CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1317// CHECK2-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
1318// CHECK2-NEXT: ret void
Chirag Khandelwalc2041062021-04-29 19:06:07 +05301319//
1320//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001321// CHECK3-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001322// CHECK3-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001323// CHECK3-NEXT: entry:
1324// CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
1325// CHECK3-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
1326// CHECK3-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
1327// CHECK3-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
1328// CHECK3-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
1329// CHECK3-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
1330// CHECK3-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001331// CHECK3-NEXT: [[P_LASTITER27:%.*]] = alloca i32, align 4
1332// CHECK3-NEXT: [[P_LOWERBOUND28:%.*]] = alloca i32, align 4
1333// CHECK3-NEXT: [[P_UPPERBOUND29:%.*]] = alloca i32, align 4
1334// CHECK3-NEXT: [[P_STRIDE30:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001335// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1336// CHECK3-NEXT: [[TMP:%.*]] = alloca i32, align 4
1337// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001338// CHECK3-NEXT: [[DOTCAPTURE_EXPR_34:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001339// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4
1340// CHECK3-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1341// CHECK3-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1342// CHECK3-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1343// CHECK3-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001344// CHECK3-NEXT: [[I36:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001345// CHECK3-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
1346// CHECK3-NEXT: [[R:%.*]] = alloca i32, align 4
1347// CHECK3-NEXT: store i32 0, i32* [[RETVAL]], align 4
1348// CHECK3-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
1349// CHECK3-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
1350// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
1351// CHECK3-NEXT: br label [[OMP_PARALLEL:%.*]]
1352// CHECK3: omp_parallel:
1353// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i8***)* @main..omp_par to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]])
1354// CHECK3-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1355// CHECK3: omp.par.outlined.exit:
1356// CHECK3-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1357// CHECK3: omp.par.exit.split:
1358// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER:%.*]]
1359// CHECK3: omp_section_loop.preheader:
1360// CHECK3-NEXT: store i32 0, i32* [[P_LOWERBOUND]], align 4
1361// CHECK3-NEXT: store i32 0, i32* [[P_UPPERBOUND]], align 4
1362// CHECK3-NEXT: store i32 1, i32* [[P_STRIDE]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001363// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1364// CHECK3-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]], i32 34, i32* [[P_LASTITER]], i32* [[P_LOWERBOUND]], i32* [[P_UPPERBOUND]], i32* [[P_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001365// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[P_LOWERBOUND]], align 4
1366// CHECK3-NEXT: [[TMP1:%.*]] = load i32, i32* [[P_UPPERBOUND]], align 4
1367// CHECK3-NEXT: [[TMP2:%.*]] = sub i32 [[TMP1]], [[TMP0]]
1368// CHECK3-NEXT: [[TMP3:%.*]] = add i32 [[TMP2]], 1
1369// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER:%.*]]
1370// CHECK3: omp_section_loop.header:
1371// CHECK3-NEXT: [[OMP_SECTION_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER]] ], [ [[OMP_SECTION_LOOP_NEXT:%.*]], [[OMP_SECTION_LOOP_INC:%.*]] ]
1372// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_COND:%.*]]
1373// CHECK3: omp_section_loop.cond:
1374// CHECK3-NEXT: [[OMP_SECTION_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV]], [[TMP3]]
1375// CHECK3-NEXT: br i1 [[OMP_SECTION_LOOP_CMP]], label [[OMP_SECTION_LOOP_BODY:%.*]], label [[OMP_SECTION_LOOP_EXIT:%.*]]
1376// CHECK3: omp_section_loop.body:
1377// CHECK3-NEXT: [[TMP4:%.*]] = add i32 [[OMP_SECTION_LOOP_IV]], [[TMP0]]
1378// CHECK3-NEXT: [[TMP5:%.*]] = mul i32 [[TMP4]], 1
1379// CHECK3-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], 0
1380// CHECK3-NEXT: switch i32 [[TMP6]], label [[OMP_SECTION_LOOP_INC]] [
1381// CHECK3-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE:%.*]]
1382// CHECK3-NEXT: ]
1383// CHECK3: omp_section_loop.inc:
1384// CHECK3-NEXT: [[OMP_SECTION_LOOP_NEXT]] = add nuw i32 [[OMP_SECTION_LOOP_IV]], 1
1385// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER]]
1386// CHECK3: omp_section_loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001387// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
1388// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1389// CHECK3-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001390// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_AFTER:%.*]]
1391// CHECK3: omp_section_loop.after:
1392// CHECK3-NEXT: br label [[OMP_SECTIONS_END:%.*]]
1393// CHECK3: omp_sections.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001394// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER13:%.*]]
1395// CHECK3: omp_section_loop.preheader13:
1396// CHECK3-NEXT: store i32 0, i32* [[P_LOWERBOUND28]], align 4
1397// CHECK3-NEXT: store i32 1, i32* [[P_UPPERBOUND29]], align 4
1398// CHECK3-NEXT: store i32 1, i32* [[P_STRIDE30]], align 4
1399// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM31:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1400// CHECK3-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]], i32 34, i32* [[P_LASTITER27]], i32* [[P_LOWERBOUND28]], i32* [[P_UPPERBOUND29]], i32* [[P_STRIDE30]], i32 1, i32 1)
1401// CHECK3-NEXT: [[TMP7:%.*]] = load i32, i32* [[P_LOWERBOUND28]], align 4
1402// CHECK3-NEXT: [[TMP8:%.*]] = load i32, i32* [[P_UPPERBOUND29]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001403// CHECK3-NEXT: [[TMP9:%.*]] = sub i32 [[TMP8]], [[TMP7]]
1404// CHECK3-NEXT: [[TMP10:%.*]] = add i32 [[TMP9]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07001405// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER14:%.*]]
1406// CHECK3: omp_section_loop.header14:
1407// CHECK3-NEXT: [[OMP_SECTION_LOOP_IV20:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER13]] ], [ [[OMP_SECTION_LOOP_NEXT22:%.*]], [[OMP_SECTION_LOOP_INC17:%.*]] ]
1408// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_COND15:%.*]]
1409// CHECK3: omp_section_loop.cond15:
1410// CHECK3-NEXT: [[OMP_SECTION_LOOP_CMP21:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV20]], [[TMP10]]
1411// CHECK3-NEXT: br i1 [[OMP_SECTION_LOOP_CMP21]], label [[OMP_SECTION_LOOP_BODY16:%.*]], label [[OMP_SECTION_LOOP_EXIT18:%.*]]
1412// CHECK3: omp_section_loop.body16:
1413// CHECK3-NEXT: [[TMP11:%.*]] = add i32 [[OMP_SECTION_LOOP_IV20]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001414// CHECK3-NEXT: [[TMP12:%.*]] = mul i32 [[TMP11]], 1
1415// CHECK3-NEXT: [[TMP13:%.*]] = add i32 [[TMP12]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07001416// CHECK3-NEXT: switch i32 [[TMP13]], label [[OMP_SECTION_LOOP_INC17]] [
1417// CHECK3-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE23:%.*]]
1418// CHECK3-NEXT: i32 1, label [[OMP_SECTION_LOOP_BODY_CASE25:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001419// CHECK3-NEXT: ]
Alexey Bataevc84a5442021-06-03 14:13:35 -07001420// CHECK3: omp_section_loop.inc17:
1421// CHECK3-NEXT: [[OMP_SECTION_LOOP_NEXT22]] = add nuw i32 [[OMP_SECTION_LOOP_IV20]], 1
1422// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER14]]
1423// CHECK3: omp_section_loop.exit18:
1424// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]])
1425// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM32:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1426// CHECK3-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM32]])
1427// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_AFTER19:%.*]]
1428// CHECK3: omp_section_loop.after19:
1429// CHECK3-NEXT: br label [[OMP_SECTIONS_END33:%.*]]
1430// CHECK3: omp_sections.end33:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001431// CHECK3-NEXT: [[TMP14:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
1432// CHECK3-NEXT: store i32 [[TMP14]], i32* [[DOTCAPTURE_EXPR_]], align 4
1433// CHECK3-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1434// CHECK3-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP15]], 0
1435// CHECK3-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07001436// CHECK3-NEXT: [[SUB35:%.*]] = sub nsw i32 [[DIV]], 1
1437// CHECK3-NEXT: store i32 [[SUB35]], i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001438// CHECK3-NEXT: store i32 0, i32* [[I]], align 4
1439// CHECK3-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1440// CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP16]]
1441// CHECK3-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1442// CHECK3: omp.precond.then:
1443// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001444// CHECK3-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001445// CHECK3-NEXT: store i32 [[TMP17]], i32* [[DOTOMP_UB]], align 4
1446// CHECK3-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1447// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001448// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM37:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB6:[0-9]+]])
1449// CHECK3-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM37]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001450// CHECK3-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001451// CHECK3-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
1452// CHECK3-NEXT: [[CMP38:%.*]] = icmp sgt i32 [[TMP18]], [[TMP19]]
1453// CHECK3-NEXT: br i1 [[CMP38]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001454// CHECK3: cond.true:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001455// CHECK3-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001456// CHECK3-NEXT: br label [[COND_END:%.*]]
1457// CHECK3: cond.false:
1458// CHECK3-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1459// CHECK3-NEXT: br label [[COND_END]]
1460// CHECK3: cond.end:
1461// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ [[TMP20]], [[COND_TRUE]] ], [ [[TMP21]], [[COND_FALSE]] ]
1462// CHECK3-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
1463// CHECK3-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1464// CHECK3-NEXT: store i32 [[TMP22]], i32* [[DOTOMP_IV]], align 4
1465// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1466// CHECK3: omp.inner.for.cond:
1467// CHECK3-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1468// CHECK3-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001469// CHECK3-NEXT: [[CMP39:%.*]] = icmp sle i32 [[TMP23]], [[TMP24]]
1470// CHECK3-NEXT: br i1 [[CMP39]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001471// CHECK3: omp.inner.for.body:
1472// CHECK3-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1473// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP25]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07001474// CHECK3-NEXT: [[ADD40:%.*]] = add nsw i32 0, [[MUL]]
1475// CHECK3-NEXT: store i32 [[ADD40]], i32* [[I36]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001476// CHECK3-NEXT: [[TMP26:%.*]] = load float, float* @flag, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001477// CHECK3-NEXT: [[TOBOOL41:%.*]] = fcmp une float [[TMP26]], 0.000000e+00
1478// CHECK3-NEXT: br i1 [[TOBOOL41]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001479// CHECK3: omp_if.then:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001480// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM42:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB8:[0-9]+]])
1481// CHECK3-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM42]], i32 2)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001482// CHECK3-NEXT: [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
1483// CHECK3-NEXT: br i1 [[TMP28]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
1484// CHECK3: .cancel.exit:
1485// CHECK3-NEXT: br label [[CANCEL_EXIT:%.*]]
1486// CHECK3: omp_section_loop.body.case:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001487// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1488// CHECK3-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM10]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001489// CHECK3-NEXT: [[TMP30:%.*]] = icmp eq i32 [[TMP29]], 0
1490// CHECK3-NEXT: br i1 [[TMP30]], label [[OMP_SECTION_LOOP_BODY_CASE_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE_CNCL:%.*]]
1491// CHECK3: omp_section_loop.body.case.split:
1492// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
1493// CHECK3: omp_section_loop.body.case.cncl:
1494// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
Alexey Bataevc84a5442021-06-03 14:13:35 -07001495// CHECK3: omp_section_loop.body.case23:
1496// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM24:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1497// CHECK3-NEXT: [[TMP31:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM24]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001498// CHECK3-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07001499// CHECK3-NEXT: br i1 [[TMP32]], label [[OMP_SECTION_LOOP_BODY_CASE23_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE23_CNCL:%.*]]
1500// CHECK3: omp_section_loop.body.case23.split:
1501// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
1502// CHECK3: omp_section_loop.body.case23.cncl:
1503// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
1504// CHECK3: omp_section_loop.body.case25:
1505// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM26:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1506// CHECK3-NEXT: [[TMP33:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM26]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001507// CHECK3-NEXT: [[TMP34:%.*]] = icmp eq i32 [[TMP33]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07001508// CHECK3-NEXT: br i1 [[TMP34]], label [[OMP_SECTION_LOOP_BODY_CASE25_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE25_CNCL:%.*]]
1509// CHECK3: omp_section_loop.body.case25.split:
1510// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
1511// CHECK3: omp_section_loop.body.case25.cncl:
1512// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001513// CHECK3: .cancel.continue:
1514// CHECK3-NEXT: br label [[OMP_IF_END:%.*]]
1515// CHECK3: omp_if.else:
1516// CHECK3-NEXT: br label [[OMP_IF_END]]
1517// CHECK3: omp_if.end:
1518// CHECK3-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
1519// CHECK3: omp.body.continue:
1520// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1521// CHECK3: omp.inner.for.inc:
1522// CHECK3-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001523// CHECK3-NEXT: [[ADD43:%.*]] = add nsw i32 [[TMP35]], 1
1524// CHECK3-NEXT: store i32 [[ADD43]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001525// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]]
1526// CHECK3: omp.inner.for.end:
1527// CHECK3-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
1528// CHECK3: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001529// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM45:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10:[0-9]+]])
1530// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM45]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001531// CHECK3-NEXT: br label [[OMP_PRECOND_END]]
1532// CHECK3: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001533// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM44:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10]])
1534// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM44]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001535// CHECK3-NEXT: br label [[CANCEL_CONT:%.*]]
1536// CHECK3: omp.precond.end:
1537// CHECK3-NEXT: br label [[CANCEL_CONT]]
1538// CHECK3: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001539// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM46:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1540// CHECK3-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM46]])
1541// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM47:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14:[0-9]+]])
1542// CHECK3-NEXT: [[TMP36:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM47]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001543// CHECK3-NEXT: [[TMP37:%.*]] = bitcast i8* [[TMP36]] to %struct.kmp_task_t_with_privates*
1544// CHECK3-NEXT: [[TMP38:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP37]], i32 0, i32 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07001545// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM48:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14]])
1546// CHECK3-NEXT: [[TMP39:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM48]], i8* [[TMP36]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001547// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
1548// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001549// CHECK3-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001550// CHECK3-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
1551// CHECK3-NEXT: [[TMP40:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
1552// CHECK3-NEXT: ret i32 [[TMP40]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001553//
1554//
1555// CHECK3-LABEL: define {{[^@]+}}@main..omp_par
1556// CHECK3-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[ARGC_ADDR:%.*]], i8*** [[ARGV_ADDR:%.*]]) #[[ATTR1:[0-9]+]] {
1557// CHECK3-NEXT: omp.par.entry:
1558// CHECK3-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
1559// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
1560// CHECK3-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
1561// CHECK3-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
1562// CHECK3-NEXT: br label [[OMP_PAR_REGION:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001563// CHECK3: omp.par.region:
1564// CHECK3-NEXT: [[TMP1:%.*]] = load float, float* @flag, align 4
1565// CHECK3-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP1]], 0.000000e+00
1566// CHECK3-NEXT: br i1 [[TOBOOL]], label [[TMP13:%.*]], label [[TMP2:%.*]]
1567// CHECK3: 2:
1568// CHECK3-NEXT: br label [[TMP3:%.*]]
1569// CHECK3: 3:
1570// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
1571// CHECK3-NEXT: [[CONV:%.*]] = trunc i32 [[TMP4]] to i8
1572// CHECK3-NEXT: [[TMP5:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
1573// CHECK3-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP5]], i64 0
1574// CHECK3-NEXT: [[TMP6:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07001575// CHECK3-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, i8* [[TMP6]], i64 0
1576// CHECK3-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX3]], align 1
1577// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1578// CHECK3-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001579// CHECK3-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07001580// CHECK3-NEXT: br i1 [[TMP8]], label [[DOTCONT:%.*]], label [[DOTCNCL5:%.*]]
1581// CHECK3: .cncl5:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001582// CHECK3-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
1583// CHECK3: .cont:
1584// CHECK3-NEXT: [[TMP9:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
1585// CHECK3-NEXT: [[TMP10:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07001586// CHECK3-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i8*, i8** [[TMP10]], i64 0
1587// CHECK3-NEXT: [[TMP11:%.*]] = load i8*, i8** [[ARRAYIDX6]], align 8
1588// CHECK3-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, i8* [[TMP11]], i64 0
1589// CHECK3-NEXT: [[TMP12:%.*]] = load i8, i8* [[ARRAYIDX7]], align 1
1590// CHECK3-NEXT: [[CONV8:%.*]] = sext i8 [[TMP12]] to i32
1591// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV8]], [[TMP9]]
1592// CHECK3-NEXT: [[CONV9:%.*]] = trunc i32 [[ADD]] to i8
1593// CHECK3-NEXT: store i8 [[CONV9]], i8* [[ARRAYIDX7]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001594// CHECK3-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]]
1595// CHECK3: omp.par.pre_finalize:
1596// CHECK3-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
1597// CHECK3: 13:
1598// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1599// CHECK3-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 1)
1600// CHECK3-NEXT: [[TMP15:%.*]] = icmp eq i32 [[TMP14]], 0
1601// CHECK3-NEXT: br i1 [[TMP15]], label [[DOTSPLIT:%.*]], label [[DOTCNCL:%.*]]
1602// CHECK3: .cncl:
Alexey Bataevc84a5442021-06-03 14:13:35 -07001603// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1604// CHECK3-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001605// CHECK3-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
1606// CHECK3: .split:
1607// CHECK3-NEXT: br label [[TMP3]]
Vyacheslav Zakharin2e192ab2021-08-24 16:19:49 -07001608// CHECK3: omp.par.outlined.exit.exitStub:
1609// CHECK3-NEXT: ret void
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001610//
1611//
1612// CHECK3-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001613// CHECK3-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001614// CHECK3-NEXT: entry:
1615// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
1616// CHECK3-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
1617// CHECK3-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
1618// CHECK3-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
1619// CHECK3-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
1620// CHECK3-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
1621// CHECK3-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
1622// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
1623// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
1624// CHECK3-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
1625// CHECK3-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
1626// CHECK3-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
1627// CHECK3-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
1628// CHECK3-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
1629// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
1630// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
1631// CHECK3-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
1632// CHECK3-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
1633// CHECK3-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001634// CHECK3-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
1635// CHECK3-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
1636// CHECK3-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
1637// CHECK3-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
1638// CHECK3-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
1639// CHECK3-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
1640// CHECK3-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
1641// CHECK3-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
1642// CHECK3-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
1643// CHECK3-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
1644// CHECK3-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001645// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM_I:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB12:[0-9]+]]) #[[ATTR2:[0-9]+]]
1646// CHECK3-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM_I]], i32 4) #[[ATTR2]]
1647// CHECK3-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
1648// CHECK3-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
1649// CHECK3: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001650// CHECK3-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001651// CHECK3-NEXT: br label [[DOTOMP_OUTLINED__EXIT:%.*]]
1652// CHECK3: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001653// CHECK3-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001654// CHECK3-NEXT: br label [[DOTOMP_OUTLINED__EXIT]]
1655// CHECK3: .omp_outlined..exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04001656// CHECK3-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001657// CHECK3-NEXT: ret i32 0
1658//
1659//
1660// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001661// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001662// CHECK3-NEXT: entry:
1663// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1664// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1665// CHECK3-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
1666// CHECK3-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
1667// CHECK3-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
1668// CHECK3-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
1669// CHECK3-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
1670// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1671// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1672// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1673// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1674// CHECK3-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
1675// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
1676// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB17:[0-9]+]])
1677// CHECK3-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001678// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1679// CHECK3-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 0
1680// CHECK3-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 0
1681// CHECK3-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
1682// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1683// CHECK3-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001684// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1685// CHECK3: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001686// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1687// CHECK3-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1688// CHECK3-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001689// CHECK3-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1690// CHECK3: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001691// CHECK3-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1692// CHECK3-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001693// CHECK3-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
1694// CHECK3-NEXT: ]
1695// CHECK3: .omp.sections.case:
1696// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001697// CHECK3-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
1698// CHECK3-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
1699// CHECK3-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001700// CHECK3: .omp.sections.case.split:
1701// CHECK3-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
1702// CHECK3: .omp.sections.case.cncl:
1703// CHECK3-NEXT: br label [[CANCEL_CONT:%.*]]
1704// CHECK3: .omp.sections.exit:
1705// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1706// CHECK3: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001707// CHECK3-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1708// CHECK3-NEXT: [[INC:%.*]] = add nsw i32 [[TMP9]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001709// CHECK3-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
1710// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]]
1711// CHECK3: omp.inner.for.end:
1712// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19:[0-9]+]])
1713// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
1714// CHECK3-NEXT: br label [[CANCEL_CONT]]
1715// CHECK3: cancel.cont:
1716// CHECK3-NEXT: ret void
1717// CHECK3: cancel.exit:
1718// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19]])
1719// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
1720// CHECK3-NEXT: br label [[CANCEL_CONT]]
1721//
1722//
1723// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001724// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001725// CHECK3-NEXT: entry:
1726// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1727// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
1728// CHECK3-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
1729// CHECK3-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
1730// CHECK3-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
1731// CHECK3-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
1732// CHECK3-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
1733// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1734// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
1735// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1736// CHECK3-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1737// CHECK3-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
1738// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
1739// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB21:[0-9]+]])
1740// CHECK3-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001741// CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1742// CHECK3-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 1
1743// CHECK3-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 1
1744// CHECK3-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
1745// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
1746// CHECK3-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001747// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1748// CHECK3: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001749// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1750// CHECK3-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
1751// CHECK3-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001752// CHECK3-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1753// CHECK3: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001754// CHECK3-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1755// CHECK3-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001756// CHECK3-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
1757// CHECK3-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE2:%.*]]
1758// CHECK3-NEXT: ]
1759// CHECK3: .omp.sections.case:
1760// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001761// CHECK3-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
1762// CHECK3-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
1763// CHECK3-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001764// CHECK3: .omp.sections.case.split:
1765// CHECK3-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
1766// CHECK3: .omp.sections.case.cncl:
1767// CHECK3-NEXT: br label [[CANCEL_CONT:%.*]]
1768// CHECK3: .omp.sections.case2:
1769// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001770// CHECK3-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]], i32 3)
1771// CHECK3-NEXT: [[TMP10:%.*]] = icmp eq i32 [[TMP9]], 0
1772// CHECK3-NEXT: br i1 [[TMP10]], label [[DOTOMP_SECTIONS_CASE2_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE2_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001773// CHECK3: .omp.sections.case2.split:
1774// CHECK3-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
1775// CHECK3: .omp.sections.case2.cncl:
1776// CHECK3-NEXT: br label [[OMP_INNER_FOR_END]]
1777// CHECK3: .omp.sections.exit:
1778// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1779// CHECK3: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001780// CHECK3-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
1781// CHECK3-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001782// CHECK3-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
1783// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]]
1784// CHECK3: omp.inner.for.end:
1785// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23:[0-9]+]])
1786// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM5]])
1787// CHECK3-NEXT: br label [[CANCEL_CONT]]
1788// CHECK3: cancel.cont:
1789// CHECK3-NEXT: ret void
1790// CHECK3: cancel.exit:
1791// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23]])
1792// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
1793// CHECK3-NEXT: br label [[CANCEL_CONT]]
1794//
1795//
1796// CHECK3-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001797// CHECK3-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001798// CHECK3-NEXT: entry:
1799// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
1800// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001801// CHECK3-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
1802// CHECK3-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001803// CHECK3-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1804// CHECK3-NEXT: [[TMP:%.*]] = alloca i32, align 4
1805// CHECK3-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
1806// CHECK3-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
1807// CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4
1808// CHECK3-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1809// CHECK3-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1810// CHECK3-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1811// CHECK3-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001812// CHECK3-NEXT: [[R3:%.*]] = alloca i32, align 4
1813// CHECK3-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001814// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
1815// CHECK3-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
1816// CHECK3-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001817// CHECK3-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
1818// CHECK3-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
1819// CHECK3-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
1820// CHECK3-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
1821// CHECK3-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
1822// CHECK3-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
1823// CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1824// CHECK3-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001825// CHECK3-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
1826// CHECK3-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
1827// CHECK3-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
1828// CHECK3-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001829// CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
1830// CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001831// CHECK3-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
1832// CHECK3: omp.precond.then:
1833// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001834// CHECK3-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1835// CHECK3-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001836// CHECK3-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
1837// CHECK3-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001838// CHECK3-NEXT: store i32 0, i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001839// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB25:[0-9]+]])
1840// CHECK3-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001841// CHECK3-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1842// CHECK3-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
1843// CHECK3-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP6]], [[TMP7]]
1844// CHECK3-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001845// CHECK3: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001846// CHECK3-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001847// CHECK3-NEXT: br label [[COND_END:%.*]]
1848// CHECK3: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001849// CHECK3-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001850// CHECK3-NEXT: br label [[COND_END]]
1851// CHECK3: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001852// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ [[TMP8]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001853// CHECK3-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001854// CHECK3-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
1855// CHECK3-NEXT: store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001856// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1857// CHECK3: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001858// CHECK3-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1859// CHECK3-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
1860// CHECK3-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
1861// CHECK3-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001862// CHECK3: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001863// CHECK3-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1864// CHECK3-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001865// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001866// CHECK3-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
1867// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB27:[0-9]+]])
1868// CHECK3-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM7]], i32 2)
1869// CHECK3-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
1870// CHECK3-NEXT: br i1 [[TMP15]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001871// CHECK3: .cancel.exit:
1872// CHECK3-NEXT: br label [[CANCEL_EXIT:%.*]]
1873// CHECK3: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001874// CHECK3-NEXT: [[TMP16:%.*]] = load i32, i32* [[I4]], align 4
1875// CHECK3-NEXT: [[TMP17:%.*]] = load i32, i32* [[R3]], align 4
1876// CHECK3-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP17]], [[TMP16]]
1877// CHECK3-NEXT: store i32 [[ADD8]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001878// CHECK3-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
1879// CHECK3: omp.body.continue:
1880// CHECK3-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1881// CHECK3: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001882// CHECK3-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
1883// CHECK3-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP18]], 1
1884// CHECK3-NEXT: store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001885// CHECK3-NEXT: br label [[OMP_INNER_FOR_COND]]
1886// CHECK3: omp.inner.for.end:
1887// CHECK3-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
1888// CHECK3: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001889// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29:[0-9]+]])
1890// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
1891// CHECK3-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
1892// CHECK3-NEXT: [[TMP20:%.*]] = bitcast i32* [[R3]] to i8*
1893// CHECK3-NEXT: store i8* [[TMP20]], i8** [[TMP19]], align 8
1894// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
1895// CHECK3-NEXT: [[TMP21:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
1896// CHECK3-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB30:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]], i32 1, i64 8, i8* [[TMP21]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
1897// CHECK3-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001898// CHECK3-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
1899// CHECK3-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
1900// CHECK3-NEXT: ]
1901// CHECK3: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001902// CHECK3-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP1]], align 4
1903// CHECK3-NEXT: [[TMP24:%.*]] = load i32, i32* [[R3]], align 4
1904// CHECK3-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
1905// CHECK3-NEXT: store i32 [[ADD13]], i32* [[TMP1]], align 4
1906// CHECK3-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB30]], i32 [[OMP_GLOBAL_THREAD_NUM12]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001907// CHECK3-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
1908// CHECK3: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001909// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
1910// CHECK3-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM10]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001911// CHECK3-NEXT: br label [[CANCEL_CONT:%.*]]
1912// CHECK3: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07001913// CHECK3-NEXT: [[TMP25:%.*]] = load i32, i32* [[R3]], align 4
1914// CHECK3-NEXT: [[TMP26:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP25]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001915// CHECK3-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
1916// CHECK3: .omp.reduction.default:
1917// CHECK3-NEXT: br label [[OMP_PRECOND_END]]
1918// CHECK3: omp.precond.end:
1919// CHECK3-NEXT: br label [[CANCEL_CONT]]
1920// CHECK3: cancel.cont:
1921// CHECK3-NEXT: ret void
1922//
1923//
1924// CHECK3-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001925// CHECK3-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001926// CHECK3-NEXT: entry:
1927// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
1928// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
1929// CHECK3-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
1930// CHECK3-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
1931// CHECK3-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
1932// CHECK3-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
1933// CHECK3-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
1934// CHECK3-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
1935// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
1936// CHECK3-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
1937// CHECK3-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
1938// CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
1939// CHECK3-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
1940// CHECK3-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
1941// CHECK3-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
1942// CHECK3-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
1943// CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
1944// CHECK3-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
1945// CHECK3-NEXT: ret void
1946//
1947//
1948// CHECK4-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +09001949// CHECK4-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001950// CHECK4-NEXT: entry:
1951// CHECK4-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
1952// CHECK4-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
1953// CHECK4-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
1954// CHECK4-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
1955// CHECK4-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
1956// CHECK4-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
1957// CHECK4-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001958// CHECK4-NEXT: [[P_LASTITER27:%.*]] = alloca i32, align 4
1959// CHECK4-NEXT: [[P_LOWERBOUND28:%.*]] = alloca i32, align 4
1960// CHECK4-NEXT: [[P_UPPERBOUND29:%.*]] = alloca i32, align 4
1961// CHECK4-NEXT: [[P_STRIDE30:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001962// CHECK4-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1963// CHECK4-NEXT: [[TMP:%.*]] = alloca i32, align 4
1964// CHECK4-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001965// CHECK4-NEXT: [[DOTCAPTURE_EXPR_34:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001966// CHECK4-NEXT: [[I:%.*]] = alloca i32, align 4
1967// CHECK4-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1968// CHECK4-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1969// CHECK4-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1970// CHECK4-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001971// CHECK4-NEXT: [[I36:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001972// CHECK4-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
1973// CHECK4-NEXT: [[R:%.*]] = alloca i32, align 4
1974// CHECK4-NEXT: store i32 0, i32* [[RETVAL]], align 4
1975// CHECK4-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
1976// CHECK4-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
1977// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
1978// CHECK4-NEXT: br label [[OMP_PARALLEL:%.*]]
1979// CHECK4: omp_parallel:
1980// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i8***)* @main..omp_par to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]])
1981// CHECK4-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
1982// CHECK4: omp.par.outlined.exit:
1983// CHECK4-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
1984// CHECK4: omp.par.exit.split:
1985// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER:%.*]]
1986// CHECK4: omp_section_loop.preheader:
1987// CHECK4-NEXT: store i32 0, i32* [[P_LOWERBOUND]], align 4
1988// CHECK4-NEXT: store i32 0, i32* [[P_UPPERBOUND]], align 4
1989// CHECK4-NEXT: store i32 1, i32* [[P_STRIDE]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07001990// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1991// CHECK4-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]], i32 34, i32* [[P_LASTITER]], i32* [[P_LOWERBOUND]], i32* [[P_UPPERBOUND]], i32* [[P_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07001992// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[P_LOWERBOUND]], align 4
1993// CHECK4-NEXT: [[TMP1:%.*]] = load i32, i32* [[P_UPPERBOUND]], align 4
1994// CHECK4-NEXT: [[TMP2:%.*]] = sub i32 [[TMP1]], [[TMP0]]
1995// CHECK4-NEXT: [[TMP3:%.*]] = add i32 [[TMP2]], 1
1996// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_HEADER:%.*]]
1997// CHECK4: omp_section_loop.header:
1998// CHECK4-NEXT: [[OMP_SECTION_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER]] ], [ [[OMP_SECTION_LOOP_NEXT:%.*]], [[OMP_SECTION_LOOP_INC:%.*]] ]
1999// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_COND:%.*]]
2000// CHECK4: omp_section_loop.cond:
2001// CHECK4-NEXT: [[OMP_SECTION_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV]], [[TMP3]]
2002// CHECK4-NEXT: br i1 [[OMP_SECTION_LOOP_CMP]], label [[OMP_SECTION_LOOP_BODY:%.*]], label [[OMP_SECTION_LOOP_EXIT:%.*]]
2003// CHECK4: omp_section_loop.body:
2004// CHECK4-NEXT: [[TMP4:%.*]] = add i32 [[OMP_SECTION_LOOP_IV]], [[TMP0]]
2005// CHECK4-NEXT: [[TMP5:%.*]] = mul i32 [[TMP4]], 1
2006// CHECK4-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], 0
2007// CHECK4-NEXT: switch i32 [[TMP6]], label [[OMP_SECTION_LOOP_INC]] [
2008// CHECK4-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE:%.*]]
2009// CHECK4-NEXT: ]
2010// CHECK4: omp_section_loop.inc:
2011// CHECK4-NEXT: [[OMP_SECTION_LOOP_NEXT]] = add nuw i32 [[OMP_SECTION_LOOP_IV]], 1
2012// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_HEADER]]
2013// CHECK4: omp_section_loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002014// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
2015// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2016// CHECK4-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002017// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_AFTER:%.*]]
2018// CHECK4: omp_section_loop.after:
2019// CHECK4-NEXT: br label [[OMP_SECTIONS_END:%.*]]
2020// CHECK4: omp_sections.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002021// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER13:%.*]]
2022// CHECK4: omp_section_loop.preheader13:
2023// CHECK4-NEXT: store i32 0, i32* [[P_LOWERBOUND28]], align 4
2024// CHECK4-NEXT: store i32 1, i32* [[P_UPPERBOUND29]], align 4
2025// CHECK4-NEXT: store i32 1, i32* [[P_STRIDE30]], align 4
2026// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM31:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2027// CHECK4-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]], i32 34, i32* [[P_LASTITER27]], i32* [[P_LOWERBOUND28]], i32* [[P_UPPERBOUND29]], i32* [[P_STRIDE30]], i32 1, i32 1)
2028// CHECK4-NEXT: [[TMP7:%.*]] = load i32, i32* [[P_LOWERBOUND28]], align 4
2029// CHECK4-NEXT: [[TMP8:%.*]] = load i32, i32* [[P_UPPERBOUND29]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002030// CHECK4-NEXT: [[TMP9:%.*]] = sub i32 [[TMP8]], [[TMP7]]
2031// CHECK4-NEXT: [[TMP10:%.*]] = add i32 [[TMP9]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07002032// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_HEADER14:%.*]]
2033// CHECK4: omp_section_loop.header14:
2034// CHECK4-NEXT: [[OMP_SECTION_LOOP_IV20:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER13]] ], [ [[OMP_SECTION_LOOP_NEXT22:%.*]], [[OMP_SECTION_LOOP_INC17:%.*]] ]
2035// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_COND15:%.*]]
2036// CHECK4: omp_section_loop.cond15:
2037// CHECK4-NEXT: [[OMP_SECTION_LOOP_CMP21:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV20]], [[TMP10]]
2038// CHECK4-NEXT: br i1 [[OMP_SECTION_LOOP_CMP21]], label [[OMP_SECTION_LOOP_BODY16:%.*]], label [[OMP_SECTION_LOOP_EXIT18:%.*]]
2039// CHECK4: omp_section_loop.body16:
2040// CHECK4-NEXT: [[TMP11:%.*]] = add i32 [[OMP_SECTION_LOOP_IV20]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002041// CHECK4-NEXT: [[TMP12:%.*]] = mul i32 [[TMP11]], 1
2042// CHECK4-NEXT: [[TMP13:%.*]] = add i32 [[TMP12]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07002043// CHECK4-NEXT: switch i32 [[TMP13]], label [[OMP_SECTION_LOOP_INC17]] [
2044// CHECK4-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE23:%.*]]
2045// CHECK4-NEXT: i32 1, label [[OMP_SECTION_LOOP_BODY_CASE25:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002046// CHECK4-NEXT: ]
Alexey Bataevc84a5442021-06-03 14:13:35 -07002047// CHECK4: omp_section_loop.inc17:
2048// CHECK4-NEXT: [[OMP_SECTION_LOOP_NEXT22]] = add nuw i32 [[OMP_SECTION_LOOP_IV20]], 1
2049// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_HEADER14]]
2050// CHECK4: omp_section_loop.exit18:
2051// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]])
2052// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM32:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2053// CHECK4-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM32]])
2054// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_AFTER19:%.*]]
2055// CHECK4: omp_section_loop.after19:
2056// CHECK4-NEXT: br label [[OMP_SECTIONS_END33:%.*]]
2057// CHECK4: omp_sections.end33:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002058// CHECK4-NEXT: [[TMP14:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
2059// CHECK4-NEXT: store i32 [[TMP14]], i32* [[DOTCAPTURE_EXPR_]], align 4
2060// CHECK4-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2061// CHECK4-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP15]], 0
2062// CHECK4-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07002063// CHECK4-NEXT: [[SUB35:%.*]] = sub nsw i32 [[DIV]], 1
2064// CHECK4-NEXT: store i32 [[SUB35]], i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002065// CHECK4-NEXT: store i32 0, i32* [[I]], align 4
2066// CHECK4-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2067// CHECK4-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP16]]
2068// CHECK4-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2069// CHECK4: omp.precond.then:
2070// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002071// CHECK4-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002072// CHECK4-NEXT: store i32 [[TMP17]], i32* [[DOTOMP_UB]], align 4
2073// CHECK4-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2074// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002075// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM37:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB6:[0-9]+]])
2076// CHECK4-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM37]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002077// CHECK4-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002078// CHECK4-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
2079// CHECK4-NEXT: [[CMP38:%.*]] = icmp sgt i32 [[TMP18]], [[TMP19]]
2080// CHECK4-NEXT: br i1 [[CMP38]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002081// CHECK4: cond.true:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002082// CHECK4-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002083// CHECK4-NEXT: br label [[COND_END:%.*]]
2084// CHECK4: cond.false:
2085// CHECK4-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2086// CHECK4-NEXT: br label [[COND_END]]
2087// CHECK4: cond.end:
2088// CHECK4-NEXT: [[COND:%.*]] = phi i32 [ [[TMP20]], [[COND_TRUE]] ], [ [[TMP21]], [[COND_FALSE]] ]
2089// CHECK4-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
2090// CHECK4-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2091// CHECK4-NEXT: store i32 [[TMP22]], i32* [[DOTOMP_IV]], align 4
2092// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2093// CHECK4: omp.inner.for.cond:
2094// CHECK4-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2095// CHECK4-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002096// CHECK4-NEXT: [[CMP39:%.*]] = icmp sle i32 [[TMP23]], [[TMP24]]
2097// CHECK4-NEXT: br i1 [[CMP39]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002098// CHECK4: omp.inner.for.body:
2099// CHECK4-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2100// CHECK4-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP25]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07002101// CHECK4-NEXT: [[ADD40:%.*]] = add nsw i32 0, [[MUL]]
2102// CHECK4-NEXT: store i32 [[ADD40]], i32* [[I36]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002103// CHECK4-NEXT: [[TMP26:%.*]] = load float, float* @flag, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002104// CHECK4-NEXT: [[TOBOOL41:%.*]] = fcmp une float [[TMP26]], 0.000000e+00
2105// CHECK4-NEXT: br i1 [[TOBOOL41]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002106// CHECK4: omp_if.then:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002107// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM42:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB8:[0-9]+]])
2108// CHECK4-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM42]], i32 2)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002109// CHECK4-NEXT: [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
2110// CHECK4-NEXT: br i1 [[TMP28]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
2111// CHECK4: .cancel.exit:
2112// CHECK4-NEXT: br label [[CANCEL_EXIT:%.*]]
2113// CHECK4: omp_section_loop.body.case:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002114// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2115// CHECK4-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM10]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002116// CHECK4-NEXT: [[TMP30:%.*]] = icmp eq i32 [[TMP29]], 0
2117// CHECK4-NEXT: br i1 [[TMP30]], label [[OMP_SECTION_LOOP_BODY_CASE_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE_CNCL:%.*]]
2118// CHECK4: omp_section_loop.body.case.split:
2119// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
2120// CHECK4: omp_section_loop.body.case.cncl:
2121// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
Alexey Bataevc84a5442021-06-03 14:13:35 -07002122// CHECK4: omp_section_loop.body.case23:
2123// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM24:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2124// CHECK4-NEXT: [[TMP31:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM24]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002125// CHECK4-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07002126// CHECK4-NEXT: br i1 [[TMP32]], label [[OMP_SECTION_LOOP_BODY_CASE23_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE23_CNCL:%.*]]
2127// CHECK4: omp_section_loop.body.case23.split:
2128// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
2129// CHECK4: omp_section_loop.body.case23.cncl:
2130// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
2131// CHECK4: omp_section_loop.body.case25:
2132// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM26:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2133// CHECK4-NEXT: [[TMP33:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM26]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002134// CHECK4-NEXT: [[TMP34:%.*]] = icmp eq i32 [[TMP33]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07002135// CHECK4-NEXT: br i1 [[TMP34]], label [[OMP_SECTION_LOOP_BODY_CASE25_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE25_CNCL:%.*]]
2136// CHECK4: omp_section_loop.body.case25.split:
2137// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
2138// CHECK4: omp_section_loop.body.case25.cncl:
2139// CHECK4-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002140// CHECK4: .cancel.continue:
2141// CHECK4-NEXT: br label [[OMP_IF_END:%.*]]
2142// CHECK4: omp_if.else:
2143// CHECK4-NEXT: br label [[OMP_IF_END]]
2144// CHECK4: omp_if.end:
2145// CHECK4-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2146// CHECK4: omp.body.continue:
2147// CHECK4-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2148// CHECK4: omp.inner.for.inc:
2149// CHECK4-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002150// CHECK4-NEXT: [[ADD43:%.*]] = add nsw i32 [[TMP35]], 1
2151// CHECK4-NEXT: store i32 [[ADD43]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002152// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND]]
2153// CHECK4: omp.inner.for.end:
2154// CHECK4-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2155// CHECK4: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002156// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM45:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10:[0-9]+]])
2157// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM45]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002158// CHECK4-NEXT: br label [[OMP_PRECOND_END]]
2159// CHECK4: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002160// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM44:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10]])
2161// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM44]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002162// CHECK4-NEXT: br label [[CANCEL_CONT:%.*]]
2163// CHECK4: omp.precond.end:
2164// CHECK4-NEXT: br label [[CANCEL_CONT]]
2165// CHECK4: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002166// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM46:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2167// CHECK4-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM46]])
2168// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM47:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14:[0-9]+]])
2169// CHECK4-NEXT: [[TMP36:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM47]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002170// CHECK4-NEXT: [[TMP37:%.*]] = bitcast i8* [[TMP36]] to %struct.kmp_task_t_with_privates*
2171// CHECK4-NEXT: [[TMP38:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP37]], i32 0, i32 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07002172// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM48:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14]])
2173// CHECK4-NEXT: [[TMP39:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM48]], i8* [[TMP36]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002174// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
2175// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002176// CHECK4-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002177// CHECK4-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
2178// CHECK4-NEXT: [[TMP40:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
2179// CHECK4-NEXT: ret i32 [[TMP40]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002180//
2181//
2182// CHECK4-LABEL: define {{[^@]+}}@main..omp_par
2183// CHECK4-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[ARGC_ADDR:%.*]], i8*** [[ARGV_ADDR:%.*]]) #[[ATTR1:[0-9]+]] {
2184// CHECK4-NEXT: omp.par.entry:
2185// CHECK4-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
2186// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
2187// CHECK4-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
2188// CHECK4-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
2189// CHECK4-NEXT: br label [[OMP_PAR_REGION:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002190// CHECK4: omp.par.region:
2191// CHECK4-NEXT: [[TMP1:%.*]] = load float, float* @flag, align 4
2192// CHECK4-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP1]], 0.000000e+00
2193// CHECK4-NEXT: br i1 [[TOBOOL]], label [[TMP13:%.*]], label [[TMP2:%.*]]
2194// CHECK4: 2:
2195// CHECK4-NEXT: br label [[TMP3:%.*]]
2196// CHECK4: 3:
2197// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
2198// CHECK4-NEXT: [[CONV:%.*]] = trunc i32 [[TMP4]] to i8
2199// CHECK4-NEXT: [[TMP5:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
2200// CHECK4-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP5]], i64 0
2201// CHECK4-NEXT: [[TMP6:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07002202// CHECK4-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, i8* [[TMP6]], i64 0
2203// CHECK4-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX3]], align 1
2204// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2205// CHECK4-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002206// CHECK4-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07002207// CHECK4-NEXT: br i1 [[TMP8]], label [[DOTCONT:%.*]], label [[DOTCNCL5:%.*]]
2208// CHECK4: .cncl5:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002209// CHECK4-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
2210// CHECK4: .cont:
2211// CHECK4-NEXT: [[TMP9:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
2212// CHECK4-NEXT: [[TMP10:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07002213// CHECK4-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i8*, i8** [[TMP10]], i64 0
2214// CHECK4-NEXT: [[TMP11:%.*]] = load i8*, i8** [[ARRAYIDX6]], align 8
2215// CHECK4-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, i8* [[TMP11]], i64 0
2216// CHECK4-NEXT: [[TMP12:%.*]] = load i8, i8* [[ARRAYIDX7]], align 1
2217// CHECK4-NEXT: [[CONV8:%.*]] = sext i8 [[TMP12]] to i32
2218// CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV8]], [[TMP9]]
2219// CHECK4-NEXT: [[CONV9:%.*]] = trunc i32 [[ADD]] to i8
2220// CHECK4-NEXT: store i8 [[CONV9]], i8* [[ARRAYIDX7]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002221// CHECK4-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]]
2222// CHECK4: omp.par.pre_finalize:
2223// CHECK4-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
2224// CHECK4: 13:
2225// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2226// CHECK4-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 1)
2227// CHECK4-NEXT: [[TMP15:%.*]] = icmp eq i32 [[TMP14]], 0
2228// CHECK4-NEXT: br i1 [[TMP15]], label [[DOTSPLIT:%.*]], label [[DOTCNCL:%.*]]
2229// CHECK4: .cncl:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002230// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2231// CHECK4-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002232// CHECK4-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
2233// CHECK4: .split:
2234// CHECK4-NEXT: br label [[TMP3]]
Vyacheslav Zakharin2e192ab2021-08-24 16:19:49 -07002235// CHECK4: omp.par.outlined.exit.exitStub:
2236// CHECK4-NEXT: ret void
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002237//
2238//
2239// CHECK4-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002240// CHECK4-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002241// CHECK4-NEXT: entry:
2242// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
2243// CHECK4-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
2244// CHECK4-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
2245// CHECK4-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
2246// CHECK4-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
2247// CHECK4-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
2248// CHECK4-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
2249// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
2250// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
2251// CHECK4-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
2252// CHECK4-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
2253// CHECK4-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
2254// CHECK4-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
2255// CHECK4-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
2256// CHECK4-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
2257// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
2258// CHECK4-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
2259// CHECK4-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
2260// CHECK4-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002261// CHECK4-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
2262// CHECK4-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
2263// CHECK4-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
2264// CHECK4-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
2265// CHECK4-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
2266// CHECK4-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
2267// CHECK4-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
2268// CHECK4-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
2269// CHECK4-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
2270// CHECK4-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
2271// CHECK4-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002272// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM_I:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB12:[0-9]+]]) #[[ATTR2:[0-9]+]]
2273// CHECK4-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM_I]], i32 4) #[[ATTR2]]
2274// CHECK4-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
2275// CHECK4-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
2276// CHECK4: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002277// CHECK4-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002278// CHECK4-NEXT: br label [[DOTOMP_OUTLINED__EXIT:%.*]]
2279// CHECK4: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002280// CHECK4-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002281// CHECK4-NEXT: br label [[DOTOMP_OUTLINED__EXIT]]
2282// CHECK4: .omp_outlined..exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002283// CHECK4-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002284// CHECK4-NEXT: ret i32 0
2285//
2286//
2287// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002288// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002289// CHECK4-NEXT: entry:
2290// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2291// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2292// CHECK4-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
2293// CHECK4-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
2294// CHECK4-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
2295// CHECK4-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
2296// CHECK4-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
2297// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2298// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2299// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2300// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2301// CHECK4-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
2302// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
2303// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB17:[0-9]+]])
2304// CHECK4-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002305// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2306// CHECK4-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 0
2307// CHECK4-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 0
2308// CHECK4-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
2309// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2310// CHECK4-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002311// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2312// CHECK4: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002313// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2314// CHECK4-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2315// CHECK4-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002316// CHECK4-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2317// CHECK4: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002318// CHECK4-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2319// CHECK4-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002320// CHECK4-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
2321// CHECK4-NEXT: ]
2322// CHECK4: .omp.sections.case:
2323// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002324// CHECK4-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
2325// CHECK4-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
2326// CHECK4-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002327// CHECK4: .omp.sections.case.split:
2328// CHECK4-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
2329// CHECK4: .omp.sections.case.cncl:
2330// CHECK4-NEXT: br label [[CANCEL_CONT:%.*]]
2331// CHECK4: .omp.sections.exit:
2332// CHECK4-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2333// CHECK4: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002334// CHECK4-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2335// CHECK4-NEXT: [[INC:%.*]] = add nsw i32 [[TMP9]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002336// CHECK4-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
2337// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND]]
2338// CHECK4: omp.inner.for.end:
2339// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19:[0-9]+]])
2340// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
2341// CHECK4-NEXT: br label [[CANCEL_CONT]]
2342// CHECK4: cancel.cont:
2343// CHECK4-NEXT: ret void
2344// CHECK4: cancel.exit:
2345// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19]])
2346// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
2347// CHECK4-NEXT: br label [[CANCEL_CONT]]
2348//
2349//
2350// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002351// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002352// CHECK4-NEXT: entry:
2353// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2354// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2355// CHECK4-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
2356// CHECK4-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
2357// CHECK4-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
2358// CHECK4-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
2359// CHECK4-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
2360// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2361// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2362// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2363// CHECK4-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2364// CHECK4-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
2365// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
2366// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB21:[0-9]+]])
2367// CHECK4-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002368// CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2369// CHECK4-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 1
2370// CHECK4-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 1
2371// CHECK4-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
2372// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2373// CHECK4-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002374// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2375// CHECK4: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002376// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2377// CHECK4-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2378// CHECK4-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002379// CHECK4-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2380// CHECK4: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002381// CHECK4-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2382// CHECK4-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002383// CHECK4-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
2384// CHECK4-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE2:%.*]]
2385// CHECK4-NEXT: ]
2386// CHECK4: .omp.sections.case:
2387// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002388// CHECK4-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
2389// CHECK4-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
2390// CHECK4-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002391// CHECK4: .omp.sections.case.split:
2392// CHECK4-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
2393// CHECK4: .omp.sections.case.cncl:
2394// CHECK4-NEXT: br label [[CANCEL_CONT:%.*]]
2395// CHECK4: .omp.sections.case2:
2396// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002397// CHECK4-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]], i32 3)
2398// CHECK4-NEXT: [[TMP10:%.*]] = icmp eq i32 [[TMP9]], 0
2399// CHECK4-NEXT: br i1 [[TMP10]], label [[DOTOMP_SECTIONS_CASE2_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE2_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002400// CHECK4: .omp.sections.case2.split:
2401// CHECK4-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
2402// CHECK4: .omp.sections.case2.cncl:
2403// CHECK4-NEXT: br label [[OMP_INNER_FOR_END]]
2404// CHECK4: .omp.sections.exit:
2405// CHECK4-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2406// CHECK4: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002407// CHECK4-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2408// CHECK4-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002409// CHECK4-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
2410// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND]]
2411// CHECK4: omp.inner.for.end:
2412// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23:[0-9]+]])
2413// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM5]])
2414// CHECK4-NEXT: br label [[CANCEL_CONT]]
2415// CHECK4: cancel.cont:
2416// CHECK4-NEXT: ret void
2417// CHECK4: cancel.exit:
2418// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23]])
2419// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
2420// CHECK4-NEXT: br label [[CANCEL_CONT]]
2421//
2422//
2423// CHECK4-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002424// CHECK4-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002425// CHECK4-NEXT: entry:
2426// CHECK4-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2427// CHECK4-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002428// CHECK4-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
2429// CHECK4-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002430// CHECK4-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2431// CHECK4-NEXT: [[TMP:%.*]] = alloca i32, align 4
2432// CHECK4-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2433// CHECK4-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
2434// CHECK4-NEXT: [[I:%.*]] = alloca i32, align 4
2435// CHECK4-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2436// CHECK4-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2437// CHECK4-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2438// CHECK4-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002439// CHECK4-NEXT: [[R3:%.*]] = alloca i32, align 4
2440// CHECK4-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002441// CHECK4-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
2442// CHECK4-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2443// CHECK4-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002444// CHECK4-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
2445// CHECK4-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
2446// CHECK4-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
2447// CHECK4-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
2448// CHECK4-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
2449// CHECK4-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
2450// CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2451// CHECK4-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002452// CHECK4-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2453// CHECK4-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
2454// CHECK4-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
2455// CHECK4-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002456// CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2457// CHECK4-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002458// CHECK4-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2459// CHECK4: omp.precond.then:
2460// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002461// CHECK4-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2462// CHECK4-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002463// CHECK4-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2464// CHECK4-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002465// CHECK4-NEXT: store i32 0, i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002466// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB25:[0-9]+]])
2467// CHECK4-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002468// CHECK4-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2469// CHECK4-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
2470// CHECK4-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP6]], [[TMP7]]
2471// CHECK4-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002472// CHECK4: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002473// CHECK4-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002474// CHECK4-NEXT: br label [[COND_END:%.*]]
2475// CHECK4: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002476// CHECK4-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002477// CHECK4-NEXT: br label [[COND_END]]
2478// CHECK4: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002479// CHECK4-NEXT: [[COND:%.*]] = phi i32 [ [[TMP8]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002480// CHECK4-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002481// CHECK4-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2482// CHECK4-NEXT: store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002483// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2484// CHECK4: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002485// CHECK4-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2486// CHECK4-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2487// CHECK4-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
2488// CHECK4-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002489// CHECK4: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002490// CHECK4-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2491// CHECK4-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002492// CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002493// CHECK4-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
2494// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB27:[0-9]+]])
2495// CHECK4-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM7]], i32 2)
2496// CHECK4-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
2497// CHECK4-NEXT: br i1 [[TMP15]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002498// CHECK4: .cancel.exit:
2499// CHECK4-NEXT: br label [[CANCEL_EXIT:%.*]]
2500// CHECK4: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002501// CHECK4-NEXT: [[TMP16:%.*]] = load i32, i32* [[I4]], align 4
2502// CHECK4-NEXT: [[TMP17:%.*]] = load i32, i32* [[R3]], align 4
2503// CHECK4-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP17]], [[TMP16]]
2504// CHECK4-NEXT: store i32 [[ADD8]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002505// CHECK4-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2506// CHECK4: omp.body.continue:
2507// CHECK4-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2508// CHECK4: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002509// CHECK4-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2510// CHECK4-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP18]], 1
2511// CHECK4-NEXT: store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002512// CHECK4-NEXT: br label [[OMP_INNER_FOR_COND]]
2513// CHECK4: omp.inner.for.end:
2514// CHECK4-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2515// CHECK4: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002516// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29:[0-9]+]])
2517// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
2518// CHECK4-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
2519// CHECK4-NEXT: [[TMP20:%.*]] = bitcast i32* [[R3]] to i8*
2520// CHECK4-NEXT: store i8* [[TMP20]], i8** [[TMP19]], align 8
2521// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
2522// CHECK4-NEXT: [[TMP21:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
2523// CHECK4-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB30:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]], i32 1, i64 8, i8* [[TMP21]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
2524// CHECK4-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002525// CHECK4-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
2526// CHECK4-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
2527// CHECK4-NEXT: ]
2528// CHECK4: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002529// CHECK4-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP1]], align 4
2530// CHECK4-NEXT: [[TMP24:%.*]] = load i32, i32* [[R3]], align 4
2531// CHECK4-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
2532// CHECK4-NEXT: store i32 [[ADD13]], i32* [[TMP1]], align 4
2533// CHECK4-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB30]], i32 [[OMP_GLOBAL_THREAD_NUM12]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002534// CHECK4-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
2535// CHECK4: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002536// CHECK4-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
2537// CHECK4-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM10]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002538// CHECK4-NEXT: br label [[CANCEL_CONT:%.*]]
2539// CHECK4: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002540// CHECK4-NEXT: [[TMP25:%.*]] = load i32, i32* [[R3]], align 4
2541// CHECK4-NEXT: [[TMP26:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP25]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002542// CHECK4-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
2543// CHECK4: .omp.reduction.default:
2544// CHECK4-NEXT: br label [[OMP_PRECOND_END]]
2545// CHECK4: omp.precond.end:
2546// CHECK4-NEXT: br label [[CANCEL_CONT]]
2547// CHECK4: cancel.cont:
2548// CHECK4-NEXT: ret void
2549//
2550//
2551// CHECK4-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002552// CHECK4-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002553// CHECK4-NEXT: entry:
2554// CHECK4-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
2555// CHECK4-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
2556// CHECK4-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
2557// CHECK4-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
2558// CHECK4-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
2559// CHECK4-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
2560// CHECK4-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
2561// CHECK4-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
2562// CHECK4-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
2563// CHECK4-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
2564// CHECK4-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
2565// CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
2566// CHECK4-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
2567// CHECK4-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
2568// CHECK4-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
2569// CHECK4-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
2570// CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
2571// CHECK4-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
2572// CHECK4-NEXT: ret void
2573//
2574//
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002575// CHECK7-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002576// CHECK7-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002577// CHECK7-NEXT: entry:
2578// CHECK7-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
2579// CHECK7-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
2580// CHECK7-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
2581// CHECK7-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
2582// CHECK7-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
2583// CHECK7-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
2584// CHECK7-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
2585// CHECK7-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
2586// CHECK7-NEXT: [[DOTOMP_SECTIONS_LB_1:%.*]] = alloca i32, align 4
2587// CHECK7-NEXT: [[DOTOMP_SECTIONS_UB_2:%.*]] = alloca i32, align 4
2588// CHECK7-NEXT: [[DOTOMP_SECTIONS_ST_3:%.*]] = alloca i32, align 4
2589// CHECK7-NEXT: [[DOTOMP_SECTIONS_IL_4:%.*]] = alloca i32, align 4
2590// CHECK7-NEXT: [[DOTOMP_SECTIONS_IV_5:%.*]] = alloca i32, align 4
2591// CHECK7-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2592// CHECK7-NEXT: [[TMP:%.*]] = alloca i32, align 4
2593// CHECK7-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
2594// CHECK7-NEXT: [[DOTCAPTURE_EXPR_21:%.*]] = alloca i32, align 4
2595// CHECK7-NEXT: [[I:%.*]] = alloca i32, align 4
2596// CHECK7-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2597// CHECK7-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2598// CHECK7-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2599// CHECK7-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2600// CHECK7-NEXT: [[I24:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002601// CHECK7-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002602// CHECK7-NEXT: [[R:%.*]] = alloca i32, align 4
2603// CHECK7-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
2604// CHECK7-NEXT: store i32 0, i32* [[RETVAL]], align 4
2605// CHECK7-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
2606// CHECK7-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002607// CHECK7-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i8*** [[ARGV_ADDR]], i32* [[ARGC_ADDR]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002608// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2609// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2610// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
2611// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002612// CHECK7-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002613// CHECK7-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2614// CHECK7-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
2615// CHECK7-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 [[TMP1]], i32 0
2616// CHECK7-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
2617// CHECK7-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2618// CHECK7-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002619// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2620// CHECK7: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002621// CHECK7-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2622// CHECK7-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2623// CHECK7-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002624// CHECK7-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2625// CHECK7: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002626// CHECK7-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2627// CHECK7-NEXT: switch i32 [[TMP7]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002628// CHECK7-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
2629// CHECK7-NEXT: ]
2630// CHECK7: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002631// CHECK7-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
2632// CHECK7-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0
2633// CHECK7-NEXT: br i1 [[TMP9]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002634// CHECK7: .cancel.exit:
2635// CHECK7-NEXT: br label [[CANCEL_EXIT:%.*]]
2636// CHECK7: .cancel.continue:
2637// CHECK7-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
2638// CHECK7: .omp.sections.exit:
2639// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2640// CHECK7: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002641// CHECK7-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2642// CHECK7-NEXT: [[INC:%.*]] = add nsw i32 [[TMP10]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002643// CHECK7-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
2644// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND]]
2645// CHECK7: omp.inner.for.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002646// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002647// CHECK7-NEXT: br label [[CANCEL_CONT:%.*]]
2648// CHECK7: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002649// CHECK7-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002650// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
2651// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
2652// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_3]], align 4
2653// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_4]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002654// CHECK7-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_4]], i32* [[DOTOMP_SECTIONS_LB_1]], i32* [[DOTOMP_SECTIONS_UB_2]], i32* [[DOTOMP_SECTIONS_ST_3]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002655// CHECK7-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
2656// CHECK7-NEXT: [[TMP12:%.*]] = icmp slt i32 [[TMP11]], 1
2657// CHECK7-NEXT: [[TMP13:%.*]] = select i1 [[TMP12]], i32 [[TMP11]], i32 1
2658// CHECK7-NEXT: store i32 [[TMP13]], i32* [[DOTOMP_SECTIONS_UB_2]], align 4
2659// CHECK7-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
2660// CHECK7-NEXT: store i32 [[TMP14]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002661// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND6:%.*]]
2662// CHECK7: omp.inner.for.cond6:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002663// CHECK7-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
2664// CHECK7-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
2665// CHECK7-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002666// CHECK7-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY8:%.*]], label [[OMP_INNER_FOR_END18:%.*]]
2667// CHECK7: omp.inner.for.body8:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002668// CHECK7-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
2669// CHECK7-NEXT: switch i32 [[TMP17]], label [[DOTOMP_SECTIONS_EXIT15:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002670// CHECK7-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE9:%.*]]
2671// CHECK7-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE12:%.*]]
2672// CHECK7-NEXT: ]
2673// CHECK7: .omp.sections.case9:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002674// CHECK7-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
2675// CHECK7-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
2676// CHECK7-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT10:%.*]], label [[DOTCANCEL_CONTINUE11:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002677// CHECK7: .cancel.exit10:
2678// CHECK7-NEXT: br label [[CANCEL_EXIT19:%.*]]
2679// CHECK7: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002680// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002681// CHECK7-NEXT: br label [[CANCEL_CONT]]
2682// CHECK7: .cancel.continue11:
2683// CHECK7-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
2684// CHECK7: .omp.sections.case12:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002685// CHECK7-NEXT: [[TMP20:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
2686// CHECK7-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
2687// CHECK7-NEXT: br i1 [[TMP21]], label [[DOTCANCEL_EXIT13:%.*]], label [[DOTCANCEL_CONTINUE14:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002688// CHECK7: .cancel.exit13:
2689// CHECK7-NEXT: br label [[CANCEL_EXIT19]]
2690// CHECK7: .cancel.continue14:
2691// CHECK7-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
2692// CHECK7: .omp.sections.exit15:
2693// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC16:%.*]]
2694// CHECK7: omp.inner.for.inc16:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002695// CHECK7-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
2696// CHECK7-NEXT: [[INC17:%.*]] = add nsw i32 [[TMP22]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002697// CHECK7-NEXT: store i32 [[INC17]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
2698// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND6]]
2699// CHECK7: omp.inner.for.end18:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002700// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002701// CHECK7-NEXT: br label [[CANCEL_CONT20:%.*]]
2702// CHECK7: cancel.cont20:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002703// CHECK7-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002704// CHECK7-NEXT: [[TMP23:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
2705// CHECK7-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR_]], align 4
2706// CHECK7-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2707// CHECK7-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP24]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002708// CHECK7-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
2709// CHECK7-NEXT: [[SUB22:%.*]] = sub nsw i32 [[DIV]], 1
2710// CHECK7-NEXT: store i32 [[SUB22]], i32* [[DOTCAPTURE_EXPR_21]], align 4
2711// CHECK7-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002712// CHECK7-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
2713// CHECK7-NEXT: [[CMP23:%.*]] = icmp slt i32 0, [[TMP25]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002714// CHECK7-NEXT: br i1 [[CMP23]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
2715// CHECK7: omp.precond.then:
2716// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002717// CHECK7-NEXT: [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
2718// CHECK7-NEXT: store i32 [[TMP26]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002719// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
2720// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07002721// CHECK7-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002722// CHECK7-NEXT: [[TMP27:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2723// CHECK7-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
2724// CHECK7-NEXT: [[CMP25:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002725// CHECK7-NEXT: br i1 [[CMP25]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2726// CHECK7: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002727// CHECK7-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002728// CHECK7-NEXT: br label [[COND_END:%.*]]
2729// CHECK7: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002730// CHECK7-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002731// CHECK7-NEXT: br label [[COND_END]]
2732// CHECK7: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002733// CHECK7-NEXT: [[COND:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE]] ], [ [[TMP30]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002734// CHECK7-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002735// CHECK7-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
2736// CHECK7-NEXT: store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002737// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND26:%.*]]
2738// CHECK7: omp.inner.for.cond26:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002739// CHECK7-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2740// CHECK7-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
2741// CHECK7-NEXT: [[CMP27:%.*]] = icmp sle i32 [[TMP32]], [[TMP33]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002742// CHECK7-NEXT: br i1 [[CMP27]], label [[OMP_INNER_FOR_BODY28:%.*]], label [[OMP_INNER_FOR_END33:%.*]]
2743// CHECK7: omp.inner.for.body28:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002744// CHECK7-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2745// CHECK7-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP34]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002746// CHECK7-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2747// CHECK7-NEXT: store i32 [[ADD]], i32* [[I24]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002748// CHECK7-NEXT: [[TMP35:%.*]] = load float, float* @flag, align 4
2749// CHECK7-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP35]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002750// CHECK7-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
2751// CHECK7: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002752// CHECK7-NEXT: [[TMP36:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2)
2753// CHECK7-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 0
2754// CHECK7-NEXT: br i1 [[TMP37]], label [[DOTCANCEL_EXIT29:%.*]], label [[DOTCANCEL_CONTINUE30:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002755// CHECK7: .cancel.exit29:
2756// CHECK7-NEXT: br label [[CANCEL_EXIT34:%.*]]
2757// CHECK7: cancel.exit19:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002758// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002759// CHECK7-NEXT: br label [[CANCEL_CONT20]]
2760// CHECK7: .cancel.continue30:
2761// CHECK7-NEXT: br label [[OMP_IF_END:%.*]]
2762// CHECK7: omp_if.else:
2763// CHECK7-NEXT: br label [[OMP_IF_END]]
2764// CHECK7: omp_if.end:
2765// CHECK7-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2766// CHECK7: omp.body.continue:
2767// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC31:%.*]]
2768// CHECK7: omp.inner.for.inc31:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002769// CHECK7-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
2770// CHECK7-NEXT: [[ADD32:%.*]] = add nsw i32 [[TMP38]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002771// CHECK7-NEXT: store i32 [[ADD32]], i32* [[DOTOMP_IV]], align 4
2772// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND26]]
2773// CHECK7: omp.inner.for.end33:
2774// CHECK7-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2775// CHECK7: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002776// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002777// CHECK7-NEXT: br label [[OMP_PRECOND_END]]
2778// CHECK7: cancel.exit34:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002779// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002780// CHECK7-NEXT: br label [[CANCEL_CONT35:%.*]]
2781// CHECK7: omp.precond.end:
2782// CHECK7-NEXT: br label [[CANCEL_CONT35]]
2783// CHECK7: cancel.cont35:
Alexey Bataevc84a5442021-06-03 14:13:35 -07002784// CHECK7-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002785// CHECK7-NEXT: [[TMP39:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
2786// CHECK7-NEXT: [[TMP40:%.*]] = bitcast i8* [[TMP39]] to %struct.kmp_task_t_with_privates*
2787// CHECK7-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP40]], i32 0, i32 0
2788// CHECK7-NEXT: [[TMP42:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP39]])
2789// CHECK7-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
2790// CHECK7-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002791// CHECK7-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002792// CHECK7-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
2793// CHECK7-NEXT: [[TMP43:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
2794// CHECK7-NEXT: ret i32 [[TMP43]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002795//
2796//
2797// CHECK7-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002798// CHECK7-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002799// CHECK7-NEXT: entry:
2800// CHECK7-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2801// CHECK7-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002802// CHECK7-NEXT: [[ARGV_ADDR:%.*]] = alloca i8***, align 8
2803// CHECK7-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002804// CHECK7-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2805// CHECK7-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002806// CHECK7-NEXT: store i8*** [[ARGV]], i8**** [[ARGV_ADDR]], align 8
2807// CHECK7-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
2808// CHECK7-NEXT: [[TMP0:%.*]] = load i8***, i8**** [[ARGV_ADDR]], align 8
2809// CHECK7-NEXT: [[TMP1:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
2810// CHECK7-NEXT: [[TMP2:%.*]] = load float, float* @flag, align 4
2811// CHECK7-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP2]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002812// CHECK7-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
2813// CHECK7: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002814// CHECK7-NEXT: [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2815// CHECK7-NEXT: [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
2816// CHECK7-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i32 1)
2817// CHECK7-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
2818// CHECK7-NEXT: br i1 [[TMP6]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002819// CHECK7: .cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002820// CHECK7-NEXT: [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2821// CHECK7-NEXT: [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
2822// CHECK7-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP8]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002823// CHECK7-NEXT: br label [[RETURN:%.*]]
2824// CHECK7: .cancel.continue:
2825// CHECK7-NEXT: br label [[OMP_IF_END:%.*]]
2826// CHECK7: omp_if.else:
2827// CHECK7-NEXT: br label [[OMP_IF_END]]
2828// CHECK7: omp_if.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002829// CHECK7-NEXT: [[TMP10:%.*]] = load i32, i32* [[TMP1]], align 4
2830// CHECK7-NEXT: [[CONV:%.*]] = trunc i32 [[TMP10]] to i8
2831// CHECK7-NEXT: [[TMP11:%.*]] = load i8**, i8*** [[TMP0]], align 8
2832// CHECK7-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP11]], i64 0
2833// CHECK7-NEXT: [[TMP12:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
2834// CHECK7-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[TMP12]], i64 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002835// CHECK7-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX1]], align 1
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002836// CHECK7-NEXT: [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2837// CHECK7-NEXT: [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
2838// CHECK7-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP14]])
2839// CHECK7-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
2840// CHECK7-NEXT: br i1 [[TMP16]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002841// CHECK7: .cancel.exit2:
2842// CHECK7-NEXT: br label [[RETURN]]
2843// CHECK7: .cancel.continue3:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002844// CHECK7-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP1]], align 4
2845// CHECK7-NEXT: [[TMP18:%.*]] = load i8**, i8*** [[TMP0]], align 8
2846// CHECK7-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8*, i8** [[TMP18]], i64 0
2847// CHECK7-NEXT: [[TMP19:%.*]] = load i8*, i8** [[ARRAYIDX4]], align 8
2848// CHECK7-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i8, i8* [[TMP19]], i64 0
2849// CHECK7-NEXT: [[TMP20:%.*]] = load i8, i8* [[ARRAYIDX5]], align 1
2850// CHECK7-NEXT: [[CONV6:%.*]] = sext i8 [[TMP20]] to i32
2851// CHECK7-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV6]], [[TMP17]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002852// CHECK7-NEXT: [[CONV7:%.*]] = trunc i32 [[ADD]] to i8
2853// CHECK7-NEXT: store i8 [[CONV7]], i8* [[ARRAYIDX5]], align 1
2854// CHECK7-NEXT: br label [[RETURN]]
2855// CHECK7: return:
2856// CHECK7-NEXT: ret void
2857//
2858//
2859// CHECK7-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002860// CHECK7-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002861// CHECK7-NEXT: entry:
2862// CHECK7-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
2863// CHECK7-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
2864// CHECK7-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
2865// CHECK7-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
2866// CHECK7-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002867// CHECK7-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002868// CHECK7-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
2869// CHECK7-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
2870// CHECK7-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
2871// CHECK7-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
2872// CHECK7-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
2873// CHECK7-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
2874// CHECK7-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
2875// CHECK7-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
2876// CHECK7-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
2877// CHECK7-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
2878// CHECK7-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002879// CHECK7-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002880// CHECK7-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002881// CHECK7-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
2882// CHECK7-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
2883// CHECK7-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
2884// CHECK7-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
2885// CHECK7-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
2886// CHECK7-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
2887// CHECK7-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
2888// CHECK7-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
2889// CHECK7-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002890// CHECK7-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
2891// CHECK7-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002892// CHECK7-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002893// CHECK7-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2:[0-9]+]]
2894// CHECK7-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
2895// CHECK7-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
2896// CHECK7: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002897// CHECK7-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002898// CHECK7-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT:%.*]]
2899// CHECK7: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002900// CHECK7-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002901// CHECK7-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]]
2902// CHECK7: .omp_outlined..1.exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04002903// CHECK7-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002904// CHECK7-NEXT: ret i32 0
2905//
2906//
2907// CHECK7-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002908// CHECK7-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002909// CHECK7-NEXT: entry:
2910// CHECK7-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2911// CHECK7-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2912// CHECK7-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
2913// CHECK7-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
2914// CHECK7-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
2915// CHECK7-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
2916// CHECK7-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
2917// CHECK7-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2918// CHECK7-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2919// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2920// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2921// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
2922// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002923// CHECK7-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2924// CHECK7-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
2925// CHECK7-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
2926// CHECK7-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2927// CHECK7-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0
2928// CHECK7-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 0
2929// CHECK7-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
2930// CHECK7-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2931// CHECK7-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002932// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2933// CHECK7: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002934// CHECK7-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2935// CHECK7-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2936// CHECK7-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002937// CHECK7-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2938// CHECK7: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002939// CHECK7-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2940// CHECK7-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002941// CHECK7-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
2942// CHECK7-NEXT: ]
2943// CHECK7: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002944// CHECK7-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
2945// CHECK7-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
2946// CHECK7-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002947// CHECK7: .cancel.exit:
2948// CHECK7-NEXT: br label [[CANCEL_EXIT:%.*]]
2949// CHECK7: .cancel.continue:
2950// CHECK7-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
2951// CHECK7: .omp.sections.exit:
2952// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2953// CHECK7: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002954// CHECK7-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2955// CHECK7-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002956// CHECK7-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
2957// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND]]
2958// CHECK7: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002959// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002960// CHECK7-NEXT: br label [[CANCEL_CONT:%.*]]
2961// CHECK7: cancel.cont:
2962// CHECK7-NEXT: ret void
2963// CHECK7: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002964// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002965// CHECK7-NEXT: br label [[CANCEL_CONT]]
2966//
2967//
2968// CHECK7-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09002969// CHECK7-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002970// CHECK7-NEXT: entry:
2971// CHECK7-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
2972// CHECK7-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
2973// CHECK7-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
2974// CHECK7-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
2975// CHECK7-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
2976// CHECK7-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
2977// CHECK7-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
2978// CHECK7-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
2979// CHECK7-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
2980// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2981// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2982// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
2983// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002984// CHECK7-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
2985// CHECK7-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
2986// CHECK7-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
2987// CHECK7-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2988// CHECK7-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 1
2989// CHECK7-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 1
2990// CHECK7-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
2991// CHECK7-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
2992// CHECK7-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002993// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2994// CHECK7: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07002995// CHECK7-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
2996// CHECK7-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
2997// CHECK7-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07002998// CHECK7-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2999// CHECK7: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003000// CHECK7-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3001// CHECK7-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003002// CHECK7-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
3003// CHECK7-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE1:%.*]]
3004// CHECK7-NEXT: ]
3005// CHECK7: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003006// CHECK7-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
3007// CHECK7-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
3008// CHECK7-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003009// CHECK7: .cancel.exit:
3010// CHECK7-NEXT: br label [[CANCEL_EXIT:%.*]]
3011// CHECK7: .cancel.continue:
3012// CHECK7-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
3013// CHECK7: .omp.sections.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003014// CHECK7-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
3015// CHECK7-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
3016// CHECK7-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003017// CHECK7: .cancel.exit2:
3018// CHECK7-NEXT: br label [[CANCEL_EXIT]]
3019// CHECK7: .cancel.continue3:
3020// CHECK7-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
3021// CHECK7: .omp.sections.exit:
3022// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
3023// CHECK7: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003024// CHECK7-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3025// CHECK7-NEXT: [[INC:%.*]] = add nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003026// CHECK7-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
3027// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND]]
3028// CHECK7: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003029// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003030// CHECK7-NEXT: br label [[CANCEL_CONT:%.*]]
3031// CHECK7: cancel.cont:
3032// CHECK7-NEXT: ret void
3033// CHECK7: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003034// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003035// CHECK7-NEXT: br label [[CANCEL_CONT]]
3036//
3037//
3038// CHECK7-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003039// CHECK7-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003040// CHECK7-NEXT: entry:
3041// CHECK7-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3042// CHECK7-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003043// CHECK7-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
3044// CHECK7-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003045// CHECK7-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
3046// CHECK7-NEXT: [[TMP:%.*]] = alloca i32, align 4
3047// CHECK7-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3048// CHECK7-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3049// CHECK7-NEXT: [[I:%.*]] = alloca i32, align 4
3050// CHECK7-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
3051// CHECK7-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
3052// CHECK7-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3053// CHECK7-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003054// CHECK7-NEXT: [[R3:%.*]] = alloca i32, align 4
3055// CHECK7-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003056// CHECK7-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
3057// CHECK7-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3058// CHECK7-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003059// CHECK7-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
3060// CHECK7-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
3061// CHECK7-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
3062// CHECK7-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
3063// CHECK7-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
3064// CHECK7-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
3065// CHECK7-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3066// CHECK7-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003067// CHECK7-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3068// CHECK7-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3069// CHECK7-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3070// CHECK7-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003071// CHECK7-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3072// CHECK7-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003073// CHECK7-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3074// CHECK7: omp.precond.then:
3075// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003076// CHECK7-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3077// CHECK7-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003078// CHECK7-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3079// CHECK7-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003080// CHECK7-NEXT: store i32 0, i32* [[R3]], align 4
3081// CHECK7-NEXT: [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3082// CHECK7-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
3083// CHECK7-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6]], i32 [[TMP7]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3084// CHECK7-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3085// CHECK7-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3086// CHECK7-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]
3087// CHECK7-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003088// CHECK7: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003089// CHECK7-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003090// CHECK7-NEXT: br label [[COND_END:%.*]]
3091// CHECK7: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003092// CHECK7-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003093// CHECK7-NEXT: br label [[COND_END]]
3094// CHECK7: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003095// CHECK7-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003096// CHECK7-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003097// CHECK7-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3098// CHECK7-NEXT: store i32 [[TMP12]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003099// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
3100// CHECK7: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003101// CHECK7-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3102// CHECK7-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3103// CHECK7-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
3104// CHECK7-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003105// CHECK7: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003106// CHECK7-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3107// CHECK7-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003108// CHECK7-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003109// CHECK7-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
3110// CHECK7-NEXT: [[TMP16:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3111// CHECK7-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP16]], align 4
3112// CHECK7-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP17]], i32 2)
3113// CHECK7-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
3114// CHECK7-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003115// CHECK7: .cancel.exit:
3116// CHECK7-NEXT: br label [[CANCEL_EXIT:%.*]]
3117// CHECK7: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003118// CHECK7-NEXT: [[TMP20:%.*]] = load i32, i32* [[I4]], align 4
3119// CHECK7-NEXT: [[TMP21:%.*]] = load i32, i32* [[R3]], align 4
3120// CHECK7-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP20]]
3121// CHECK7-NEXT: store i32 [[ADD7]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003122// CHECK7-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
3123// CHECK7: omp.body.continue:
3124// CHECK7-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
3125// CHECK7: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003126// CHECK7-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3127// CHECK7-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP22]], 1
3128// CHECK7-NEXT: store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003129// CHECK7-NEXT: br label [[OMP_INNER_FOR_COND]]
3130// CHECK7: omp.inner.for.end:
3131// CHECK7-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
3132// CHECK7: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003133// CHECK7-NEXT: [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3134// CHECK7-NEXT: [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
3135// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP24]])
3136// CHECK7-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
3137// CHECK7-NEXT: [[TMP26:%.*]] = bitcast i32* [[R3]] to i8*
3138// CHECK7-NEXT: store i8* [[TMP26]], i8** [[TMP25]], align 8
3139// CHECK7-NEXT: [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3140// CHECK7-NEXT: [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
3141// CHECK7-NEXT: [[TMP29:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
3142// CHECK7-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB7:[0-9]+]], i32 [[TMP28]], i32 1, i64 8, i8* [[TMP29]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
3143// CHECK7-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003144// CHECK7-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
3145// CHECK7-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
3146// CHECK7-NEXT: ]
3147// CHECK7: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003148// CHECK7-NEXT: [[TMP31:%.*]] = load i32, i32* [[TMP1]], align 4
3149// CHECK7-NEXT: [[TMP32:%.*]] = load i32, i32* [[R3]], align 4
3150// CHECK7-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP31]], [[TMP32]]
3151// CHECK7-NEXT: store i32 [[ADD9]], i32* [[TMP1]], align 4
3152// CHECK7-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB7]], i32 [[TMP28]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003153// CHECK7-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
3154// CHECK7: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003155// CHECK7-NEXT: [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3156// CHECK7-NEXT: [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
3157// CHECK7-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP34]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003158// CHECK7-NEXT: br label [[CANCEL_CONT:%.*]]
3159// CHECK7: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003160// CHECK7-NEXT: [[TMP35:%.*]] = load i32, i32* [[R3]], align 4
3161// CHECK7-NEXT: [[TMP36:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP35]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003162// CHECK7-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
3163// CHECK7: .omp.reduction.default:
3164// CHECK7-NEXT: br label [[OMP_PRECOND_END]]
3165// CHECK7: omp.precond.end:
3166// CHECK7-NEXT: br label [[CANCEL_CONT]]
3167// CHECK7: cancel.cont:
3168// CHECK7-NEXT: ret void
3169//
3170//
3171// CHECK7-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003172// CHECK7-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003173// CHECK7-NEXT: entry:
3174// CHECK7-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
3175// CHECK7-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
3176// CHECK7-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
3177// CHECK7-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
3178// CHECK7-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
3179// CHECK7-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
3180// CHECK7-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
3181// CHECK7-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
3182// CHECK7-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
3183// CHECK7-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
3184// CHECK7-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
3185// CHECK7-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
3186// CHECK7-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
3187// CHECK7-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
3188// CHECK7-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
3189// CHECK7-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
3190// CHECK7-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
3191// CHECK7-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
3192// CHECK7-NEXT: ret void
3193//
3194//
3195// CHECK8-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003196// CHECK8-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003197// CHECK8-NEXT: entry:
3198// CHECK8-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
3199// CHECK8-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
3200// CHECK8-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
3201// CHECK8-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
3202// CHECK8-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
3203// CHECK8-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
3204// CHECK8-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
3205// CHECK8-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
3206// CHECK8-NEXT: [[DOTOMP_SECTIONS_LB_1:%.*]] = alloca i32, align 4
3207// CHECK8-NEXT: [[DOTOMP_SECTIONS_UB_2:%.*]] = alloca i32, align 4
3208// CHECK8-NEXT: [[DOTOMP_SECTIONS_ST_3:%.*]] = alloca i32, align 4
3209// CHECK8-NEXT: [[DOTOMP_SECTIONS_IL_4:%.*]] = alloca i32, align 4
3210// CHECK8-NEXT: [[DOTOMP_SECTIONS_IV_5:%.*]] = alloca i32, align 4
3211// CHECK8-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
3212// CHECK8-NEXT: [[TMP:%.*]] = alloca i32, align 4
3213// CHECK8-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3214// CHECK8-NEXT: [[DOTCAPTURE_EXPR_21:%.*]] = alloca i32, align 4
3215// CHECK8-NEXT: [[I:%.*]] = alloca i32, align 4
3216// CHECK8-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
3217// CHECK8-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
3218// CHECK8-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3219// CHECK8-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
3220// CHECK8-NEXT: [[I24:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003221// CHECK8-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003222// CHECK8-NEXT: [[R:%.*]] = alloca i32, align 4
3223// CHECK8-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
3224// CHECK8-NEXT: store i32 0, i32* [[RETVAL]], align 4
3225// CHECK8-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
3226// CHECK8-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003227// CHECK8-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i8*** [[ARGV_ADDR]], i32* [[ARGC_ADDR]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003228// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
3229// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3230// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
3231// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003232// CHECK8-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003233// CHECK8-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3234// CHECK8-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
3235// CHECK8-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 [[TMP1]], i32 0
3236// CHECK8-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
3237// CHECK8-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
3238// CHECK8-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003239// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
3240// CHECK8: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003241// CHECK8-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3242// CHECK8-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3243// CHECK8-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003244// CHECK8-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3245// CHECK8: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003246// CHECK8-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3247// CHECK8-NEXT: switch i32 [[TMP7]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003248// CHECK8-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
3249// CHECK8-NEXT: ]
3250// CHECK8: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003251// CHECK8-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
3252// CHECK8-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0
3253// CHECK8-NEXT: br i1 [[TMP9]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003254// CHECK8: .cancel.exit:
3255// CHECK8-NEXT: br label [[CANCEL_EXIT:%.*]]
3256// CHECK8: .cancel.continue:
3257// CHECK8-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
3258// CHECK8: .omp.sections.exit:
3259// CHECK8-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
3260// CHECK8: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003261// CHECK8-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3262// CHECK8-NEXT: [[INC:%.*]] = add nsw i32 [[TMP10]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003263// CHECK8-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
3264// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND]]
3265// CHECK8: omp.inner.for.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003266// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003267// CHECK8-NEXT: br label [[CANCEL_CONT:%.*]]
3268// CHECK8: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003269// CHECK8-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003270// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
3271// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
3272// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_3]], align 4
3273// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_4]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003274// CHECK8-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_4]], i32* [[DOTOMP_SECTIONS_LB_1]], i32* [[DOTOMP_SECTIONS_UB_2]], i32* [[DOTOMP_SECTIONS_ST_3]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003275// CHECK8-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
3276// CHECK8-NEXT: [[TMP12:%.*]] = icmp slt i32 [[TMP11]], 1
3277// CHECK8-NEXT: [[TMP13:%.*]] = select i1 [[TMP12]], i32 [[TMP11]], i32 1
3278// CHECK8-NEXT: store i32 [[TMP13]], i32* [[DOTOMP_SECTIONS_UB_2]], align 4
3279// CHECK8-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_1]], align 4
3280// CHECK8-NEXT: store i32 [[TMP14]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003281// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND6:%.*]]
3282// CHECK8: omp.inner.for.cond6:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003283// CHECK8-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
3284// CHECK8-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_2]], align 4
3285// CHECK8-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003286// CHECK8-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY8:%.*]], label [[OMP_INNER_FOR_END18:%.*]]
3287// CHECK8: omp.inner.for.body8:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003288// CHECK8-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
3289// CHECK8-NEXT: switch i32 [[TMP17]], label [[DOTOMP_SECTIONS_EXIT15:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003290// CHECK8-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE9:%.*]]
3291// CHECK8-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE12:%.*]]
3292// CHECK8-NEXT: ]
3293// CHECK8: .omp.sections.case9:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003294// CHECK8-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
3295// CHECK8-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
3296// CHECK8-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT10:%.*]], label [[DOTCANCEL_CONTINUE11:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003297// CHECK8: .cancel.exit10:
3298// CHECK8-NEXT: br label [[CANCEL_EXIT19:%.*]]
3299// CHECK8: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003300// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003301// CHECK8-NEXT: br label [[CANCEL_CONT]]
3302// CHECK8: .cancel.continue11:
3303// CHECK8-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
3304// CHECK8: .omp.sections.case12:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003305// CHECK8-NEXT: [[TMP20:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3)
3306// CHECK8-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0
3307// CHECK8-NEXT: br i1 [[TMP21]], label [[DOTCANCEL_EXIT13:%.*]], label [[DOTCANCEL_CONTINUE14:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003308// CHECK8: .cancel.exit13:
3309// CHECK8-NEXT: br label [[CANCEL_EXIT19]]
3310// CHECK8: .cancel.continue14:
3311// CHECK8-NEXT: br label [[DOTOMP_SECTIONS_EXIT15]]
3312// CHECK8: .omp.sections.exit15:
3313// CHECK8-NEXT: br label [[OMP_INNER_FOR_INC16:%.*]]
3314// CHECK8: omp.inner.for.inc16:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003315// CHECK8-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_5]], align 4
3316// CHECK8-NEXT: [[INC17:%.*]] = add nsw i32 [[TMP22]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003317// CHECK8-NEXT: store i32 [[INC17]], i32* [[DOTOMP_SECTIONS_IV_5]], align 4
3318// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND6]]
3319// CHECK8: omp.inner.for.end18:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003320// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003321// CHECK8-NEXT: br label [[CANCEL_CONT20:%.*]]
3322// CHECK8: cancel.cont20:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003323// CHECK8-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003324// CHECK8-NEXT: [[TMP23:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
3325// CHECK8-NEXT: store i32 [[TMP23]], i32* [[DOTCAPTURE_EXPR_]], align 4
3326// CHECK8-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3327// CHECK8-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP24]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003328// CHECK8-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3329// CHECK8-NEXT: [[SUB22:%.*]] = sub nsw i32 [[DIV]], 1
3330// CHECK8-NEXT: store i32 [[SUB22]], i32* [[DOTCAPTURE_EXPR_21]], align 4
3331// CHECK8-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003332// CHECK8-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3333// CHECK8-NEXT: [[CMP23:%.*]] = icmp slt i32 0, [[TMP25]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003334// CHECK8-NEXT: br i1 [[CMP23]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3335// CHECK8: omp.precond.then:
3336// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003337// CHECK8-NEXT: [[TMP26:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
3338// CHECK8-NEXT: store i32 [[TMP26]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003339// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3340// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003341// CHECK8-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003342// CHECK8-NEXT: [[TMP27:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3343// CHECK8-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
3344// CHECK8-NEXT: [[CMP25:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003345// CHECK8-NEXT: br i1 [[CMP25]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
3346// CHECK8: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003347// CHECK8-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_21]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003348// CHECK8-NEXT: br label [[COND_END:%.*]]
3349// CHECK8: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003350// CHECK8-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003351// CHECK8-NEXT: br label [[COND_END]]
3352// CHECK8: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003353// CHECK8-NEXT: [[COND:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE]] ], [ [[TMP30]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003354// CHECK8-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003355// CHECK8-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3356// CHECK8-NEXT: store i32 [[TMP31]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003357// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND26:%.*]]
3358// CHECK8: omp.inner.for.cond26:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003359// CHECK8-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3360// CHECK8-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3361// CHECK8-NEXT: [[CMP27:%.*]] = icmp sle i32 [[TMP32]], [[TMP33]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003362// CHECK8-NEXT: br i1 [[CMP27]], label [[OMP_INNER_FOR_BODY28:%.*]], label [[OMP_INNER_FOR_END33:%.*]]
3363// CHECK8: omp.inner.for.body28:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003364// CHECK8-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3365// CHECK8-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP34]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003366// CHECK8-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
3367// CHECK8-NEXT: store i32 [[ADD]], i32* [[I24]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003368// CHECK8-NEXT: [[TMP35:%.*]] = load float, float* @flag, align 4
3369// CHECK8-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP35]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003370// CHECK8-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
3371// CHECK8: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003372// CHECK8-NEXT: [[TMP36:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2)
3373// CHECK8-NEXT: [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 0
3374// CHECK8-NEXT: br i1 [[TMP37]], label [[DOTCANCEL_EXIT29:%.*]], label [[DOTCANCEL_CONTINUE30:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003375// CHECK8: .cancel.exit29:
3376// CHECK8-NEXT: br label [[CANCEL_EXIT34:%.*]]
3377// CHECK8: cancel.exit19:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003378// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003379// CHECK8-NEXT: br label [[CANCEL_CONT20]]
3380// CHECK8: .cancel.continue30:
3381// CHECK8-NEXT: br label [[OMP_IF_END:%.*]]
3382// CHECK8: omp_if.else:
3383// CHECK8-NEXT: br label [[OMP_IF_END]]
3384// CHECK8: omp_if.end:
3385// CHECK8-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
3386// CHECK8: omp.body.continue:
3387// CHECK8-NEXT: br label [[OMP_INNER_FOR_INC31:%.*]]
3388// CHECK8: omp.inner.for.inc31:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003389// CHECK8-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3390// CHECK8-NEXT: [[ADD32:%.*]] = add nsw i32 [[TMP38]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003391// CHECK8-NEXT: store i32 [[ADD32]], i32* [[DOTOMP_IV]], align 4
3392// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND26]]
3393// CHECK8: omp.inner.for.end33:
3394// CHECK8-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
3395// CHECK8: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003396// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003397// CHECK8-NEXT: br label [[OMP_PRECOND_END]]
3398// CHECK8: cancel.exit34:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003399// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP0]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003400// CHECK8-NEXT: br label [[CANCEL_CONT35:%.*]]
3401// CHECK8: omp.precond.end:
3402// CHECK8-NEXT: br label [[CANCEL_CONT35]]
3403// CHECK8: cancel.cont35:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003404// CHECK8-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP0]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003405// CHECK8-NEXT: [[TMP39:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
3406// CHECK8-NEXT: [[TMP40:%.*]] = bitcast i8* [[TMP39]] to %struct.kmp_task_t_with_privates*
3407// CHECK8-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP40]], i32 0, i32 0
3408// CHECK8-NEXT: [[TMP42:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP39]])
3409// CHECK8-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
3410// CHECK8-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003411// CHECK8-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003412// CHECK8-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
3413// CHECK8-NEXT: [[TMP43:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
3414// CHECK8-NEXT: ret i32 [[TMP43]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003415//
3416//
3417// CHECK8-LABEL: define {{[^@]+}}@.omp_outlined.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003418// CHECK8-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i8*** nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003419// CHECK8-NEXT: entry:
3420// CHECK8-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3421// CHECK8-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003422// CHECK8-NEXT: [[ARGV_ADDR:%.*]] = alloca i8***, align 8
3423// CHECK8-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003424// CHECK8-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3425// CHECK8-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003426// CHECK8-NEXT: store i8*** [[ARGV]], i8**** [[ARGV_ADDR]], align 8
3427// CHECK8-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
3428// CHECK8-NEXT: [[TMP0:%.*]] = load i8***, i8**** [[ARGV_ADDR]], align 8
3429// CHECK8-NEXT: [[TMP1:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
3430// CHECK8-NEXT: [[TMP2:%.*]] = load float, float* @flag, align 4
3431// CHECK8-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP2]], 0.000000e+00
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003432// CHECK8-NEXT: br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
3433// CHECK8: omp_if.then:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003434// CHECK8-NEXT: [[TMP3:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3435// CHECK8-NEXT: [[TMP4:%.*]] = load i32, i32* [[TMP3]], align 4
3436// CHECK8-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP4]], i32 1)
3437// CHECK8-NEXT: [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0
3438// CHECK8-NEXT: br i1 [[TMP6]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003439// CHECK8: .cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003440// CHECK8-NEXT: [[TMP7:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3441// CHECK8-NEXT: [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
3442// CHECK8-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP8]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003443// CHECK8-NEXT: br label [[RETURN:%.*]]
3444// CHECK8: .cancel.continue:
3445// CHECK8-NEXT: br label [[OMP_IF_END:%.*]]
3446// CHECK8: omp_if.else:
3447// CHECK8-NEXT: br label [[OMP_IF_END]]
3448// CHECK8: omp_if.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003449// CHECK8-NEXT: [[TMP10:%.*]] = load i32, i32* [[TMP1]], align 4
3450// CHECK8-NEXT: [[CONV:%.*]] = trunc i32 [[TMP10]] to i8
3451// CHECK8-NEXT: [[TMP11:%.*]] = load i8**, i8*** [[TMP0]], align 8
3452// CHECK8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP11]], i64 0
3453// CHECK8-NEXT: [[TMP12:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
3454// CHECK8-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[TMP12]], i64 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003455// CHECK8-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX1]], align 1
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003456// CHECK8-NEXT: [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3457// CHECK8-NEXT: [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4
3458// CHECK8-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP14]])
3459// CHECK8-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0
3460// CHECK8-NEXT: br i1 [[TMP16]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003461// CHECK8: .cancel.exit2:
3462// CHECK8-NEXT: br label [[RETURN]]
3463// CHECK8: .cancel.continue3:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003464// CHECK8-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP1]], align 4
3465// CHECK8-NEXT: [[TMP18:%.*]] = load i8**, i8*** [[TMP0]], align 8
3466// CHECK8-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i8*, i8** [[TMP18]], i64 0
3467// CHECK8-NEXT: [[TMP19:%.*]] = load i8*, i8** [[ARRAYIDX4]], align 8
3468// CHECK8-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i8, i8* [[TMP19]], i64 0
3469// CHECK8-NEXT: [[TMP20:%.*]] = load i8, i8* [[ARRAYIDX5]], align 1
3470// CHECK8-NEXT: [[CONV6:%.*]] = sext i8 [[TMP20]] to i32
3471// CHECK8-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV6]], [[TMP17]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003472// CHECK8-NEXT: [[CONV7:%.*]] = trunc i32 [[ADD]] to i8
3473// CHECK8-NEXT: store i8 [[CONV7]], i8* [[ARRAYIDX5]], align 1
3474// CHECK8-NEXT: br label [[RETURN]]
3475// CHECK8: return:
3476// CHECK8-NEXT: ret void
3477//
3478//
3479// CHECK8-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003480// CHECK8-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003481// CHECK8-NEXT: entry:
3482// CHECK8-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
3483// CHECK8-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
3484// CHECK8-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
3485// CHECK8-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
3486// CHECK8-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003487// CHECK8-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003488// CHECK8-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
3489// CHECK8-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
3490// CHECK8-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
3491// CHECK8-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
3492// CHECK8-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
3493// CHECK8-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
3494// CHECK8-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
3495// CHECK8-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
3496// CHECK8-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
3497// CHECK8-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
3498// CHECK8-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003499// CHECK8-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003500// CHECK8-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -04003501// CHECK8-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
3502// CHECK8-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
3503// CHECK8-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
3504// CHECK8-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
3505// CHECK8-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
3506// CHECK8-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
3507// CHECK8-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
3508// CHECK8-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
3509// CHECK8-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003510// CHECK8-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
3511// CHECK8-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Joseph Huber9ce02ea2021-06-24 14:39:12 -04003512// CHECK8-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003513// CHECK8-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2:[0-9]+]]
3514// CHECK8-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0
3515// CHECK8-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
3516// CHECK8: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04003517// CHECK8-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003518// CHECK8-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT:%.*]]
3519// CHECK8: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04003520// CHECK8-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003521// CHECK8-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]]
3522// CHECK8: .omp_outlined..1.exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04003523// CHECK8-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003524// CHECK8-NEXT: ret i32 0
3525//
3526//
3527// CHECK8-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003528// CHECK8-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003529// CHECK8-NEXT: entry:
3530// CHECK8-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3531// CHECK8-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3532// CHECK8-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
3533// CHECK8-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
3534// CHECK8-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
3535// CHECK8-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
3536// CHECK8-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
3537// CHECK8-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3538// CHECK8-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3539// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
3540// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3541// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
3542// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003543// CHECK8-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3544// CHECK8-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
3545// CHECK8-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
3546// CHECK8-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3547// CHECK8-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0
3548// CHECK8-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 0
3549// CHECK8-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
3550// CHECK8-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
3551// CHECK8-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003552// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
3553// CHECK8: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003554// CHECK8-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3555// CHECK8-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3556// CHECK8-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003557// CHECK8-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3558// CHECK8: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003559// CHECK8-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3560// CHECK8-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003561// CHECK8-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
3562// CHECK8-NEXT: ]
3563// CHECK8: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003564// CHECK8-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
3565// CHECK8-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
3566// CHECK8-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003567// CHECK8: .cancel.exit:
3568// CHECK8-NEXT: br label [[CANCEL_EXIT:%.*]]
3569// CHECK8: .cancel.continue:
3570// CHECK8-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
3571// CHECK8: .omp.sections.exit:
3572// CHECK8-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
3573// CHECK8: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003574// CHECK8-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3575// CHECK8-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003576// CHECK8-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
3577// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND]]
3578// CHECK8: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003579// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003580// CHECK8-NEXT: br label [[CANCEL_CONT:%.*]]
3581// CHECK8: cancel.cont:
3582// CHECK8-NEXT: ret void
3583// CHECK8: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003584// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003585// CHECK8-NEXT: br label [[CANCEL_CONT]]
3586//
3587//
3588// CHECK8-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003589// CHECK8-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003590// CHECK8-NEXT: entry:
3591// CHECK8-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3592// CHECK8-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
3593// CHECK8-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
3594// CHECK8-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
3595// CHECK8-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
3596// CHECK8-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
3597// CHECK8-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
3598// CHECK8-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3599// CHECK8-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
3600// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
3601// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3602// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
3603// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003604// CHECK8-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3605// CHECK8-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4
3606// CHECK8-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
3607// CHECK8-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3608// CHECK8-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 1
3609// CHECK8-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 1
3610// CHECK8-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
3611// CHECK8-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
3612// CHECK8-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003613// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
3614// CHECK8: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003615// CHECK8-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3616// CHECK8-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
3617// CHECK8-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003618// CHECK8-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
3619// CHECK8: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003620// CHECK8-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3621// CHECK8-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003622// CHECK8-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
3623// CHECK8-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE1:%.*]]
3624// CHECK8-NEXT: ]
3625// CHECK8: .omp.sections.case:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003626// CHECK8-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
3627// CHECK8-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0
3628// CHECK8-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003629// CHECK8: .cancel.exit:
3630// CHECK8-NEXT: br label [[CANCEL_EXIT:%.*]]
3631// CHECK8: .cancel.continue:
3632// CHECK8-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
3633// CHECK8: .omp.sections.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003634// CHECK8-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3)
3635// CHECK8-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
3636// CHECK8-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003637// CHECK8: .cancel.exit2:
3638// CHECK8-NEXT: br label [[CANCEL_EXIT]]
3639// CHECK8: .cancel.continue3:
3640// CHECK8-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
3641// CHECK8: .omp.sections.exit:
3642// CHECK8-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
3643// CHECK8: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003644// CHECK8-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
3645// CHECK8-NEXT: [[INC:%.*]] = add nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003646// CHECK8-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
3647// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND]]
3648// CHECK8: omp.inner.for.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003649// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003650// CHECK8-NEXT: br label [[CANCEL_CONT:%.*]]
3651// CHECK8: cancel.cont:
3652// CHECK8-NEXT: ret void
3653// CHECK8: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003654// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[TMP1]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003655// CHECK8-NEXT: br label [[CANCEL_CONT]]
3656//
3657//
3658// CHECK8-LABEL: define {{[^@]+}}@.omp_outlined..4
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003659// CHECK8-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR1]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003660// CHECK8-NEXT: entry:
3661// CHECK8-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
3662// CHECK8-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003663// CHECK8-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
3664// CHECK8-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003665// CHECK8-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
3666// CHECK8-NEXT: [[TMP:%.*]] = alloca i32, align 4
3667// CHECK8-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
3668// CHECK8-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
3669// CHECK8-NEXT: [[I:%.*]] = alloca i32, align 4
3670// CHECK8-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
3671// CHECK8-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
3672// CHECK8-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3673// CHECK8-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003674// CHECK8-NEXT: [[R3:%.*]] = alloca i32, align 4
3675// CHECK8-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003676// CHECK8-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
3677// CHECK8-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
3678// CHECK8-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003679// CHECK8-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
3680// CHECK8-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
3681// CHECK8-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
3682// CHECK8-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
3683// CHECK8-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
3684// CHECK8-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
3685// CHECK8-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3686// CHECK8-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003687// CHECK8-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
3688// CHECK8-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
3689// CHECK8-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
3690// CHECK8-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003691// CHECK8-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3692// CHECK8-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003693// CHECK8-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3694// CHECK8: omp.precond.then:
3695// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003696// CHECK8-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3697// CHECK8-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003698// CHECK8-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3699// CHECK8-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003700// CHECK8-NEXT: store i32 0, i32* [[R3]], align 4
3701// CHECK8-NEXT: [[TMP6:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3702// CHECK8-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4
3703// CHECK8-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB6]], i32 [[TMP7]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
3704// CHECK8-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3705// CHECK8-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
3706// CHECK8-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]
3707// CHECK8-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003708// CHECK8: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003709// CHECK8-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003710// CHECK8-NEXT: br label [[COND_END:%.*]]
3711// CHECK8: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003712// CHECK8-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003713// CHECK8-NEXT: br label [[COND_END]]
3714// CHECK8: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003715// CHECK8-NEXT: [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003716// CHECK8-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003717// CHECK8-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3718// CHECK8-NEXT: store i32 [[TMP12]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003719// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
3720// CHECK8: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003721// CHECK8-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3722// CHECK8-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3723// CHECK8-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]
3724// CHECK8-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003725// CHECK8: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003726// CHECK8-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3727// CHECK8-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003728// CHECK8-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003729// CHECK8-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
3730// CHECK8-NEXT: [[TMP16:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3731// CHECK8-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP16]], align 4
3732// CHECK8-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP17]], i32 2)
3733// CHECK8-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0
3734// CHECK8-NEXT: br i1 [[TMP19]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003735// CHECK8: .cancel.exit:
3736// CHECK8-NEXT: br label [[CANCEL_EXIT:%.*]]
3737// CHECK8: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003738// CHECK8-NEXT: [[TMP20:%.*]] = load i32, i32* [[I4]], align 4
3739// CHECK8-NEXT: [[TMP21:%.*]] = load i32, i32* [[R3]], align 4
3740// CHECK8-NEXT: [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP20]]
3741// CHECK8-NEXT: store i32 [[ADD7]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003742// CHECK8-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
3743// CHECK8: omp.body.continue:
3744// CHECK8-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
3745// CHECK8: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003746// CHECK8-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3747// CHECK8-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP22]], 1
3748// CHECK8-NEXT: store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003749// CHECK8-NEXT: br label [[OMP_INNER_FOR_COND]]
3750// CHECK8: omp.inner.for.end:
3751// CHECK8-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
3752// CHECK8: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003753// CHECK8-NEXT: [[TMP23:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3754// CHECK8-NEXT: [[TMP24:%.*]] = load i32, i32* [[TMP23]], align 4
3755// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP24]])
3756// CHECK8-NEXT: [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
3757// CHECK8-NEXT: [[TMP26:%.*]] = bitcast i32* [[R3]] to i8*
3758// CHECK8-NEXT: store i8* [[TMP26]], i8** [[TMP25]], align 8
3759// CHECK8-NEXT: [[TMP27:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3760// CHECK8-NEXT: [[TMP28:%.*]] = load i32, i32* [[TMP27]], align 4
3761// CHECK8-NEXT: [[TMP29:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
3762// CHECK8-NEXT: [[TMP30:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB7:[0-9]+]], i32 [[TMP28]], i32 1, i64 8, i8* [[TMP29]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
3763// CHECK8-NEXT: switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003764// CHECK8-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
3765// CHECK8-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
3766// CHECK8-NEXT: ]
3767// CHECK8: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003768// CHECK8-NEXT: [[TMP31:%.*]] = load i32, i32* [[TMP1]], align 4
3769// CHECK8-NEXT: [[TMP32:%.*]] = load i32, i32* [[R3]], align 4
3770// CHECK8-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP31]], [[TMP32]]
3771// CHECK8-NEXT: store i32 [[ADD9]], i32* [[TMP1]], align 4
3772// CHECK8-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB7]], i32 [[TMP28]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003773// CHECK8-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
3774// CHECK8: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003775// CHECK8-NEXT: [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8
3776// CHECK8-NEXT: [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4
3777// CHECK8-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB6]], i32 [[TMP34]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003778// CHECK8-NEXT: br label [[CANCEL_CONT:%.*]]
3779// CHECK8: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07003780// CHECK8-NEXT: [[TMP35:%.*]] = load i32, i32* [[R3]], align 4
3781// CHECK8-NEXT: [[TMP36:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP35]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003782// CHECK8-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
3783// CHECK8: .omp.reduction.default:
3784// CHECK8-NEXT: br label [[OMP_PRECOND_END]]
3785// CHECK8: omp.precond.end:
3786// CHECK8-NEXT: br label [[CANCEL_CONT]]
3787// CHECK8: cancel.cont:
3788// CHECK8-NEXT: ret void
3789//
3790//
3791// CHECK8-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003792// CHECK8-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003793// CHECK8-NEXT: entry:
3794// CHECK8-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
3795// CHECK8-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
3796// CHECK8-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
3797// CHECK8-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
3798// CHECK8-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
3799// CHECK8-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
3800// CHECK8-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
3801// CHECK8-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
3802// CHECK8-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
3803// CHECK8-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
3804// CHECK8-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
3805// CHECK8-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
3806// CHECK8-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
3807// CHECK8-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
3808// CHECK8-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
3809// CHECK8-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
3810// CHECK8-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
3811// CHECK8-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
3812// CHECK8-NEXT: ret void
3813//
3814//
3815// CHECK9-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +09003816// CHECK9-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003817// CHECK9-NEXT: entry:
3818// CHECK9-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
3819// CHECK9-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
3820// CHECK9-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
3821// CHECK9-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
3822// CHECK9-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
3823// CHECK9-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
3824// CHECK9-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003825// CHECK9-NEXT: [[P_LASTITER27:%.*]] = alloca i32, align 4
3826// CHECK9-NEXT: [[P_LOWERBOUND28:%.*]] = alloca i32, align 4
3827// CHECK9-NEXT: [[P_UPPERBOUND29:%.*]] = alloca i32, align 4
3828// CHECK9-NEXT: [[P_STRIDE30:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003829// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
3830// CHECK9-NEXT: [[TMP:%.*]] = alloca i32, align 4
3831// CHECK9-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003832// CHECK9-NEXT: [[DOTCAPTURE_EXPR_34:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003833// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 4
3834// CHECK9-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
3835// CHECK9-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
3836// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
3837// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003838// CHECK9-NEXT: [[I36:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003839// CHECK9-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
3840// CHECK9-NEXT: [[R:%.*]] = alloca i32, align 4
3841// CHECK9-NEXT: store i32 0, i32* [[RETVAL]], align 4
3842// CHECK9-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
3843// CHECK9-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
3844// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
3845// CHECK9-NEXT: br label [[OMP_PARALLEL:%.*]]
3846// CHECK9: omp_parallel:
3847// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i8***)* @main..omp_par to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]])
3848// CHECK9-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
3849// CHECK9: omp.par.outlined.exit:
3850// CHECK9-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
3851// CHECK9: omp.par.exit.split:
3852// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER:%.*]]
3853// CHECK9: omp_section_loop.preheader:
3854// CHECK9-NEXT: store i32 0, i32* [[P_LOWERBOUND]], align 4
3855// CHECK9-NEXT: store i32 0, i32* [[P_UPPERBOUND]], align 4
3856// CHECK9-NEXT: store i32 1, i32* [[P_STRIDE]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003857// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3858// CHECK9-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]], i32 34, i32* [[P_LASTITER]], i32* [[P_LOWERBOUND]], i32* [[P_UPPERBOUND]], i32* [[P_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003859// CHECK9-NEXT: [[TMP0:%.*]] = load i32, i32* [[P_LOWERBOUND]], align 4
3860// CHECK9-NEXT: [[TMP1:%.*]] = load i32, i32* [[P_UPPERBOUND]], align 4
3861// CHECK9-NEXT: [[TMP2:%.*]] = sub i32 [[TMP1]], [[TMP0]]
3862// CHECK9-NEXT: [[TMP3:%.*]] = add i32 [[TMP2]], 1
3863// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_HEADER:%.*]]
3864// CHECK9: omp_section_loop.header:
3865// CHECK9-NEXT: [[OMP_SECTION_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER]] ], [ [[OMP_SECTION_LOOP_NEXT:%.*]], [[OMP_SECTION_LOOP_INC:%.*]] ]
3866// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_COND:%.*]]
3867// CHECK9: omp_section_loop.cond:
3868// CHECK9-NEXT: [[OMP_SECTION_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV]], [[TMP3]]
3869// CHECK9-NEXT: br i1 [[OMP_SECTION_LOOP_CMP]], label [[OMP_SECTION_LOOP_BODY:%.*]], label [[OMP_SECTION_LOOP_EXIT:%.*]]
3870// CHECK9: omp_section_loop.body:
3871// CHECK9-NEXT: [[TMP4:%.*]] = add i32 [[OMP_SECTION_LOOP_IV]], [[TMP0]]
3872// CHECK9-NEXT: [[TMP5:%.*]] = mul i32 [[TMP4]], 1
3873// CHECK9-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], 0
3874// CHECK9-NEXT: switch i32 [[TMP6]], label [[OMP_SECTION_LOOP_INC]] [
3875// CHECK9-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE:%.*]]
3876// CHECK9-NEXT: ]
3877// CHECK9: omp_section_loop.inc:
3878// CHECK9-NEXT: [[OMP_SECTION_LOOP_NEXT]] = add nuw i32 [[OMP_SECTION_LOOP_IV]], 1
3879// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_HEADER]]
3880// CHECK9: omp_section_loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003881// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
3882// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3883// CHECK9-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003884// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_AFTER:%.*]]
3885// CHECK9: omp_section_loop.after:
3886// CHECK9-NEXT: br label [[OMP_SECTIONS_END:%.*]]
3887// CHECK9: omp_sections.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003888// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER13:%.*]]
3889// CHECK9: omp_section_loop.preheader13:
3890// CHECK9-NEXT: store i32 0, i32* [[P_LOWERBOUND28]], align 4
3891// CHECK9-NEXT: store i32 1, i32* [[P_UPPERBOUND29]], align 4
3892// CHECK9-NEXT: store i32 1, i32* [[P_STRIDE30]], align 4
3893// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM31:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3894// CHECK9-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]], i32 34, i32* [[P_LASTITER27]], i32* [[P_LOWERBOUND28]], i32* [[P_UPPERBOUND29]], i32* [[P_STRIDE30]], i32 1, i32 1)
3895// CHECK9-NEXT: [[TMP7:%.*]] = load i32, i32* [[P_LOWERBOUND28]], align 4
3896// CHECK9-NEXT: [[TMP8:%.*]] = load i32, i32* [[P_UPPERBOUND29]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003897// CHECK9-NEXT: [[TMP9:%.*]] = sub i32 [[TMP8]], [[TMP7]]
3898// CHECK9-NEXT: [[TMP10:%.*]] = add i32 [[TMP9]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07003899// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_HEADER14:%.*]]
3900// CHECK9: omp_section_loop.header14:
3901// CHECK9-NEXT: [[OMP_SECTION_LOOP_IV20:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER13]] ], [ [[OMP_SECTION_LOOP_NEXT22:%.*]], [[OMP_SECTION_LOOP_INC17:%.*]] ]
3902// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_COND15:%.*]]
3903// CHECK9: omp_section_loop.cond15:
3904// CHECK9-NEXT: [[OMP_SECTION_LOOP_CMP21:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV20]], [[TMP10]]
3905// CHECK9-NEXT: br i1 [[OMP_SECTION_LOOP_CMP21]], label [[OMP_SECTION_LOOP_BODY16:%.*]], label [[OMP_SECTION_LOOP_EXIT18:%.*]]
3906// CHECK9: omp_section_loop.body16:
3907// CHECK9-NEXT: [[TMP11:%.*]] = add i32 [[OMP_SECTION_LOOP_IV20]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003908// CHECK9-NEXT: [[TMP12:%.*]] = mul i32 [[TMP11]], 1
3909// CHECK9-NEXT: [[TMP13:%.*]] = add i32 [[TMP12]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07003910// CHECK9-NEXT: switch i32 [[TMP13]], label [[OMP_SECTION_LOOP_INC17]] [
3911// CHECK9-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE23:%.*]]
3912// CHECK9-NEXT: i32 1, label [[OMP_SECTION_LOOP_BODY_CASE25:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003913// CHECK9-NEXT: ]
Alexey Bataevc84a5442021-06-03 14:13:35 -07003914// CHECK9: omp_section_loop.inc17:
3915// CHECK9-NEXT: [[OMP_SECTION_LOOP_NEXT22]] = add nuw i32 [[OMP_SECTION_LOOP_IV20]], 1
3916// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_HEADER14]]
3917// CHECK9: omp_section_loop.exit18:
3918// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]])
3919// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM32:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3920// CHECK9-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM32]])
3921// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_AFTER19:%.*]]
3922// CHECK9: omp_section_loop.after19:
3923// CHECK9-NEXT: br label [[OMP_SECTIONS_END33:%.*]]
3924// CHECK9: omp_sections.end33:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003925// CHECK9-NEXT: [[TMP14:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
3926// CHECK9-NEXT: store i32 [[TMP14]], i32* [[DOTCAPTURE_EXPR_]], align 4
3927// CHECK9-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3928// CHECK9-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP15]], 0
3929// CHECK9-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07003930// CHECK9-NEXT: [[SUB35:%.*]] = sub nsw i32 [[DIV]], 1
3931// CHECK9-NEXT: store i32 [[SUB35]], i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003932// CHECK9-NEXT: store i32 0, i32* [[I]], align 4
3933// CHECK9-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
3934// CHECK9-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP16]]
3935// CHECK9-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
3936// CHECK9: omp.precond.then:
3937// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003938// CHECK9-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003939// CHECK9-NEXT: store i32 [[TMP17]], i32* [[DOTOMP_UB]], align 4
3940// CHECK9-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
3941// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003942// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM37:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB6:[0-9]+]])
3943// CHECK9-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM37]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003944// CHECK9-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003945// CHECK9-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
3946// CHECK9-NEXT: [[CMP38:%.*]] = icmp sgt i32 [[TMP18]], [[TMP19]]
3947// CHECK9-NEXT: br i1 [[CMP38]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003948// CHECK9: cond.true:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003949// CHECK9-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003950// CHECK9-NEXT: br label [[COND_END:%.*]]
3951// CHECK9: cond.false:
3952// CHECK9-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
3953// CHECK9-NEXT: br label [[COND_END]]
3954// CHECK9: cond.end:
3955// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ [[TMP20]], [[COND_TRUE]] ], [ [[TMP21]], [[COND_FALSE]] ]
3956// CHECK9-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
3957// CHECK9-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
3958// CHECK9-NEXT: store i32 [[TMP22]], i32* [[DOTOMP_IV]], align 4
3959// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
3960// CHECK9: omp.inner.for.cond:
3961// CHECK9-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3962// CHECK9-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003963// CHECK9-NEXT: [[CMP39:%.*]] = icmp sle i32 [[TMP23]], [[TMP24]]
3964// CHECK9-NEXT: br i1 [[CMP39]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003965// CHECK9: omp.inner.for.body:
3966// CHECK9-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
3967// CHECK9-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP25]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07003968// CHECK9-NEXT: [[ADD40:%.*]] = add nsw i32 0, [[MUL]]
3969// CHECK9-NEXT: store i32 [[ADD40]], i32* [[I36]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003970// CHECK9-NEXT: [[TMP26:%.*]] = load float, float* @flag, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07003971// CHECK9-NEXT: [[TOBOOL41:%.*]] = fcmp une float [[TMP26]], 0.000000e+00
3972// CHECK9-NEXT: br i1 [[TOBOOL41]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003973// CHECK9: omp_if.then:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003974// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM42:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB8:[0-9]+]])
3975// CHECK9-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM42]], i32 2)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003976// CHECK9-NEXT: [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
3977// CHECK9-NEXT: br i1 [[TMP28]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
3978// CHECK9: .cancel.exit:
3979// CHECK9-NEXT: br label [[CANCEL_EXIT:%.*]]
3980// CHECK9: omp_section_loop.body.case:
Alexey Bataevc84a5442021-06-03 14:13:35 -07003981// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3982// CHECK9-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM10]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003983// CHECK9-NEXT: [[TMP30:%.*]] = icmp eq i32 [[TMP29]], 0
3984// CHECK9-NEXT: br i1 [[TMP30]], label [[OMP_SECTION_LOOP_BODY_CASE_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE_CNCL:%.*]]
3985// CHECK9: omp_section_loop.body.case.split:
3986// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
3987// CHECK9: omp_section_loop.body.case.cncl:
3988// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
Alexey Bataevc84a5442021-06-03 14:13:35 -07003989// CHECK9: omp_section_loop.body.case23:
3990// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM24:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
3991// CHECK9-NEXT: [[TMP31:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM24]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07003992// CHECK9-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07003993// CHECK9-NEXT: br i1 [[TMP32]], label [[OMP_SECTION_LOOP_BODY_CASE23_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE23_CNCL:%.*]]
3994// CHECK9: omp_section_loop.body.case23.split:
3995// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
3996// CHECK9: omp_section_loop.body.case23.cncl:
3997// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
3998// CHECK9: omp_section_loop.body.case25:
3999// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM26:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4000// CHECK9-NEXT: [[TMP33:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM26]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004001// CHECK9-NEXT: [[TMP34:%.*]] = icmp eq i32 [[TMP33]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004002// CHECK9-NEXT: br i1 [[TMP34]], label [[OMP_SECTION_LOOP_BODY_CASE25_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE25_CNCL:%.*]]
4003// CHECK9: omp_section_loop.body.case25.split:
4004// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
4005// CHECK9: omp_section_loop.body.case25.cncl:
4006// CHECK9-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004007// CHECK9: .cancel.continue:
4008// CHECK9-NEXT: br label [[OMP_IF_END:%.*]]
4009// CHECK9: omp_if.else:
4010// CHECK9-NEXT: br label [[OMP_IF_END]]
4011// CHECK9: omp_if.end:
4012// CHECK9-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4013// CHECK9: omp.body.continue:
4014// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4015// CHECK9: omp.inner.for.inc:
4016// CHECK9-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004017// CHECK9-NEXT: [[ADD43:%.*]] = add nsw i32 [[TMP35]], 1
4018// CHECK9-NEXT: store i32 [[ADD43]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004019// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]
4020// CHECK9: omp.inner.for.end:
4021// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4022// CHECK9: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004023// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM45:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10:[0-9]+]])
4024// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM45]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004025// CHECK9-NEXT: br label [[OMP_PRECOND_END]]
4026// CHECK9: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004027// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM44:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10]])
4028// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM44]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004029// CHECK9-NEXT: br label [[CANCEL_CONT:%.*]]
4030// CHECK9: omp.precond.end:
4031// CHECK9-NEXT: br label [[CANCEL_CONT]]
4032// CHECK9: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004033// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM46:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4034// CHECK9-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM46]])
4035// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM47:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14:[0-9]+]])
4036// CHECK9-NEXT: [[TMP36:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM47]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004037// CHECK9-NEXT: [[TMP37:%.*]] = bitcast i8* [[TMP36]] to %struct.kmp_task_t_with_privates*
4038// CHECK9-NEXT: [[TMP38:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP37]], i32 0, i32 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004039// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM48:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14]])
4040// CHECK9-NEXT: [[TMP39:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM48]], i8* [[TMP36]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004041// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
4042// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004043// CHECK9-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004044// CHECK9-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
4045// CHECK9-NEXT: [[TMP40:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4046// CHECK9-NEXT: ret i32 [[TMP40]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004047//
4048//
4049// CHECK9-LABEL: define {{[^@]+}}@main..omp_par
4050// CHECK9-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[ARGC_ADDR:%.*]], i8*** [[ARGV_ADDR:%.*]]) #[[ATTR1:[0-9]+]] {
4051// CHECK9-NEXT: omp.par.entry:
4052// CHECK9-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4053// CHECK9-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4054// CHECK9-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4055// CHECK9-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4056// CHECK9-NEXT: br label [[OMP_PAR_REGION:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004057// CHECK9: omp.par.region:
4058// CHECK9-NEXT: [[TMP1:%.*]] = load float, float* @flag, align 4
4059// CHECK9-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP1]], 0.000000e+00
4060// CHECK9-NEXT: br i1 [[TOBOOL]], label [[TMP13:%.*]], label [[TMP2:%.*]]
4061// CHECK9: 2:
4062// CHECK9-NEXT: br label [[TMP3:%.*]]
4063// CHECK9: 3:
4064// CHECK9-NEXT: [[TMP4:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4065// CHECK9-NEXT: [[CONV:%.*]] = trunc i32 [[TMP4]] to i8
4066// CHECK9-NEXT: [[TMP5:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
4067// CHECK9-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP5]], i64 0
4068// CHECK9-NEXT: [[TMP6:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07004069// CHECK9-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, i8* [[TMP6]], i64 0
4070// CHECK9-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX3]], align 1
4071// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4072// CHECK9-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004073// CHECK9-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004074// CHECK9-NEXT: br i1 [[TMP8]], label [[DOTCONT:%.*]], label [[DOTCNCL5:%.*]]
4075// CHECK9: .cncl5:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004076// CHECK9-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4077// CHECK9: .cont:
4078// CHECK9-NEXT: [[TMP9:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4079// CHECK9-NEXT: [[TMP10:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07004080// CHECK9-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i8*, i8** [[TMP10]], i64 0
4081// CHECK9-NEXT: [[TMP11:%.*]] = load i8*, i8** [[ARRAYIDX6]], align 8
4082// CHECK9-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, i8* [[TMP11]], i64 0
4083// CHECK9-NEXT: [[TMP12:%.*]] = load i8, i8* [[ARRAYIDX7]], align 1
4084// CHECK9-NEXT: [[CONV8:%.*]] = sext i8 [[TMP12]] to i32
4085// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV8]], [[TMP9]]
4086// CHECK9-NEXT: [[CONV9:%.*]] = trunc i32 [[ADD]] to i8
4087// CHECK9-NEXT: store i8 [[CONV9]], i8* [[ARRAYIDX7]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004088// CHECK9-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4089// CHECK9: omp.par.pre_finalize:
4090// CHECK9-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
4091// CHECK9: 13:
4092// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4093// CHECK9-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 1)
4094// CHECK9-NEXT: [[TMP15:%.*]] = icmp eq i32 [[TMP14]], 0
4095// CHECK9-NEXT: br i1 [[TMP15]], label [[DOTSPLIT:%.*]], label [[DOTCNCL:%.*]]
4096// CHECK9: .cncl:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004097// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4098// CHECK9-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004099// CHECK9-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
4100// CHECK9: .split:
4101// CHECK9-NEXT: br label [[TMP3]]
Vyacheslav Zakharin2e192ab2021-08-24 16:19:49 -07004102// CHECK9: omp.par.outlined.exit.exitStub:
4103// CHECK9-NEXT: ret void
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004104//
4105//
4106// CHECK9-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004107// CHECK9-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004108// CHECK9-NEXT: entry:
4109// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
4110// CHECK9-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
4111// CHECK9-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
4112// CHECK9-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
4113// CHECK9-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
4114// CHECK9-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
4115// CHECK9-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
4116// CHECK9-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
4117// CHECK9-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
4118// CHECK9-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
4119// CHECK9-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
4120// CHECK9-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
4121// CHECK9-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
4122// CHECK9-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
4123// CHECK9-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
4124// CHECK9-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
4125// CHECK9-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
4126// CHECK9-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
4127// CHECK9-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004128// CHECK9-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
4129// CHECK9-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
4130// CHECK9-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
4131// CHECK9-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
4132// CHECK9-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
4133// CHECK9-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
4134// CHECK9-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
4135// CHECK9-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
4136// CHECK9-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
4137// CHECK9-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
4138// CHECK9-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004139// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM_I:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB12:[0-9]+]]) #[[ATTR2:[0-9]+]]
4140// CHECK9-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM_I]], i32 4) #[[ATTR2]]
4141// CHECK9-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
4142// CHECK9-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
4143// CHECK9: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004144// CHECK9-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004145// CHECK9-NEXT: br label [[DOTOMP_OUTLINED__EXIT:%.*]]
4146// CHECK9: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004147// CHECK9-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004148// CHECK9-NEXT: br label [[DOTOMP_OUTLINED__EXIT]]
4149// CHECK9: .omp_outlined..exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004150// CHECK9-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004151// CHECK9-NEXT: ret i32 0
4152//
4153//
4154// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004155// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004156// CHECK9-NEXT: entry:
4157// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4158// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4159// CHECK9-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
4160// CHECK9-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
4161// CHECK9-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
4162// CHECK9-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
4163// CHECK9-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
4164// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4165// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4166// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4167// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4168// CHECK9-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
4169// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
4170// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB17:[0-9]+]])
4171// CHECK9-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004172// CHECK9-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4173// CHECK9-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 0
4174// CHECK9-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 0
4175// CHECK9-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
4176// CHECK9-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4177// CHECK9-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004178// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4179// CHECK9: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004180// CHECK9-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4181// CHECK9-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4182// CHECK9-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004183// CHECK9-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4184// CHECK9: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004185// CHECK9-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4186// CHECK9-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004187// CHECK9-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
4188// CHECK9-NEXT: ]
4189// CHECK9: .omp.sections.case:
4190// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004191// CHECK9-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
4192// CHECK9-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
4193// CHECK9-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004194// CHECK9: .omp.sections.case.split:
4195// CHECK9-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
4196// CHECK9: .omp.sections.case.cncl:
4197// CHECK9-NEXT: br label [[CANCEL_CONT:%.*]]
4198// CHECK9: .omp.sections.exit:
4199// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4200// CHECK9: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004201// CHECK9-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4202// CHECK9-NEXT: [[INC:%.*]] = add nsw i32 [[TMP9]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004203// CHECK9-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
4204// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]
4205// CHECK9: omp.inner.for.end:
4206// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19:[0-9]+]])
4207// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
4208// CHECK9-NEXT: br label [[CANCEL_CONT]]
4209// CHECK9: cancel.cont:
4210// CHECK9-NEXT: ret void
4211// CHECK9: cancel.exit:
4212// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19]])
4213// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4214// CHECK9-NEXT: br label [[CANCEL_CONT]]
4215//
4216//
4217// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004218// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004219// CHECK9-NEXT: entry:
4220// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4221// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4222// CHECK9-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
4223// CHECK9-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
4224// CHECK9-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
4225// CHECK9-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
4226// CHECK9-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
4227// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4228// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4229// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4230// CHECK9-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4231// CHECK9-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
4232// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
4233// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB21:[0-9]+]])
4234// CHECK9-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004235// CHECK9-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4236// CHECK9-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 1
4237// CHECK9-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 1
4238// CHECK9-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
4239// CHECK9-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4240// CHECK9-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004241// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4242// CHECK9: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004243// CHECK9-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4244// CHECK9-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4245// CHECK9-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004246// CHECK9-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4247// CHECK9: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004248// CHECK9-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4249// CHECK9-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004250// CHECK9-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
4251// CHECK9-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE2:%.*]]
4252// CHECK9-NEXT: ]
4253// CHECK9: .omp.sections.case:
4254// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004255// CHECK9-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
4256// CHECK9-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
4257// CHECK9-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004258// CHECK9: .omp.sections.case.split:
4259// CHECK9-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
4260// CHECK9: .omp.sections.case.cncl:
4261// CHECK9-NEXT: br label [[CANCEL_CONT:%.*]]
4262// CHECK9: .omp.sections.case2:
4263// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004264// CHECK9-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]], i32 3)
4265// CHECK9-NEXT: [[TMP10:%.*]] = icmp eq i32 [[TMP9]], 0
4266// CHECK9-NEXT: br i1 [[TMP10]], label [[DOTOMP_SECTIONS_CASE2_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE2_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004267// CHECK9: .omp.sections.case2.split:
4268// CHECK9-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
4269// CHECK9: .omp.sections.case2.cncl:
4270// CHECK9-NEXT: br label [[OMP_INNER_FOR_END]]
4271// CHECK9: .omp.sections.exit:
4272// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4273// CHECK9: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004274// CHECK9-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4275// CHECK9-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004276// CHECK9-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
4277// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]
4278// CHECK9: omp.inner.for.end:
4279// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23:[0-9]+]])
4280// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM5]])
4281// CHECK9-NEXT: br label [[CANCEL_CONT]]
4282// CHECK9: cancel.cont:
4283// CHECK9-NEXT: ret void
4284// CHECK9: cancel.exit:
4285// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23]])
4286// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
4287// CHECK9-NEXT: br label [[CANCEL_CONT]]
4288//
4289//
4290// CHECK9-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004291// CHECK9-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004292// CHECK9-NEXT: entry:
4293// CHECK9-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4294// CHECK9-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004295// CHECK9-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
4296// CHECK9-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004297// CHECK9-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4298// CHECK9-NEXT: [[TMP:%.*]] = alloca i32, align 4
4299// CHECK9-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4300// CHECK9-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4301// CHECK9-NEXT: [[I:%.*]] = alloca i32, align 4
4302// CHECK9-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4303// CHECK9-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4304// CHECK9-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4305// CHECK9-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004306// CHECK9-NEXT: [[R3:%.*]] = alloca i32, align 4
4307// CHECK9-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004308// CHECK9-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
4309// CHECK9-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4310// CHECK9-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004311// CHECK9-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
4312// CHECK9-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
4313// CHECK9-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
4314// CHECK9-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
4315// CHECK9-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
4316// CHECK9-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
4317// CHECK9-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4318// CHECK9-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004319// CHECK9-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4320// CHECK9-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4321// CHECK9-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4322// CHECK9-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004323// CHECK9-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4324// CHECK9-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004325// CHECK9-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4326// CHECK9: omp.precond.then:
4327// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004328// CHECK9-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4329// CHECK9-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004330// CHECK9-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4331// CHECK9-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004332// CHECK9-NEXT: store i32 0, i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004333// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB25:[0-9]+]])
4334// CHECK9-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004335// CHECK9-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4336// CHECK9-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4337// CHECK9-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP6]], [[TMP7]]
4338// CHECK9-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004339// CHECK9: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004340// CHECK9-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004341// CHECK9-NEXT: br label [[COND_END:%.*]]
4342// CHECK9: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004343// CHECK9-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004344// CHECK9-NEXT: br label [[COND_END]]
4345// CHECK9: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004346// CHECK9-NEXT: [[COND:%.*]] = phi i32 [ [[TMP8]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004347// CHECK9-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004348// CHECK9-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4349// CHECK9-NEXT: store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004350// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4351// CHECK9: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004352// CHECK9-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4353// CHECK9-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4354// CHECK9-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
4355// CHECK9-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004356// CHECK9: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004357// CHECK9-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4358// CHECK9-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004359// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004360// CHECK9-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
4361// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB27:[0-9]+]])
4362// CHECK9-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM7]], i32 2)
4363// CHECK9-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
4364// CHECK9-NEXT: br i1 [[TMP15]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004365// CHECK9: .cancel.exit:
4366// CHECK9-NEXT: br label [[CANCEL_EXIT:%.*]]
4367// CHECK9: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004368// CHECK9-NEXT: [[TMP16:%.*]] = load i32, i32* [[I4]], align 4
4369// CHECK9-NEXT: [[TMP17:%.*]] = load i32, i32* [[R3]], align 4
4370// CHECK9-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP17]], [[TMP16]]
4371// CHECK9-NEXT: store i32 [[ADD8]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004372// CHECK9-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4373// CHECK9: omp.body.continue:
4374// CHECK9-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4375// CHECK9: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004376// CHECK9-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4377// CHECK9-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP18]], 1
4378// CHECK9-NEXT: store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004379// CHECK9-NEXT: br label [[OMP_INNER_FOR_COND]]
4380// CHECK9: omp.inner.for.end:
4381// CHECK9-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4382// CHECK9: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004383// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29:[0-9]+]])
4384// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
4385// CHECK9-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
4386// CHECK9-NEXT: [[TMP20:%.*]] = bitcast i32* [[R3]] to i8*
4387// CHECK9-NEXT: store i8* [[TMP20]], i8** [[TMP19]], align 8
4388// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
4389// CHECK9-NEXT: [[TMP21:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
4390// CHECK9-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB30:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]], i32 1, i64 8, i8* [[TMP21]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
4391// CHECK9-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004392// CHECK9-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
4393// CHECK9-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
4394// CHECK9-NEXT: ]
4395// CHECK9: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004396// CHECK9-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP1]], align 4
4397// CHECK9-NEXT: [[TMP24:%.*]] = load i32, i32* [[R3]], align 4
4398// CHECK9-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
4399// CHECK9-NEXT: store i32 [[ADD13]], i32* [[TMP1]], align 4
4400// CHECK9-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB30]], i32 [[OMP_GLOBAL_THREAD_NUM12]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004401// CHECK9-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
4402// CHECK9: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004403// CHECK9-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
4404// CHECK9-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM10]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004405// CHECK9-NEXT: br label [[CANCEL_CONT:%.*]]
4406// CHECK9: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004407// CHECK9-NEXT: [[TMP25:%.*]] = load i32, i32* [[R3]], align 4
4408// CHECK9-NEXT: [[TMP26:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP25]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004409// CHECK9-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
4410// CHECK9: .omp.reduction.default:
4411// CHECK9-NEXT: br label [[OMP_PRECOND_END]]
4412// CHECK9: omp.precond.end:
4413// CHECK9-NEXT: br label [[CANCEL_CONT]]
4414// CHECK9: cancel.cont:
4415// CHECK9-NEXT: ret void
4416//
4417//
4418// CHECK9-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004419// CHECK9-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004420// CHECK9-NEXT: entry:
4421// CHECK9-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
4422// CHECK9-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
4423// CHECK9-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
4424// CHECK9-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
4425// CHECK9-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
4426// CHECK9-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
4427// CHECK9-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
4428// CHECK9-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
4429// CHECK9-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
4430// CHECK9-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
4431// CHECK9-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
4432// CHECK9-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
4433// CHECK9-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
4434// CHECK9-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
4435// CHECK9-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
4436// CHECK9-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
4437// CHECK9-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
4438// CHECK9-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
4439// CHECK9-NEXT: ret void
4440//
4441//
4442// CHECK10-LABEL: define {{[^@]+}}@main
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004443// CHECK10-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004444// CHECK10-NEXT: entry:
4445// CHECK10-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
4446// CHECK10-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
4447// CHECK10-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8
4448// CHECK10-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4
4449// CHECK10-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4
4450// CHECK10-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4
4451// CHECK10-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004452// CHECK10-NEXT: [[P_LASTITER27:%.*]] = alloca i32, align 4
4453// CHECK10-NEXT: [[P_LOWERBOUND28:%.*]] = alloca i32, align 4
4454// CHECK10-NEXT: [[P_UPPERBOUND29:%.*]] = alloca i32, align 4
4455// CHECK10-NEXT: [[P_STRIDE30:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004456// CHECK10-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4457// CHECK10-NEXT: [[TMP:%.*]] = alloca i32, align 4
4458// CHECK10-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004459// CHECK10-NEXT: [[DOTCAPTURE_EXPR_34:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004460// CHECK10-NEXT: [[I:%.*]] = alloca i32, align 4
4461// CHECK10-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4462// CHECK10-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4463// CHECK10-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4464// CHECK10-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004465// CHECK10-NEXT: [[I36:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004466// CHECK10-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
4467// CHECK10-NEXT: [[R:%.*]] = alloca i32, align 4
4468// CHECK10-NEXT: store i32 0, i32* [[RETVAL]], align 4
4469// CHECK10-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4
4470// CHECK10-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8
4471// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
4472// CHECK10-NEXT: br label [[OMP_PARALLEL:%.*]]
4473// CHECK10: omp_parallel:
4474// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i8***)* @main..omp_par to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i8*** [[ARGV_ADDR]])
4475// CHECK10-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]]
4476// CHECK10: omp.par.outlined.exit:
4477// CHECK10-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]]
4478// CHECK10: omp.par.exit.split:
4479// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER:%.*]]
4480// CHECK10: omp_section_loop.preheader:
4481// CHECK10-NEXT: store i32 0, i32* [[P_LOWERBOUND]], align 4
4482// CHECK10-NEXT: store i32 0, i32* [[P_UPPERBOUND]], align 4
4483// CHECK10-NEXT: store i32 1, i32* [[P_STRIDE]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004484// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4485// CHECK10-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]], i32 34, i32* [[P_LASTITER]], i32* [[P_LOWERBOUND]], i32* [[P_UPPERBOUND]], i32* [[P_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004486// CHECK10-NEXT: [[TMP0:%.*]] = load i32, i32* [[P_LOWERBOUND]], align 4
4487// CHECK10-NEXT: [[TMP1:%.*]] = load i32, i32* [[P_UPPERBOUND]], align 4
4488// CHECK10-NEXT: [[TMP2:%.*]] = sub i32 [[TMP1]], [[TMP0]]
4489// CHECK10-NEXT: [[TMP3:%.*]] = add i32 [[TMP2]], 1
4490// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_HEADER:%.*]]
4491// CHECK10: omp_section_loop.header:
4492// CHECK10-NEXT: [[OMP_SECTION_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER]] ], [ [[OMP_SECTION_LOOP_NEXT:%.*]], [[OMP_SECTION_LOOP_INC:%.*]] ]
4493// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_COND:%.*]]
4494// CHECK10: omp_section_loop.cond:
4495// CHECK10-NEXT: [[OMP_SECTION_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV]], [[TMP3]]
4496// CHECK10-NEXT: br i1 [[OMP_SECTION_LOOP_CMP]], label [[OMP_SECTION_LOOP_BODY:%.*]], label [[OMP_SECTION_LOOP_EXIT:%.*]]
4497// CHECK10: omp_section_loop.body:
4498// CHECK10-NEXT: [[TMP4:%.*]] = add i32 [[OMP_SECTION_LOOP_IV]], [[TMP0]]
4499// CHECK10-NEXT: [[TMP5:%.*]] = mul i32 [[TMP4]], 1
4500// CHECK10-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], 0
4501// CHECK10-NEXT: switch i32 [[TMP6]], label [[OMP_SECTION_LOOP_INC]] [
4502// CHECK10-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE:%.*]]
4503// CHECK10-NEXT: ]
4504// CHECK10: omp_section_loop.inc:
4505// CHECK10-NEXT: [[OMP_SECTION_LOOP_NEXT]] = add nuw i32 [[OMP_SECTION_LOOP_IV]], 1
4506// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_HEADER]]
4507// CHECK10: omp_section_loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004508// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
4509// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4510// CHECK10-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004511// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_AFTER:%.*]]
4512// CHECK10: omp_section_loop.after:
4513// CHECK10-NEXT: br label [[OMP_SECTIONS_END:%.*]]
4514// CHECK10: omp_sections.end:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004515// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER13:%.*]]
4516// CHECK10: omp_section_loop.preheader13:
4517// CHECK10-NEXT: store i32 0, i32* [[P_LOWERBOUND28]], align 4
4518// CHECK10-NEXT: store i32 1, i32* [[P_UPPERBOUND29]], align 4
4519// CHECK10-NEXT: store i32 1, i32* [[P_STRIDE30]], align 4
4520// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM31:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4521// CHECK10-NEXT: call void @__kmpc_for_static_init_4u(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]], i32 34, i32* [[P_LASTITER27]], i32* [[P_LOWERBOUND28]], i32* [[P_UPPERBOUND29]], i32* [[P_STRIDE30]], i32 1, i32 1)
4522// CHECK10-NEXT: [[TMP7:%.*]] = load i32, i32* [[P_LOWERBOUND28]], align 4
4523// CHECK10-NEXT: [[TMP8:%.*]] = load i32, i32* [[P_UPPERBOUND29]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004524// CHECK10-NEXT: [[TMP9:%.*]] = sub i32 [[TMP8]], [[TMP7]]
4525// CHECK10-NEXT: [[TMP10:%.*]] = add i32 [[TMP9]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07004526// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_HEADER14:%.*]]
4527// CHECK10: omp_section_loop.header14:
4528// CHECK10-NEXT: [[OMP_SECTION_LOOP_IV20:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER13]] ], [ [[OMP_SECTION_LOOP_NEXT22:%.*]], [[OMP_SECTION_LOOP_INC17:%.*]] ]
4529// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_COND15:%.*]]
4530// CHECK10: omp_section_loop.cond15:
4531// CHECK10-NEXT: [[OMP_SECTION_LOOP_CMP21:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV20]], [[TMP10]]
4532// CHECK10-NEXT: br i1 [[OMP_SECTION_LOOP_CMP21]], label [[OMP_SECTION_LOOP_BODY16:%.*]], label [[OMP_SECTION_LOOP_EXIT18:%.*]]
4533// CHECK10: omp_section_loop.body16:
4534// CHECK10-NEXT: [[TMP11:%.*]] = add i32 [[OMP_SECTION_LOOP_IV20]], [[TMP7]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004535// CHECK10-NEXT: [[TMP12:%.*]] = mul i32 [[TMP11]], 1
4536// CHECK10-NEXT: [[TMP13:%.*]] = add i32 [[TMP12]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004537// CHECK10-NEXT: switch i32 [[TMP13]], label [[OMP_SECTION_LOOP_INC17]] [
4538// CHECK10-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE23:%.*]]
4539// CHECK10-NEXT: i32 1, label [[OMP_SECTION_LOOP_BODY_CASE25:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004540// CHECK10-NEXT: ]
Alexey Bataevc84a5442021-06-03 14:13:35 -07004541// CHECK10: omp_section_loop.inc17:
4542// CHECK10-NEXT: [[OMP_SECTION_LOOP_NEXT22]] = add nuw i32 [[OMP_SECTION_LOOP_IV20]], 1
4543// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_HEADER14]]
4544// CHECK10: omp_section_loop.exit18:
4545// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM31]])
4546// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM32:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4547// CHECK10-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM32]])
4548// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_AFTER19:%.*]]
4549// CHECK10: omp_section_loop.after19:
4550// CHECK10-NEXT: br label [[OMP_SECTIONS_END33:%.*]]
4551// CHECK10: omp_sections.end33:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004552// CHECK10-NEXT: [[TMP14:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4553// CHECK10-NEXT: store i32 [[TMP14]], i32* [[DOTCAPTURE_EXPR_]], align 4
4554// CHECK10-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4555// CHECK10-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP15]], 0
4556// CHECK10-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07004557// CHECK10-NEXT: [[SUB35:%.*]] = sub nsw i32 [[DIV]], 1
4558// CHECK10-NEXT: store i32 [[SUB35]], i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004559// CHECK10-NEXT: store i32 0, i32* [[I]], align 4
4560// CHECK10-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4561// CHECK10-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP16]]
4562// CHECK10-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4563// CHECK10: omp.precond.then:
4564// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004565// CHECK10-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004566// CHECK10-NEXT: store i32 [[TMP17]], i32* [[DOTOMP_UB]], align 4
4567// CHECK10-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4568// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004569// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM37:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB6:[0-9]+]])
4570// CHECK10-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM37]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004571// CHECK10-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004572// CHECK10-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
4573// CHECK10-NEXT: [[CMP38:%.*]] = icmp sgt i32 [[TMP18]], [[TMP19]]
4574// CHECK10-NEXT: br i1 [[CMP38]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004575// CHECK10: cond.true:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004576// CHECK10-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_34]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004577// CHECK10-NEXT: br label [[COND_END:%.*]]
4578// CHECK10: cond.false:
4579// CHECK10-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4580// CHECK10-NEXT: br label [[COND_END]]
4581// CHECK10: cond.end:
4582// CHECK10-NEXT: [[COND:%.*]] = phi i32 [ [[TMP20]], [[COND_TRUE]] ], [ [[TMP21]], [[COND_FALSE]] ]
4583// CHECK10-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
4584// CHECK10-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4585// CHECK10-NEXT: store i32 [[TMP22]], i32* [[DOTOMP_IV]], align 4
4586// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4587// CHECK10: omp.inner.for.cond:
4588// CHECK10-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4589// CHECK10-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004590// CHECK10-NEXT: [[CMP39:%.*]] = icmp sle i32 [[TMP23]], [[TMP24]]
4591// CHECK10-NEXT: br i1 [[CMP39]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004592// CHECK10: omp.inner.for.body:
4593// CHECK10-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4594// CHECK10-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP25]], 1
Alexey Bataevc84a5442021-06-03 14:13:35 -07004595// CHECK10-NEXT: [[ADD40:%.*]] = add nsw i32 0, [[MUL]]
4596// CHECK10-NEXT: store i32 [[ADD40]], i32* [[I36]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004597// CHECK10-NEXT: [[TMP26:%.*]] = load float, float* @flag, align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004598// CHECK10-NEXT: [[TOBOOL41:%.*]] = fcmp une float [[TMP26]], 0.000000e+00
4599// CHECK10-NEXT: br i1 [[TOBOOL41]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004600// CHECK10: omp_if.then:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004601// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM42:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB8:[0-9]+]])
4602// CHECK10-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM42]], i32 2)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004603// CHECK10-NEXT: [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
4604// CHECK10-NEXT: br i1 [[TMP28]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
4605// CHECK10: .cancel.exit:
4606// CHECK10-NEXT: br label [[CANCEL_EXIT:%.*]]
4607// CHECK10: omp_section_loop.body.case:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004608// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4609// CHECK10-NEXT: [[TMP29:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM10]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004610// CHECK10-NEXT: [[TMP30:%.*]] = icmp eq i32 [[TMP29]], 0
4611// CHECK10-NEXT: br i1 [[TMP30]], label [[OMP_SECTION_LOOP_BODY_CASE_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE_CNCL:%.*]]
4612// CHECK10: omp_section_loop.body.case.split:
4613// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
4614// CHECK10: omp_section_loop.body.case.cncl:
4615// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
Alexey Bataevc84a5442021-06-03 14:13:35 -07004616// CHECK10: omp_section_loop.body.case23:
4617// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM24:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4618// CHECK10-NEXT: [[TMP31:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM24]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004619// CHECK10-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004620// CHECK10-NEXT: br i1 [[TMP32]], label [[OMP_SECTION_LOOP_BODY_CASE23_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE23_CNCL:%.*]]
4621// CHECK10: omp_section_loop.body.case23.split:
4622// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
4623// CHECK10: omp_section_loop.body.case23.cncl:
4624// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
4625// CHECK10: omp_section_loop.body.case25:
4626// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM26:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4627// CHECK10-NEXT: [[TMP33:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM26]], i32 3)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004628// CHECK10-NEXT: [[TMP34:%.*]] = icmp eq i32 [[TMP33]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004629// CHECK10-NEXT: br i1 [[TMP34]], label [[OMP_SECTION_LOOP_BODY_CASE25_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE25_CNCL:%.*]]
4630// CHECK10: omp_section_loop.body.case25.split:
4631// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
4632// CHECK10: omp_section_loop.body.case25.cncl:
4633// CHECK10-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004634// CHECK10: .cancel.continue:
4635// CHECK10-NEXT: br label [[OMP_IF_END:%.*]]
4636// CHECK10: omp_if.else:
4637// CHECK10-NEXT: br label [[OMP_IF_END]]
4638// CHECK10: omp_if.end:
4639// CHECK10-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4640// CHECK10: omp.body.continue:
4641// CHECK10-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4642// CHECK10: omp.inner.for.inc:
4643// CHECK10-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
Alexey Bataevc84a5442021-06-03 14:13:35 -07004644// CHECK10-NEXT: [[ADD43:%.*]] = add nsw i32 [[TMP35]], 1
4645// CHECK10-NEXT: store i32 [[ADD43]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004646// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND]]
4647// CHECK10: omp.inner.for.end:
4648// CHECK10-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4649// CHECK10: omp.loop.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004650// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM45:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10:[0-9]+]])
4651// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM45]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004652// CHECK10-NEXT: br label [[OMP_PRECOND_END]]
4653// CHECK10: cancel.exit:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004654// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM44:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB10]])
4655// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM44]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004656// CHECK10-NEXT: br label [[CANCEL_CONT:%.*]]
4657// CHECK10: omp.precond.end:
4658// CHECK10-NEXT: br label [[CANCEL_CONT]]
4659// CHECK10: cancel.cont:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004660// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM46:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4661// CHECK10-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM46]])
4662// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM47:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14:[0-9]+]])
4663// CHECK10-NEXT: [[TMP36:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM47]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004664// CHECK10-NEXT: [[TMP37:%.*]] = bitcast i8* [[TMP36]] to %struct.kmp_task_t_with_privates*
4665// CHECK10-NEXT: [[TMP38:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP37]], i32 0, i32 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004666// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM48:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB14]])
4667// CHECK10-NEXT: [[TMP39:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM48]], i8* [[TMP36]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004668// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
4669// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004670// CHECK10-NEXT: store i32 0, i32* [[R]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004671// CHECK10-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]], i32* [[R]])
4672// CHECK10-NEXT: [[TMP40:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4673// CHECK10-NEXT: ret i32 [[TMP40]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004674//
4675//
4676// CHECK10-LABEL: define {{[^@]+}}@main..omp_par
4677// CHECK10-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[ARGC_ADDR:%.*]], i8*** [[ARGV_ADDR:%.*]]) #[[ATTR1:[0-9]+]] {
4678// CHECK10-NEXT: omp.par.entry:
4679// CHECK10-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4
4680// CHECK10-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4
4681// CHECK10-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4
4682// CHECK10-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4
4683// CHECK10-NEXT: br label [[OMP_PAR_REGION:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004684// CHECK10: omp.par.region:
4685// CHECK10-NEXT: [[TMP1:%.*]] = load float, float* @flag, align 4
4686// CHECK10-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP1]], 0.000000e+00
4687// CHECK10-NEXT: br i1 [[TOBOOL]], label [[TMP13:%.*]], label [[TMP2:%.*]]
4688// CHECK10: 2:
4689// CHECK10-NEXT: br label [[TMP3:%.*]]
4690// CHECK10: 3:
4691// CHECK10-NEXT: [[TMP4:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4692// CHECK10-NEXT: [[CONV:%.*]] = trunc i32 [[TMP4]] to i8
4693// CHECK10-NEXT: [[TMP5:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
4694// CHECK10-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP5]], i64 0
4695// CHECK10-NEXT: [[TMP6:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07004696// CHECK10-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, i8* [[TMP6]], i64 0
4697// CHECK10-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX3]], align 1
4698// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4699// CHECK10-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004700// CHECK10-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
Alexey Bataevc84a5442021-06-03 14:13:35 -07004701// CHECK10-NEXT: br i1 [[TMP8]], label [[DOTCONT:%.*]], label [[DOTCNCL5:%.*]]
4702// CHECK10: .cncl5:
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004703// CHECK10-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]]
4704// CHECK10: .cont:
4705// CHECK10-NEXT: [[TMP9:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4
4706// CHECK10-NEXT: [[TMP10:%.*]] = load i8**, i8*** [[ARGV_ADDR]], align 8
Alexey Bataevc84a5442021-06-03 14:13:35 -07004707// CHECK10-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i8*, i8** [[TMP10]], i64 0
4708// CHECK10-NEXT: [[TMP11:%.*]] = load i8*, i8** [[ARRAYIDX6]], align 8
4709// CHECK10-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, i8* [[TMP11]], i64 0
4710// CHECK10-NEXT: [[TMP12:%.*]] = load i8, i8* [[ARRAYIDX7]], align 1
4711// CHECK10-NEXT: [[CONV8:%.*]] = sext i8 [[TMP12]] to i32
4712// CHECK10-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV8]], [[TMP9]]
4713// CHECK10-NEXT: [[CONV9:%.*]] = trunc i32 [[ADD]] to i8
4714// CHECK10-NEXT: store i8 [[CONV9]], i8* [[ARRAYIDX7]], align 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004715// CHECK10-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]]
4716// CHECK10: omp.par.pre_finalize:
4717// CHECK10-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
4718// CHECK10: 13:
4719// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4720// CHECK10-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 1)
4721// CHECK10-NEXT: [[TMP15:%.*]] = icmp eq i32 [[TMP14]], 0
4722// CHECK10-NEXT: br i1 [[TMP15]], label [[DOTSPLIT:%.*]], label [[DOTCNCL:%.*]]
4723// CHECK10: .cncl:
Alexey Bataevc84a5442021-06-03 14:13:35 -07004724// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
4725// CHECK10-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004726// CHECK10-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB]]
4727// CHECK10: .split:
4728// CHECK10-NEXT: br label [[TMP3]]
Vyacheslav Zakharin2e192ab2021-08-24 16:19:49 -07004729// CHECK10: omp.par.outlined.exit.exitStub:
4730// CHECK10-NEXT: ret void
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004731//
4732//
4733// CHECK10-LABEL: define {{[^@]+}}@.omp_task_entry.
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004734// CHECK10-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004735// CHECK10-NEXT: entry:
4736// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
4737// CHECK10-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
4738// CHECK10-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
4739// CHECK10-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
4740// CHECK10-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
4741// CHECK10-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
4742// CHECK10-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4
4743// CHECK10-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4
4744// CHECK10-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
4745// CHECK10-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4
4746// CHECK10-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
4747// CHECK10-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
4748// CHECK10-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
4749// CHECK10-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
4750// CHECK10-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
4751// CHECK10-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
4752// CHECK10-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
4753// CHECK10-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
4754// CHECK10-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004755// CHECK10-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])
4756// CHECK10-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
4757// CHECK10-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
4758// CHECK10-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])
4759// CHECK10-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14
4760// CHECK10-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14
4761// CHECK10-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14
4762// CHECK10-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14
4763// CHECK10-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14
4764// CHECK10-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
4765// CHECK10-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004766// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM_I:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB12:[0-9]+]]) #[[ATTR2:[0-9]+]]
4767// CHECK10-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM_I]], i32 4) #[[ATTR2]]
4768// CHECK10-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0
4769// CHECK10-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]
4770// CHECK10: .cancel.exit.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004771// CHECK10-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004772// CHECK10-NEXT: br label [[DOTOMP_OUTLINED__EXIT:%.*]]
4773// CHECK10: .cancel.continue.i:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004774// CHECK10-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004775// CHECK10-NEXT: br label [[DOTOMP_OUTLINED__EXIT]]
4776// CHECK10: .omp_outlined..exit:
Joseph Huber9ce02ea2021-06-24 14:39:12 -04004777// CHECK10-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004778// CHECK10-NEXT: ret i32 0
4779//
4780//
4781// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..1
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004782// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5:[0-9]+]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004783// CHECK10-NEXT: entry:
4784// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4785// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4786// CHECK10-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
4787// CHECK10-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
4788// CHECK10-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
4789// CHECK10-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
4790// CHECK10-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
4791// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4792// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4793// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4794// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4795// CHECK10-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
4796// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
4797// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB17:[0-9]+]])
4798// CHECK10-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004799// CHECK10-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4800// CHECK10-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 0
4801// CHECK10-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 0
4802// CHECK10-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
4803// CHECK10-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4804// CHECK10-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004805// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4806// CHECK10: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004807// CHECK10-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4808// CHECK10-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4809// CHECK10-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004810// CHECK10-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4811// CHECK10: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004812// CHECK10-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4813// CHECK10-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004814// CHECK10-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
4815// CHECK10-NEXT: ]
4816// CHECK10: .omp.sections.case:
4817// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004818// CHECK10-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
4819// CHECK10-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
4820// CHECK10-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004821// CHECK10: .omp.sections.case.split:
4822// CHECK10-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
4823// CHECK10: .omp.sections.case.cncl:
4824// CHECK10-NEXT: br label [[CANCEL_CONT:%.*]]
4825// CHECK10: .omp.sections.exit:
4826// CHECK10-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4827// CHECK10: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004828// CHECK10-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4829// CHECK10-NEXT: [[INC:%.*]] = add nsw i32 [[TMP9]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004830// CHECK10-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
4831// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND]]
4832// CHECK10: omp.inner.for.end:
4833// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19:[0-9]+]])
4834// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM3]])
4835// CHECK10-NEXT: br label [[CANCEL_CONT]]
4836// CHECK10: cancel.cont:
4837// CHECK10-NEXT: ret void
4838// CHECK10: cancel.exit:
4839// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB19]])
4840// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM2]])
4841// CHECK10-NEXT: br label [[CANCEL_CONT]]
4842//
4843//
4844// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..2
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004845// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004846// CHECK10-NEXT: entry:
4847// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4848// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
4849// CHECK10-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4
4850// CHECK10-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4
4851// CHECK10-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4
4852// CHECK10-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4
4853// CHECK10-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4
4854// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4855// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
4856// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4857// CHECK10-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4858// CHECK10-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4
4859// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4
4860// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB21:[0-9]+]])
4861// CHECK10-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004862// CHECK10-NEXT: [[TMP0:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4863// CHECK10-NEXT: [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 1
4864// CHECK10-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 1
4865// CHECK10-NEXT: store i32 [[TMP2]], i32* [[DOTOMP_SECTIONS_UB_]], align 4
4866// CHECK10-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4
4867// CHECK10-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004868// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4869// CHECK10: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004870// CHECK10-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4871// CHECK10-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4
4872// CHECK10-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004873// CHECK10-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4874// CHECK10: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004875// CHECK10-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4876// CHECK10-NEXT: switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004877// CHECK10-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]
4878// CHECK10-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE2:%.*]]
4879// CHECK10-NEXT: ]
4880// CHECK10: .omp.sections.case:
4881// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004882// CHECK10-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)
4883// CHECK10-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
4884// CHECK10-NEXT: br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004885// CHECK10: .omp.sections.case.split:
4886// CHECK10-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
4887// CHECK10: .omp.sections.case.cncl:
4888// CHECK10-NEXT: br label [[CANCEL_CONT:%.*]]
4889// CHECK10: .omp.sections.case2:
4890// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004891// CHECK10-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]], i32 3)
4892// CHECK10-NEXT: [[TMP10:%.*]] = icmp eq i32 [[TMP9]], 0
4893// CHECK10-NEXT: br i1 [[TMP10]], label [[DOTOMP_SECTIONS_CASE2_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE2_CNCL:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004894// CHECK10: .omp.sections.case2.split:
4895// CHECK10-NEXT: br label [[DOTOMP_SECTIONS_EXIT]]
4896// CHECK10: .omp.sections.case2.cncl:
4897// CHECK10-NEXT: br label [[OMP_INNER_FOR_END]]
4898// CHECK10: .omp.sections.exit:
4899// CHECK10-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4900// CHECK10: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004901// CHECK10-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4
4902// CHECK10-NEXT: [[INC:%.*]] = add nsw i32 [[TMP11]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004903// CHECK10-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4
4904// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND]]
4905// CHECK10: omp.inner.for.end:
4906// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM5:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23:[0-9]+]])
4907// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM5]])
4908// CHECK10-NEXT: br label [[CANCEL_CONT]]
4909// CHECK10: cancel.cont:
4910// CHECK10-NEXT: ret void
4911// CHECK10: cancel.exit:
4912// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB23]])
4913// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
4914// CHECK10-NEXT: br label [[CANCEL_CONT]]
4915//
4916//
4917// CHECK10-LABEL: define {{[^@]+}}@.omp_outlined..3
hyeongyu kimfd9b0992021-11-09 02:09:49 +09004918// CHECK10-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[ARGC:%.*]], i32* nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR5]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004919// CHECK10-NEXT: entry:
4920// CHECK10-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8
4921// CHECK10-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004922// CHECK10-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8
4923// CHECK10-NEXT: [[R_ADDR:%.*]] = alloca i32*, align 8
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004924// CHECK10-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4925// CHECK10-NEXT: [[TMP:%.*]] = alloca i32, align 4
4926// CHECK10-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
4927// CHECK10-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
4928// CHECK10-NEXT: [[I:%.*]] = alloca i32, align 4
4929// CHECK10-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4930// CHECK10-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4931// CHECK10-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4932// CHECK10-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004933// CHECK10-NEXT: [[R3:%.*]] = alloca i32, align 4
4934// CHECK10-NEXT: [[I4:%.*]] = alloca i32, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004935// CHECK10-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8
4936// CHECK10-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8
4937// CHECK10-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004938// CHECK10-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8
4939// CHECK10-NEXT: store i32* [[R]], i32** [[R_ADDR]], align 8
4940// CHECK10-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8
4941// CHECK10-NEXT: [[TMP1:%.*]] = load i32*, i32** [[R_ADDR]], align 8
4942// CHECK10-NEXT: [[TMP2:%.*]] = load i32, i32* [[TMP0]], align 4
4943// CHECK10-NEXT: store i32 [[TMP2]], i32* [[DOTCAPTURE_EXPR_]], align 4
4944// CHECK10-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4945// CHECK10-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004946// CHECK10-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
4947// CHECK10-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1
4948// CHECK10-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4
4949// CHECK10-NEXT: store i32 0, i32* [[I]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004950// CHECK10-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4
4951// CHECK10-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004952// CHECK10-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
4953// CHECK10: omp.precond.then:
4954// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004955// CHECK10-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4956// CHECK10-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004957// CHECK10-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
4958// CHECK10-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004959// CHECK10-NEXT: store i32 0, i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004960// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB25:[0-9]+]])
4961// CHECK10-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1)
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004962// CHECK10-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4963// CHECK10-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
4964// CHECK10-NEXT: [[CMP5:%.*]] = icmp sgt i32 [[TMP6]], [[TMP7]]
4965// CHECK10-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004966// CHECK10: cond.true:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004967// CHECK10-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004968// CHECK10-NEXT: br label [[COND_END:%.*]]
4969// CHECK10: cond.false:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004970// CHECK10-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004971// CHECK10-NEXT: br label [[COND_END]]
4972// CHECK10: cond.end:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004973// CHECK10-NEXT: [[COND:%.*]] = phi i32 [ [[TMP8]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004974// CHECK10-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004975// CHECK10-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
4976// CHECK10-NEXT: store i32 [[TMP10]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004977// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4978// CHECK10: omp.inner.for.cond:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004979// CHECK10-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4980// CHECK10-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
4981// CHECK10-NEXT: [[CMP6:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]
4982// CHECK10-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004983// CHECK10: omp.inner.for.body:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004984// CHECK10-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
4985// CHECK10-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP13]], 1
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004986// CHECK10-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004987// CHECK10-NEXT: store i32 [[ADD]], i32* [[I4]], align 4
4988// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB27:[0-9]+]])
4989// CHECK10-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM7]], i32 2)
4990// CHECK10-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0
4991// CHECK10-NEXT: br i1 [[TMP15]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004992// CHECK10: .cancel.exit:
4993// CHECK10-NEXT: br label [[CANCEL_EXIT:%.*]]
4994// CHECK10: .cancel.continue:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07004995// CHECK10-NEXT: [[TMP16:%.*]] = load i32, i32* [[I4]], align 4
4996// CHECK10-NEXT: [[TMP17:%.*]] = load i32, i32* [[R3]], align 4
4997// CHECK10-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP17]], [[TMP16]]
4998// CHECK10-NEXT: store i32 [[ADD8]], i32* [[R3]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07004999// CHECK10-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
5000// CHECK10: omp.body.continue:
5001// CHECK10-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
5002// CHECK10: omp.inner.for.inc:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005003// CHECK10-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4
5004// CHECK10-NEXT: [[ADD9:%.*]] = add nsw i32 [[TMP18]], 1
5005// CHECK10-NEXT: store i32 [[ADD9]], i32* [[DOTOMP_IV]], align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005006// CHECK10-NEXT: br label [[OMP_INNER_FOR_COND]]
5007// CHECK10: omp.inner.for.end:
5008// CHECK10-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
5009// CHECK10: omp.loop.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005010// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29:[0-9]+]])
5011// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM11]])
5012// CHECK10-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
5013// CHECK10-NEXT: [[TMP20:%.*]] = bitcast i32* [[R3]] to i8*
5014// CHECK10-NEXT: store i8* [[TMP20]], i8** [[TMP19]], align 8
5015// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
5016// CHECK10-NEXT: [[TMP21:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8*
5017// CHECK10-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB30:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]], i32 1, i64 8, i8* [[TMP21]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var)
5018// CHECK10-NEXT: switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005019// CHECK10-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
5020// CHECK10-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
5021// CHECK10-NEXT: ]
5022// CHECK10: .omp.reduction.case1:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005023// CHECK10-NEXT: [[TMP23:%.*]] = load i32, i32* [[TMP1]], align 4
5024// CHECK10-NEXT: [[TMP24:%.*]] = load i32, i32* [[R3]], align 4
5025// CHECK10-NEXT: [[ADD13:%.*]] = add nsw i32 [[TMP23]], [[TMP24]]
5026// CHECK10-NEXT: store i32 [[ADD13]], i32* [[TMP1]], align 4
5027// CHECK10-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB30]], i32 [[OMP_GLOBAL_THREAD_NUM12]], [8 x i32]* @.gomp_critical_user_.reduction.var)
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005028// CHECK10-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
5029// CHECK10: cancel.exit:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005030// CHECK10-NEXT: [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB29]])
5031// CHECK10-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM10]])
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005032// CHECK10-NEXT: br label [[CANCEL_CONT:%.*]]
5033// CHECK10: .omp.reduction.case2:
Giorgis Georgakoudisac90dfc2021-09-21 13:20:39 -07005034// CHECK10-NEXT: [[TMP25:%.*]] = load i32, i32* [[R3]], align 4
5035// CHECK10-NEXT: [[TMP26:%.*]] = atomicrmw add i32* [[TMP1]], i32 [[TMP25]] monotonic, align 4
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005036// CHECK10-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
5037// CHECK10: .omp.reduction.default:
5038// CHECK10-NEXT: br label [[OMP_PRECOND_END]]
5039// CHECK10: omp.precond.end:
5040// CHECK10-NEXT: br label [[CANCEL_CONT]]
5041// CHECK10: cancel.cont:
5042// CHECK10-NEXT: ret void
5043//
5044//
5045// CHECK10-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
hyeongyu kimfd9b0992021-11-09 02:09:49 +09005046// CHECK10-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR4]] {
Giorgis Georgakoudis207b08a2021-05-05 15:13:14 -07005047// CHECK10-NEXT: entry:
5048// CHECK10-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8
5049// CHECK10-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8
5050// CHECK10-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8
5051// CHECK10-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8
5052// CHECK10-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8
5053// CHECK10-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]*
5054// CHECK10-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8
5055// CHECK10-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]*
5056// CHECK10-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0
5057// CHECK10-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
5058// CHECK10-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32*
5059// CHECK10-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0
5060// CHECK10-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8
5061// CHECK10-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32*
5062// CHECK10-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4
5063// CHECK10-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4
5064// CHECK10-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]]
5065// CHECK10-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4
5066// CHECK10-NEXT: ret void
5067//