[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / OpenMP / generic_loop_codegen.cpp
blobd062695fee28106b6f18d98c589f73abc60ef39b
1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name tmp2 --version 2
2 // RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp %s
3 // RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=IR
5 // Check same results after serialization round-trip
6 // RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s
7 // RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=IR-PCH
9 // expected-no-diagnostics
11 #ifndef HEADER
12 #define HEADER
14 void foo(int t) {
16 int i, j, z;
17 #pragma omp loop collapse(2) reduction(+:z) lastprivate(j) bind(thread)
18 for (int i = 0; i<t; ++i)
19 for (j = 0; j<t; ++j)
20 z += i+j;
22 #endif
23 // IR-LABEL: define dso_local void @_Z3fooi
24 // IR-SAME: (i32 noundef [[T:%.*]]) #[[ATTR0:[0-9]+]] {
25 // IR-NEXT: entry:
26 // IR-NEXT: [[T_ADDR:%.*]] = alloca i32, align 4
27 // IR-NEXT: [[I:%.*]] = alloca i32, align 4
28 // IR-NEXT: [[J:%.*]] = alloca i32, align 4
29 // IR-NEXT: [[Z:%.*]] = alloca i32, align 4
30 // IR-NEXT: [[TMP:%.*]] = alloca i32, align 4
31 // IR-NEXT: [[TMP2TMP1:%.*]] = alloca i32, align 4
32 // IR-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
33 // IR-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
34 // IR-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca i64, align 8
35 // IR-NEXT: [[DOTOMP_LB:%.*]] = alloca i64, align 8
36 // IR-NEXT: [[DOTOMP_UB:%.*]] = alloca i64, align 8
37 // IR-NEXT: [[I8:%.*]] = alloca i32, align 4
38 // IR-NEXT: [[J9:%.*]] = alloca i32, align 4
39 // IR-NEXT: [[DOTOMP_IV:%.*]] = alloca i64, align 8
40 // IR-NEXT: [[I11:%.*]] = alloca i32, align 4
41 // IR-NEXT: [[J12:%.*]] = alloca i32, align 4
42 // IR-NEXT: [[Z13:%.*]] = alloca i32, align 4
43 // IR-NEXT: store i32 [[T]], ptr [[T_ADDR]], align 4
44 // IR-NEXT: [[TMP0:%.*]] = load i32, ptr [[T_ADDR]], align 4
45 // IR-NEXT: store i32 [[TMP0]], ptr [[DOTCAPTURE_EXPR_]], align 4
46 // IR-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_ADDR]], align 4
47 // IR-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_2]], align 4
48 // IR-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
49 // IR-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP2]], 0
50 // IR-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
51 // IR-NEXT: [[CONV:%.*]] = sext i32 [[DIV]] to i64
52 // IR-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4
53 // IR-NEXT: [[SUB4:%.*]] = sub nsw i32 [[TMP3]], 0
54 // IR-NEXT: [[DIV5:%.*]] = sdiv i32 [[SUB4]], 1
55 // IR-NEXT: [[CONV6:%.*]] = sext i32 [[DIV5]] to i64
56 // IR-NEXT: [[MUL:%.*]] = mul nsw i64 [[CONV]], [[CONV6]]
57 // IR-NEXT: [[SUB7:%.*]] = sub nsw i64 [[MUL]], 1
58 // IR-NEXT: store i64 [[SUB7]], ptr [[DOTCAPTURE_EXPR_3]], align 8
59 // IR-NEXT: store i64 0, ptr [[DOTOMP_LB]], align 8
60 // IR-NEXT: [[TMP4:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_3]], align 8
61 // IR-NEXT: store i64 [[TMP4]], ptr [[DOTOMP_UB]], align 8
62 // IR-NEXT: store i32 0, ptr [[I8]], align 4
63 // IR-NEXT: store i32 0, ptr [[J9]], align 4
64 // IR-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
65 // IR-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
66 // IR-NEXT: br i1 [[CMP]], label [[LAND_LHS_TRUE:%.*]], label [[SIMD_IF_END:%.*]]
67 // IR: land.lhs.true:
68 // IR-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4
69 // IR-NEXT: [[CMP10:%.*]] = icmp slt i32 0, [[TMP6]]
70 // IR-NEXT: br i1 [[CMP10]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END]]
71 // IR: simd.if.then:
72 // IR-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTOMP_LB]], align 8
73 // IR-NEXT: store i64 [[TMP7]], ptr [[DOTOMP_IV]], align 8
74 // IR-NEXT: store i32 0, ptr [[Z13]], align 4
75 // IR-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
76 // IR: omp.inner.for.cond:
77 // IR-NEXT: [[TMP8:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3:![0-9]+]]
78 // IR-NEXT: [[TMP9:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8, !llvm.access.group [[ACC_GRP3]]
79 // IR-NEXT: [[CMP14:%.*]] = icmp sle i64 [[TMP8]], [[TMP9]]
80 // IR-NEXT: br i1 [[CMP14]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
81 // IR: omp.inner.for.body:
82 // IR-NEXT: [[TMP10:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
83 // IR-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group [[ACC_GRP3]]
84 // IR-NEXT: [[SUB15:%.*]] = sub nsw i32 [[TMP11]], 0
85 // IR-NEXT: [[DIV16:%.*]] = sdiv i32 [[SUB15]], 1
86 // IR-NEXT: [[MUL17:%.*]] = mul nsw i32 1, [[DIV16]]
87 // IR-NEXT: [[CONV18:%.*]] = sext i32 [[MUL17]] to i64
88 // IR-NEXT: [[DIV19:%.*]] = sdiv i64 [[TMP10]], [[CONV18]]
89 // IR-NEXT: [[MUL20:%.*]] = mul nsw i64 [[DIV19]], 1
90 // IR-NEXT: [[ADD21:%.*]] = add nsw i64 0, [[MUL20]]
91 // IR-NEXT: [[CONV22:%.*]] = trunc i64 [[ADD21]] to i32
92 // IR-NEXT: store i32 [[CONV22]], ptr [[I11]], align 4, !llvm.access.group [[ACC_GRP3]]
93 // IR-NEXT: [[TMP12:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
94 // IR-NEXT: [[TMP13:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
95 // IR-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group [[ACC_GRP3]]
96 // IR-NEXT: [[SUB23:%.*]] = sub nsw i32 [[TMP14]], 0
97 // IR-NEXT: [[DIV24:%.*]] = sdiv i32 [[SUB23]], 1
98 // IR-NEXT: [[MUL25:%.*]] = mul nsw i32 1, [[DIV24]]
99 // IR-NEXT: [[CONV26:%.*]] = sext i32 [[MUL25]] to i64
100 // IR-NEXT: [[DIV27:%.*]] = sdiv i64 [[TMP13]], [[CONV26]]
101 // IR-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group [[ACC_GRP3]]
102 // IR-NEXT: [[SUB28:%.*]] = sub nsw i32 [[TMP15]], 0
103 // IR-NEXT: [[DIV29:%.*]] = sdiv i32 [[SUB28]], 1
104 // IR-NEXT: [[MUL30:%.*]] = mul nsw i32 1, [[DIV29]]
105 // IR-NEXT: [[CONV31:%.*]] = sext i32 [[MUL30]] to i64
106 // IR-NEXT: [[MUL32:%.*]] = mul nsw i64 [[DIV27]], [[CONV31]]
107 // IR-NEXT: [[SUB33:%.*]] = sub nsw i64 [[TMP12]], [[MUL32]]
108 // IR-NEXT: [[MUL34:%.*]] = mul nsw i64 [[SUB33]], 1
109 // IR-NEXT: [[ADD35:%.*]] = add nsw i64 0, [[MUL34]]
110 // IR-NEXT: [[CONV36:%.*]] = trunc i64 [[ADD35]] to i32
111 // IR-NEXT: store i32 [[CONV36]], ptr [[J12]], align 4, !llvm.access.group [[ACC_GRP3]]
112 // IR-NEXT: [[TMP16:%.*]] = load i32, ptr [[I11]], align 4, !llvm.access.group [[ACC_GRP3]]
113 // IR-NEXT: [[TMP17:%.*]] = load i32, ptr [[J12]], align 4, !llvm.access.group [[ACC_GRP3]]
114 // IR-NEXT: [[ADD37:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]
115 // IR-NEXT: [[TMP18:%.*]] = load i32, ptr [[Z13]], align 4, !llvm.access.group [[ACC_GRP3]]
116 // IR-NEXT: [[ADD38:%.*]] = add nsw i32 [[TMP18]], [[ADD37]]
117 // IR-NEXT: store i32 [[ADD38]], ptr [[Z13]], align 4, !llvm.access.group [[ACC_GRP3]]
118 // IR-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
119 // IR: omp.body.continue:
120 // IR-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
121 // IR: omp.inner.for.inc:
122 // IR-NEXT: [[TMP19:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
123 // IR-NEXT: [[ADD39:%.*]] = add nsw i64 [[TMP19]], 1
124 // IR-NEXT: store i64 [[ADD39]], ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
125 // IR-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]
126 // IR: omp.inner.for.end:
127 // IR-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
128 // IR-NEXT: [[SUB40:%.*]] = sub nsw i32 [[TMP20]], 0
129 // IR-NEXT: [[DIV41:%.*]] = sdiv i32 [[SUB40]], 1
130 // IR-NEXT: [[MUL42:%.*]] = mul nsw i32 [[DIV41]], 1
131 // IR-NEXT: [[ADD43:%.*]] = add nsw i32 0, [[MUL42]]
132 // IR-NEXT: store i32 [[ADD43]], ptr [[I11]], align 4
133 // IR-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4
134 // IR-NEXT: [[SUB44:%.*]] = sub nsw i32 [[TMP21]], 0
135 // IR-NEXT: [[DIV45:%.*]] = sdiv i32 [[SUB44]], 1
136 // IR-NEXT: [[MUL46:%.*]] = mul nsw i32 [[DIV45]], 1
137 // IR-NEXT: [[ADD47:%.*]] = add nsw i32 0, [[MUL46]]
138 // IR-NEXT: store i32 [[ADD47]], ptr [[J]], align 4
139 // IR-NEXT: [[TMP22:%.*]] = load i32, ptr [[Z]], align 4
140 // IR-NEXT: [[TMP23:%.*]] = load i32, ptr [[Z13]], align 4
141 // IR-NEXT: [[ADD48:%.*]] = add nsw i32 [[TMP22]], [[TMP23]]
142 // IR-NEXT: store i32 [[ADD48]], ptr [[Z]], align 4
143 // IR-NEXT: br label [[SIMD_IF_END]]
144 // IR: simd.if.end:
145 // IR-NEXT: ret void
148 // IR-PCH-LABEL: define dso_local void @_Z3fooi
149 // IR-PCH-SAME: (i32 noundef [[T:%.*]]) #[[ATTR0:[0-9]+]] {
150 // IR-PCH-NEXT: entry:
151 // IR-PCH-NEXT: [[T_ADDR:%.*]] = alloca i32, align 4
152 // IR-PCH-NEXT: [[I:%.*]] = alloca i32, align 4
153 // IR-PCH-NEXT: [[J:%.*]] = alloca i32, align 4
154 // IR-PCH-NEXT: [[Z:%.*]] = alloca i32, align 4
155 // IR-PCH-NEXT: [[TMP:%.*]] = alloca i32, align 4
156 // IR-PCH-NEXT: [[TMP2TMP1:%.*]] = alloca i32, align 4
157 // IR-PCH-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
158 // IR-PCH-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4
159 // IR-PCH-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca i64, align 8
160 // IR-PCH-NEXT: [[DOTOMP_LB:%.*]] = alloca i64, align 8
161 // IR-PCH-NEXT: [[DOTOMP_UB:%.*]] = alloca i64, align 8
162 // IR-PCH-NEXT: [[I8:%.*]] = alloca i32, align 4
163 // IR-PCH-NEXT: [[J9:%.*]] = alloca i32, align 4
164 // IR-PCH-NEXT: [[DOTOMP_IV:%.*]] = alloca i64, align 8
165 // IR-PCH-NEXT: [[I11:%.*]] = alloca i32, align 4
166 // IR-PCH-NEXT: [[J12:%.*]] = alloca i32, align 4
167 // IR-PCH-NEXT: [[Z13:%.*]] = alloca i32, align 4
168 // IR-PCH-NEXT: store i32 [[T]], ptr [[T_ADDR]], align 4
169 // IR-PCH-NEXT: [[TMP0:%.*]] = load i32, ptr [[T_ADDR]], align 4
170 // IR-PCH-NEXT: store i32 [[TMP0]], ptr [[DOTCAPTURE_EXPR_]], align 4
171 // IR-PCH-NEXT: [[TMP1:%.*]] = load i32, ptr [[T_ADDR]], align 4
172 // IR-PCH-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_2]], align 4
173 // IR-PCH-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
174 // IR-PCH-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP2]], 0
175 // IR-PCH-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1
176 // IR-PCH-NEXT: [[CONV:%.*]] = sext i32 [[DIV]] to i64
177 // IR-PCH-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4
178 // IR-PCH-NEXT: [[SUB4:%.*]] = sub nsw i32 [[TMP3]], 0
179 // IR-PCH-NEXT: [[DIV5:%.*]] = sdiv i32 [[SUB4]], 1
180 // IR-PCH-NEXT: [[CONV6:%.*]] = sext i32 [[DIV5]] to i64
181 // IR-PCH-NEXT: [[MUL:%.*]] = mul nsw i64 [[CONV]], [[CONV6]]
182 // IR-PCH-NEXT: [[SUB7:%.*]] = sub nsw i64 [[MUL]], 1
183 // IR-PCH-NEXT: store i64 [[SUB7]], ptr [[DOTCAPTURE_EXPR_3]], align 8
184 // IR-PCH-NEXT: store i64 0, ptr [[DOTOMP_LB]], align 8
185 // IR-PCH-NEXT: [[TMP4:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_3]], align 8
186 // IR-PCH-NEXT: store i64 [[TMP4]], ptr [[DOTOMP_UB]], align 8
187 // IR-PCH-NEXT: store i32 0, ptr [[I8]], align 4
188 // IR-PCH-NEXT: store i32 0, ptr [[J9]], align 4
189 // IR-PCH-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
190 // IR-PCH-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]
191 // IR-PCH-NEXT: br i1 [[CMP]], label [[LAND_LHS_TRUE:%.*]], label [[SIMD_IF_END:%.*]]
192 // IR-PCH: land.lhs.true:
193 // IR-PCH-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4
194 // IR-PCH-NEXT: [[CMP10:%.*]] = icmp slt i32 0, [[TMP6]]
195 // IR-PCH-NEXT: br i1 [[CMP10]], label [[SIMD_IF_THEN:%.*]], label [[SIMD_IF_END]]
196 // IR-PCH: simd.if.then:
197 // IR-PCH-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTOMP_LB]], align 8
198 // IR-PCH-NEXT: store i64 [[TMP7]], ptr [[DOTOMP_IV]], align 8
199 // IR-PCH-NEXT: store i32 0, ptr [[Z13]], align 4
200 // IR-PCH-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
201 // IR-PCH: omp.inner.for.cond:
202 // IR-PCH-NEXT: [[TMP8:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3:![0-9]+]]
203 // IR-PCH-NEXT: [[TMP9:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8, !llvm.access.group [[ACC_GRP3]]
204 // IR-PCH-NEXT: [[CMP14:%.*]] = icmp sle i64 [[TMP8]], [[TMP9]]
205 // IR-PCH-NEXT: br i1 [[CMP14]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
206 // IR-PCH: omp.inner.for.body:
207 // IR-PCH-NEXT: [[TMP10:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
208 // IR-PCH-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group [[ACC_GRP3]]
209 // IR-PCH-NEXT: [[SUB15:%.*]] = sub nsw i32 [[TMP11]], 0
210 // IR-PCH-NEXT: [[DIV16:%.*]] = sdiv i32 [[SUB15]], 1
211 // IR-PCH-NEXT: [[MUL17:%.*]] = mul nsw i32 1, [[DIV16]]
212 // IR-PCH-NEXT: [[CONV18:%.*]] = sext i32 [[MUL17]] to i64
213 // IR-PCH-NEXT: [[DIV19:%.*]] = sdiv i64 [[TMP10]], [[CONV18]]
214 // IR-PCH-NEXT: [[MUL20:%.*]] = mul nsw i64 [[DIV19]], 1
215 // IR-PCH-NEXT: [[ADD21:%.*]] = add nsw i64 0, [[MUL20]]
216 // IR-PCH-NEXT: [[CONV22:%.*]] = trunc i64 [[ADD21]] to i32
217 // IR-PCH-NEXT: store i32 [[CONV22]], ptr [[I11]], align 4, !llvm.access.group [[ACC_GRP3]]
218 // IR-PCH-NEXT: [[TMP12:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
219 // IR-PCH-NEXT: [[TMP13:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
220 // IR-PCH-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group [[ACC_GRP3]]
221 // IR-PCH-NEXT: [[SUB23:%.*]] = sub nsw i32 [[TMP14]], 0
222 // IR-PCH-NEXT: [[DIV24:%.*]] = sdiv i32 [[SUB23]], 1
223 // IR-PCH-NEXT: [[MUL25:%.*]] = mul nsw i32 1, [[DIV24]]
224 // IR-PCH-NEXT: [[CONV26:%.*]] = sext i32 [[MUL25]] to i64
225 // IR-PCH-NEXT: [[DIV27:%.*]] = sdiv i64 [[TMP13]], [[CONV26]]
226 // IR-PCH-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4, !llvm.access.group [[ACC_GRP3]]
227 // IR-PCH-NEXT: [[SUB28:%.*]] = sub nsw i32 [[TMP15]], 0
228 // IR-PCH-NEXT: [[DIV29:%.*]] = sdiv i32 [[SUB28]], 1
229 // IR-PCH-NEXT: [[MUL30:%.*]] = mul nsw i32 1, [[DIV29]]
230 // IR-PCH-NEXT: [[CONV31:%.*]] = sext i32 [[MUL30]] to i64
231 // IR-PCH-NEXT: [[MUL32:%.*]] = mul nsw i64 [[DIV27]], [[CONV31]]
232 // IR-PCH-NEXT: [[SUB33:%.*]] = sub nsw i64 [[TMP12]], [[MUL32]]
233 // IR-PCH-NEXT: [[MUL34:%.*]] = mul nsw i64 [[SUB33]], 1
234 // IR-PCH-NEXT: [[ADD35:%.*]] = add nsw i64 0, [[MUL34]]
235 // IR-PCH-NEXT: [[CONV36:%.*]] = trunc i64 [[ADD35]] to i32
236 // IR-PCH-NEXT: store i32 [[CONV36]], ptr [[J12]], align 4, !llvm.access.group [[ACC_GRP3]]
237 // IR-PCH-NEXT: [[TMP16:%.*]] = load i32, ptr [[I11]], align 4, !llvm.access.group [[ACC_GRP3]]
238 // IR-PCH-NEXT: [[TMP17:%.*]] = load i32, ptr [[J12]], align 4, !llvm.access.group [[ACC_GRP3]]
239 // IR-PCH-NEXT: [[ADD37:%.*]] = add nsw i32 [[TMP16]], [[TMP17]]
240 // IR-PCH-NEXT: [[TMP18:%.*]] = load i32, ptr [[Z13]], align 4, !llvm.access.group [[ACC_GRP3]]
241 // IR-PCH-NEXT: [[ADD38:%.*]] = add nsw i32 [[TMP18]], [[ADD37]]
242 // IR-PCH-NEXT: store i32 [[ADD38]], ptr [[Z13]], align 4, !llvm.access.group [[ACC_GRP3]]
243 // IR-PCH-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
244 // IR-PCH: omp.body.continue:
245 // IR-PCH-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
246 // IR-PCH: omp.inner.for.inc:
247 // IR-PCH-NEXT: [[TMP19:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
248 // IR-PCH-NEXT: [[ADD39:%.*]] = add nsw i64 [[TMP19]], 1
249 // IR-PCH-NEXT: store i64 [[ADD39]], ptr [[DOTOMP_IV]], align 8, !llvm.access.group [[ACC_GRP3]]
250 // IR-PCH-NEXT: br label [[OMP_INNER_FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]
251 // IR-PCH: omp.inner.for.end:
252 // IR-PCH-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
253 // IR-PCH-NEXT: [[SUB40:%.*]] = sub nsw i32 [[TMP20]], 0
254 // IR-PCH-NEXT: [[DIV41:%.*]] = sdiv i32 [[SUB40]], 1
255 // IR-PCH-NEXT: [[MUL42:%.*]] = mul nsw i32 [[DIV41]], 1
256 // IR-PCH-NEXT: [[ADD43:%.*]] = add nsw i32 0, [[MUL42]]
257 // IR-PCH-NEXT: store i32 [[ADD43]], ptr [[I11]], align 4
258 // IR-PCH-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4
259 // IR-PCH-NEXT: [[SUB44:%.*]] = sub nsw i32 [[TMP21]], 0
260 // IR-PCH-NEXT: [[DIV45:%.*]] = sdiv i32 [[SUB44]], 1
261 // IR-PCH-NEXT: [[MUL46:%.*]] = mul nsw i32 [[DIV45]], 1
262 // IR-PCH-NEXT: [[ADD47:%.*]] = add nsw i32 0, [[MUL46]]
263 // IR-PCH-NEXT: store i32 [[ADD47]], ptr [[J]], align 4
264 // IR-PCH-NEXT: [[TMP22:%.*]] = load i32, ptr [[Z]], align 4
265 // IR-PCH-NEXT: [[TMP23:%.*]] = load i32, ptr [[Z13]], align 4
266 // IR-PCH-NEXT: [[ADD48:%.*]] = add nsw i32 [[TMP22]], [[TMP23]]
267 // IR-PCH-NEXT: store i32 [[ADD48]], ptr [[Z]], align 4
268 // IR-PCH-NEXT: br label [[SIMD_IF_END]]
269 // IR-PCH: simd.if.end:
270 // IR-PCH-NEXT: ret void