1 // 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 _
3 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s
4 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
5 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
6 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s
7 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
8 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
10 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
11 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
12 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
13 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
14 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
15 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
17 // Test target parallel for codegen - host bc file has to be created first.
18 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
19 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s -check-prefix=TCHECK
20 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
21 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TCHECK
22 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
23 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s -check-prefix=TCHECK
24 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
25 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TCHECK
27 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
28 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
29 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
30 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
31 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
32 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
33 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
34 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
36 // Check that no target code is emitted if no omptests flag was provided.
37 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=CHECK-NTARGET
39 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY2 %s
41 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix OMP-DEFAULT
42 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
43 // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix OMP-DEFAULT
44 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix OMP-DEfAULT
45 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
46 // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix OMP-DEFAULT
48 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
49 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
50 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
51 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
52 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
53 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
55 // Test target parallel for codegen - host bc file has to be created first.
56 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
57 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s -check-prefix=TCHECK
58 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
59 // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TCHECK
61 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
62 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s -check-prefix=TCHECK
63 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
64 // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s -check-prefix=TCHECK
66 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
67 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
68 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
69 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
70 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
71 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
72 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
73 // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
75 // Check that no target code is emitted if no omptests flag was provided.
76 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s -check-prefix=CHECK-NTARGET-OMP-DEFAULT
78 // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY2 %s
80 // expected-no-diagnostics
88 // We have 7 target regions
94 // We have 4 initializers, one for the 500 priority, another one for 501, or more for the default priority, and the last one for the offloading registration function.
122 #pragma omp target parallel loop
123 for (int i
= 0; i
< 10; ++i
)
148 #pragma omp target parallel loop
149 for (int i
= 0; i
< 10; ++i
)
174 #pragma omp target parallel loop
175 for (int i
= 0; i
< 10; ++i
)
185 #pragma omp target parallel loop if(target: 0)
186 for (int i
= 0; i
< 10; ++i
)
192 #pragma omp target parallel loop
193 for (int i
= 0; i
< 10; ++i
)
199 #pragma omp target parallel loop
200 for (int i
= 0; i
< 10; ++i
)
211 #pragma omp target parallel loop
212 for (int i
= 0; i
< 10; ++i
)
218 #pragma omp target parallel loop
219 for (int i
= 0; i
< 10; ++i
)
225 #pragma omp target parallel loop
226 for (int i
= 0; i
< 10; ++i
)
232 // We have to make sure we us all the target regions:
237 // We have 2 initializers with priority 500
239 // We have 1 initializers with priority 501
241 // We have 6 initializers with default priority
243 static __attribute__((init_priority(500))) SA a1
;
245 SB
__attribute__((init_priority(500))) b1
;
246 SB
__attribute__((init_priority(501))) b2
;
267 #pragma omp target parallel loop
268 for (int i
= 0; i
< 10; ++i
)
274 // Check metadata is properly generated:
278 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init
279 // CHECK-SAME: () #[[ATTR3:[0-9]+]] {
280 // CHECK-NEXT: entry:
281 // CHECK-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
282 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2:[0-9]+]]
283 // CHECK-NEXT: ret void
290 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
291 // CHECK-SAME: () #[[ATTR3]] {
292 // CHECK-NEXT: entry:
293 // CHECK-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
294 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
295 // CHECK-NEXT: ret void
298 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
299 // CHECK-SAME: () #[[ATTR3]] {
300 // CHECK-NEXT: entry:
301 // CHECK-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
302 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
303 // CHECK-NEXT: ret void
310 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
311 // CHECK-SAME: () #[[ATTR3]] {
312 // CHECK-NEXT: entry:
313 // CHECK-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
314 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
315 // CHECK-NEXT: ret void
318 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
319 // CHECK-SAME: () #[[ATTR3]] {
320 // CHECK-NEXT: entry:
321 // CHECK-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
322 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
323 // CHECK-NEXT: ret void
332 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.7
333 // CHECK-SAME: () #[[ATTR3]] {
334 // CHECK-NEXT: entry:
335 // CHECK-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
336 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
337 // CHECK-NEXT: ret void
346 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.10
347 // CHECK-SAME: () #[[ATTR3]] {
348 // CHECK-NEXT: entry:
349 // CHECK-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
350 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
351 // CHECK-NEXT: ret void
362 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.15
363 // CHECK-SAME: () #[[ATTR3]] {
364 // CHECK-NEXT: entry:
365 // CHECK-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
366 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
367 // CHECK-NEXT: ret void
378 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init.20
379 // CHECK-SAME: () #[[ATTR3]] {
380 // CHECK-NEXT: entry:
381 // CHECK-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
382 // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
383 // CHECK-NEXT: ret void
402 // CHECK-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
403 // CHECK-SAME: () #[[ATTR3]] {
404 // CHECK-NEXT: entry:
405 // CHECK-NEXT: call void @__cxx_global_var_init()
406 // CHECK-NEXT: call void @__cxx_global_var_init.2()
407 // CHECK-NEXT: ret void
410 // CHECK-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
411 // CHECK-SAME: () #[[ATTR3]] {
412 // CHECK-NEXT: entry:
413 // CHECK-NEXT: call void @__cxx_global_var_init.3()
414 // CHECK-NEXT: ret void
417 // CHECK-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
418 // CHECK-SAME: () #[[ATTR3]] {
419 // CHECK-NEXT: entry:
420 // CHECK-NEXT: call void @__cxx_global_var_init.1()
421 // CHECK-NEXT: call void @__cxx_global_var_init.4()
422 // CHECK-NEXT: call void @__cxx_global_var_init.7()
423 // CHECK-NEXT: call void @__cxx_global_var_init.10()
424 // CHECK-NEXT: call void @__cxx_global_var_init.15()
425 // CHECK-NEXT: call void @__cxx_global_var_init.20()
426 // CHECK-NEXT: ret void
615 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init
616 // SIMD-ONLY0-SAME: () #[[ATTR0:[0-9]+]] {
617 // SIMD-ONLY0-NEXT: entry:
618 // SIMD-ONLY0-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
619 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2:[0-9]+]]
620 // SIMD-ONLY0-NEXT: ret void
625 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
626 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
627 // SIMD-ONLY0-NEXT: entry:
628 // SIMD-ONLY0-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
629 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
630 // SIMD-ONLY0-NEXT: ret void
633 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
634 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
635 // SIMD-ONLY0-NEXT: entry:
636 // SIMD-ONLY0-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
637 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
638 // SIMD-ONLY0-NEXT: ret void
643 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
644 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
645 // SIMD-ONLY0-NEXT: entry:
646 // SIMD-ONLY0-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
647 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
648 // SIMD-ONLY0-NEXT: ret void
651 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
652 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
653 // SIMD-ONLY0-NEXT: entry:
654 // SIMD-ONLY0-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
655 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
656 // SIMD-ONLY0-NEXT: ret void
661 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.5
662 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
663 // SIMD-ONLY0-NEXT: entry:
664 // SIMD-ONLY0-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
665 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
666 // SIMD-ONLY0-NEXT: ret void
671 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.6
672 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
673 // SIMD-ONLY0-NEXT: entry:
674 // SIMD-ONLY0-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
675 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
676 // SIMD-ONLY0-NEXT: ret void
681 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.7
682 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
683 // SIMD-ONLY0-NEXT: entry:
684 // SIMD-ONLY0-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
685 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
686 // SIMD-ONLY0-NEXT: ret void
691 // SIMD-ONLY0-LABEL: define {{[^@]+}}@__cxx_global_var_init.8
692 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
693 // SIMD-ONLY0-NEXT: entry:
694 // SIMD-ONLY0-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
695 // SIMD-ONLY0-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
696 // SIMD-ONLY0-NEXT: ret void
723 // SIMD-ONLY0-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
724 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
725 // SIMD-ONLY0-NEXT: entry:
726 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init()
727 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.2()
728 // SIMD-ONLY0-NEXT: ret void
731 // SIMD-ONLY0-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
732 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
733 // SIMD-ONLY0-NEXT: entry:
734 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.3()
735 // SIMD-ONLY0-NEXT: ret void
738 // SIMD-ONLY0-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
739 // SIMD-ONLY0-SAME: () #[[ATTR0]] {
740 // SIMD-ONLY0-NEXT: entry:
741 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.1()
742 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.4()
743 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.5()
744 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.6()
745 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.7()
746 // SIMD-ONLY0-NEXT: call void @__cxx_global_var_init.8()
747 // SIMD-ONLY0-NEXT: ret void
954 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init
955 // SIMD-ONLY1-SAME: () #[[ATTR0:[0-9]+]] {
956 // SIMD-ONLY1-NEXT: entry:
957 // SIMD-ONLY1-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
958 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2:[0-9]+]]
959 // SIMD-ONLY1-NEXT: ret void
964 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
965 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
966 // SIMD-ONLY1-NEXT: entry:
967 // SIMD-ONLY1-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
968 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
969 // SIMD-ONLY1-NEXT: ret void
972 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
973 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
974 // SIMD-ONLY1-NEXT: entry:
975 // SIMD-ONLY1-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
976 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
977 // SIMD-ONLY1-NEXT: ret void
982 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
983 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
984 // SIMD-ONLY1-NEXT: entry:
985 // SIMD-ONLY1-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
986 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
987 // SIMD-ONLY1-NEXT: ret void
990 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
991 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
992 // SIMD-ONLY1-NEXT: entry:
993 // SIMD-ONLY1-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
994 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
995 // SIMD-ONLY1-NEXT: ret void
1000 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.5
1001 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
1002 // SIMD-ONLY1-NEXT: entry:
1003 // SIMD-ONLY1-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
1004 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
1005 // SIMD-ONLY1-NEXT: ret void
1010 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.6
1011 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
1012 // SIMD-ONLY1-NEXT: entry:
1013 // SIMD-ONLY1-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
1014 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
1015 // SIMD-ONLY1-NEXT: ret void
1020 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.7
1021 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
1022 // SIMD-ONLY1-NEXT: entry:
1023 // SIMD-ONLY1-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
1024 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
1025 // SIMD-ONLY1-NEXT: ret void
1030 // SIMD-ONLY1-LABEL: define {{[^@]+}}@__cxx_global_var_init.8
1031 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
1032 // SIMD-ONLY1-NEXT: entry:
1033 // SIMD-ONLY1-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
1034 // SIMD-ONLY1-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
1035 // SIMD-ONLY1-NEXT: ret void
1062 // SIMD-ONLY1-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
1063 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
1064 // SIMD-ONLY1-NEXT: entry:
1065 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init()
1066 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.2()
1067 // SIMD-ONLY1-NEXT: ret void
1070 // SIMD-ONLY1-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
1071 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
1072 // SIMD-ONLY1-NEXT: entry:
1073 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.3()
1074 // SIMD-ONLY1-NEXT: ret void
1077 // SIMD-ONLY1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
1078 // SIMD-ONLY1-SAME: () #[[ATTR0]] {
1079 // SIMD-ONLY1-NEXT: entry:
1080 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.1()
1081 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.4()
1082 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.5()
1083 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.6()
1084 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.7()
1085 // SIMD-ONLY1-NEXT: call void @__cxx_global_var_init.8()
1086 // SIMD-ONLY1-NEXT: ret void
1197 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_Z3bari
1198 // CHECK-NTARGET-SAME: (i32 noundef signext [[A:%.*]]) #[[ATTR0:[0-9]+]] {
1199 // CHECK-NTARGET-NEXT: entry:
1200 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
1201 // CHECK-NTARGET-NEXT: [[R:%.*]] = alloca i32, align 4
1202 // CHECK-NTARGET-NEXT: [[R_CASTED:%.*]] = alloca i64, align 8
1203 // CHECK-NTARGET-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
1204 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
1205 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[R]], align 4
1206 // CHECK-NTARGET-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
1207 // CHECK-NTARGET-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @a2)
1208 // CHECK-NTARGET-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b1)
1209 // CHECK-NTARGET-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b2)
1210 // CHECK-NTARGET-NEXT: call void @_ZN2SC3fooEv(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
1211 // CHECK-NTARGET-NEXT: call void @_ZN2SD3fooEv(ptr noundef nonnull align 4 dereferenceable(128) @d1)
1212 // CHECK-NTARGET-NEXT: call void @_ZN2SE3fooEv(ptr noundef nonnull align 4 dereferenceable(256) @e1)
1213 // CHECK-NTARGET-NEXT: call void @_ZN2STILi100EE3fooEv(ptr noundef nonnull align 4 dereferenceable(912) @t1)
1214 // CHECK-NTARGET-NEXT: call void @_ZN2STILi1000EE3fooEv(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
1215 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[R]], align 4
1216 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[R_CASTED]], align 4
1217 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i64, ptr [[R_CASTED]], align 8
1218 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267(i64 [[TMP2]]) #[[ATTR2:[0-9]+]]
1219 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[R]], align 4
1220 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1221 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4
1222 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], [[TMP5]]
1223 // CHECK-NTARGET-NEXT: ret i32 [[ADD]]
1226 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SA3fooEv
1227 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) #[[ATTR0]] comdat {
1228 // CHECK-NTARGET-NEXT: entry:
1229 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1230 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1231 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1232 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1233 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1234 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1235 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1236 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1237 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
1238 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1239 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1240 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1241 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1242 // CHECK-NTARGET-NEXT: ret void
1245 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SB3fooEv
1246 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) #[[ATTR0]] comdat {
1247 // CHECK-NTARGET-NEXT: entry:
1248 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1249 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1250 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1251 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1252 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1253 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1254 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1255 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1256 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1257 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
1258 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
1259 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122(i64 [[TMP3]]) #[[ATTR2]]
1260 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
1261 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
1262 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
1263 // CHECK-NTARGET-NEXT: ret void
1266 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SC3fooEv
1267 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) #[[ATTR0]] comdat {
1268 // CHECK-NTARGET-NEXT: entry:
1269 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1270 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1271 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1272 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1273 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1274 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1275 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1276 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1277 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 7
1278 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1279 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1280 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1281 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1282 // CHECK-NTARGET-NEXT: ret void
1285 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SD3fooEv
1286 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) #[[ATTR0]] comdat {
1287 // CHECK-NTARGET-NEXT: entry:
1288 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1289 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1290 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1291 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1292 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1293 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1294 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1295 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1296 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 10
1297 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1298 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1299 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1300 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1301 // CHECK-NTARGET-NEXT: ret void
1304 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SE3fooEv
1305 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) #[[ATTR0]] comdat {
1306 // CHECK-NTARGET-NEXT: entry:
1307 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1308 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1309 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1310 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1311 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1312 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1313 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1314 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1315 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1316 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
1317 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
1318 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185(i64 [[TMP3]]) #[[ATTR2]]
1319 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
1320 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
1321 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
1322 // CHECK-NTARGET-NEXT: ret void
1325 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi100EE3fooEv
1326 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) #[[ATTR0]] comdat {
1327 // CHECK-NTARGET-NEXT: entry:
1328 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1329 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1330 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1331 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1332 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1333 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1334 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1335 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1336 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1337 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
1338 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
1339 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211(i64 [[TMP3]]) #[[ATTR2]]
1340 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
1341 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
1342 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
1343 // CHECK-NTARGET-NEXT: ret void
1346 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi1000EE3fooEv
1347 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) #[[ATTR0]] comdat {
1348 // CHECK-NTARGET-NEXT: entry:
1349 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1350 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1351 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1352 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1353 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1354 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1355 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1356 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1357 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1358 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
1359 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
1360 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211(i64 [[TMP3]]) #[[ATTR2]]
1361 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
1362 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
1363 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
1364 // CHECK-NTARGET-NEXT: ret void
1367 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267
1368 // CHECK-NTARGET-SAME: (i64 noundef [[R:%.*]]) #[[ATTR1:[0-9]+]] {
1369 // CHECK-NTARGET-NEXT: entry:
1370 // CHECK-NTARGET-NEXT: [[R_ADDR:%.*]] = alloca i64, align 8
1371 // CHECK-NTARGET-NEXT: [[R_CASTED:%.*]] = alloca i64, align 8
1372 // CHECK-NTARGET-NEXT: store i64 [[R]], ptr [[R_ADDR]], align 8
1373 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[R_ADDR]], align 4
1374 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[R_CASTED]], align 4
1375 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[R_CASTED]], align 8
1376 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2:[0-9]+]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267.omp_outlined, i64 [[TMP1]])
1377 // CHECK-NTARGET-NEXT: ret void
1380 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267.omp_outlined
1381 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[R:%.*]]) #[[ATTR1]] {
1382 // CHECK-NTARGET-NEXT: entry:
1383 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1384 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1385 // CHECK-NTARGET-NEXT: [[R_ADDR:%.*]] = alloca i64, align 8
1386 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1387 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
1388 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1389 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1390 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1391 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1392 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
1393 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1394 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1395 // CHECK-NTARGET-NEXT: store i64 [[R]], ptr [[R_ADDR]], align 8
1396 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
1397 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
1398 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
1399 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
1400 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1401 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1402 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
1403 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1404 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
1405 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1406 // CHECK-NTARGET: cond.true:
1407 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
1408 // CHECK-NTARGET: cond.false:
1409 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1410 // CHECK-NTARGET-NEXT: br label [[COND_END]]
1411 // CHECK-NTARGET: cond.end:
1412 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
1413 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
1414 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
1415 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
1416 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1417 // CHECK-NTARGET: omp.inner.for.cond:
1418 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1419 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1420 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
1421 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1422 // CHECK-NTARGET: omp.inner.for.body:
1423 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1424 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
1425 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1426 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
1427 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[R_ADDR]], align 4
1428 // CHECK-NTARGET-NEXT: [[INC:%.*]] = add nsw i32 [[TMP8]], 1
1429 // CHECK-NTARGET-NEXT: store i32 [[INC]], ptr [[R_ADDR]], align 4
1430 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
1431 // CHECK-NTARGET: omp.body.continue:
1432 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1433 // CHECK-NTARGET: omp.inner.for.inc:
1434 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1435 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], 1
1436 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4
1437 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
1438 // CHECK-NTARGET: omp.inner.for.end:
1439 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
1440 // CHECK-NTARGET: omp.loop.exit:
1441 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
1442 // CHECK-NTARGET-NEXT: ret void
1445 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init
1446 // CHECK-NTARGET-SAME: () #[[ATTR3:[0-9]+]] {
1447 // CHECK-NTARGET-NEXT: entry:
1448 // CHECK-NTARGET-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
1449 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2]]
1450 // CHECK-NTARGET-NEXT: ret void
1453 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SAC1Ev
1454 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1455 // CHECK-NTARGET-NEXT: entry:
1456 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1457 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1458 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1459 // CHECK-NTARGET-NEXT: call void @_ZN2SAC2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]])
1460 // CHECK-NTARGET-NEXT: ret void
1463 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SAD1Ev
1464 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1465 // CHECK-NTARGET-NEXT: entry:
1466 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1467 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1468 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1469 // CHECK-NTARGET-NEXT: call void @_ZN2SAD2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]]) #[[ATTR2]]
1470 // CHECK-NTARGET-NEXT: ret void
1473 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SAC2Ev
1474 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1475 // CHECK-NTARGET-NEXT: entry:
1476 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1477 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1478 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1479 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1480 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1481 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1482 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1483 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1484 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 2
1485 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1486 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1487 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1488 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1489 // CHECK-NTARGET-NEXT: ret void
1492 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SAD2Ev
1493 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1494 // CHECK-NTARGET-NEXT: entry:
1495 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1496 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1497 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1498 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1499 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1500 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1501 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1502 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1503 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 3
1504 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1505 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1506 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1507 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1508 // CHECK-NTARGET-NEXT: ret void
1511 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
1512 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
1513 // CHECK-NTARGET-NEXT: entry:
1514 // CHECK-NTARGET-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
1515 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
1516 // CHECK-NTARGET-NEXT: ret void
1519 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
1520 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
1521 // CHECK-NTARGET-NEXT: entry:
1522 // CHECK-NTARGET-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
1523 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
1524 // CHECK-NTARGET-NEXT: ret void
1527 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SBC1Ev
1528 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1529 // CHECK-NTARGET-NEXT: entry:
1530 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1531 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1532 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1533 // CHECK-NTARGET-NEXT: call void @_ZN2SBC2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]])
1534 // CHECK-NTARGET-NEXT: ret void
1537 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SBD1Ev
1538 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1539 // CHECK-NTARGET-NEXT: entry:
1540 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1541 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1542 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1543 // CHECK-NTARGET-NEXT: call void @_ZN2SBD2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]]) #[[ATTR2]]
1544 // CHECK-NTARGET-NEXT: ret void
1547 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SBC2Ev
1548 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1549 // CHECK-NTARGET-NEXT: entry:
1550 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1551 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1552 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1553 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1554 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1555 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1556 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1557 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1558 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 5
1559 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1560 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1561 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1562 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1563 // CHECK-NTARGET-NEXT: ret void
1566 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SBD2Ev
1567 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1568 // CHECK-NTARGET-NEXT: entry:
1569 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1570 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1571 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1572 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1573 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1574 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1575 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1576 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1577 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 6
1578 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1579 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1580 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1581 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1582 // CHECK-NTARGET-NEXT: ret void
1585 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
1586 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
1587 // CHECK-NTARGET-NEXT: entry:
1588 // CHECK-NTARGET-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
1589 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
1590 // CHECK-NTARGET-NEXT: ret void
1593 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
1594 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
1595 // CHECK-NTARGET-NEXT: entry:
1596 // CHECK-NTARGET-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
1597 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
1598 // CHECK-NTARGET-NEXT: ret void
1601 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SCC1Ev
1602 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1603 // CHECK-NTARGET-NEXT: entry:
1604 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1605 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1606 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1607 // CHECK-NTARGET-NEXT: call void @_ZN2SCC2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]])
1608 // CHECK-NTARGET-NEXT: ret void
1611 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SCD1Ev
1612 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1613 // CHECK-NTARGET-NEXT: entry:
1614 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1615 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1616 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1617 // CHECK-NTARGET-NEXT: call void @_ZN2SCD2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]]) #[[ATTR2]]
1618 // CHECK-NTARGET-NEXT: ret void
1621 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SCC2Ev
1622 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1623 // CHECK-NTARGET-NEXT: entry:
1624 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1625 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1626 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1627 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1628 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1629 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1630 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1631 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1632 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1633 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
1634 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
1635 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148(i64 [[TMP3]]) #[[ATTR2]]
1636 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
1637 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
1638 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
1639 // CHECK-NTARGET-NEXT: ret void
1642 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148
1643 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
1644 // CHECK-NTARGET-NEXT: entry:
1645 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1646 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1647 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
1648 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
1649 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
1650 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
1651 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148.omp_outlined, i64 [[TMP1]])
1652 // CHECK-NTARGET-NEXT: ret void
1655 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148.omp_outlined
1656 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
1657 // CHECK-NTARGET-NEXT: entry:
1658 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1659 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1660 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1661 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1662 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
1663 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1664 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1665 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1666 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1667 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
1668 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1669 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1670 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
1671 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
1672 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
1673 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
1674 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
1675 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1676 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1677 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
1678 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1679 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
1680 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1681 // CHECK-NTARGET: cond.true:
1682 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
1683 // CHECK-NTARGET: cond.false:
1684 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1685 // CHECK-NTARGET-NEXT: br label [[COND_END]]
1686 // CHECK-NTARGET: cond.end:
1687 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
1688 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
1689 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
1690 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
1691 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1692 // CHECK-NTARGET: omp.inner.for.cond:
1693 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1694 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1695 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
1696 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1697 // CHECK-NTARGET: omp.inner.for.body:
1698 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1699 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
1700 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1701 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
1702 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
1703 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 8
1704 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
1705 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
1706 // CHECK-NTARGET: omp.body.continue:
1707 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1708 // CHECK-NTARGET: omp.inner.for.inc:
1709 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1710 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
1711 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
1712 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
1713 // CHECK-NTARGET: omp.inner.for.end:
1714 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
1715 // CHECK-NTARGET: omp.loop.exit:
1716 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
1717 // CHECK-NTARGET-NEXT: ret void
1720 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SCD2Ev
1721 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1722 // CHECK-NTARGET-NEXT: entry:
1723 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1724 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1725 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1726 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1727 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1728 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1729 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1730 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1731 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 9
1732 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1733 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1734 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1735 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1736 // CHECK-NTARGET-NEXT: ret void
1739 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.5
1740 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
1741 // CHECK-NTARGET-NEXT: entry:
1742 // CHECK-NTARGET-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
1743 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
1744 // CHECK-NTARGET-NEXT: ret void
1747 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SDC1Ev
1748 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1749 // CHECK-NTARGET-NEXT: entry:
1750 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1751 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1752 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1753 // CHECK-NTARGET-NEXT: call void @_ZN2SDC2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]])
1754 // CHECK-NTARGET-NEXT: ret void
1757 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SDD1Ev
1758 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1759 // CHECK-NTARGET-NEXT: entry:
1760 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1761 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1762 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1763 // CHECK-NTARGET-NEXT: call void @_ZN2SDD2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]]) #[[ATTR2]]
1764 // CHECK-NTARGET-NEXT: ret void
1767 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SDC2Ev
1768 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1769 // CHECK-NTARGET-NEXT: entry:
1770 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1771 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1772 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1773 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1774 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1775 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1776 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1777 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1778 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 11
1779 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[A]], align 4
1780 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
1781 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
1782 // CHECK-NTARGET-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
1783 // CHECK-NTARGET-NEXT: ret void
1786 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SDD2Ev
1787 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1788 // CHECK-NTARGET-NEXT: entry:
1789 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1790 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1791 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1792 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1793 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1794 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1795 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1796 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1797 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1798 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
1799 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
1800 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174(i64 [[TMP3]]) #[[ATTR2]]
1801 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
1802 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
1803 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
1804 // CHECK-NTARGET-NEXT: ret void
1807 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174
1808 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
1809 // CHECK-NTARGET-NEXT: entry:
1810 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1811 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1812 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
1813 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
1814 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
1815 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
1816 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174.omp_outlined, i64 [[TMP1]])
1817 // CHECK-NTARGET-NEXT: ret void
1820 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174.omp_outlined
1821 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
1822 // CHECK-NTARGET-NEXT: entry:
1823 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1824 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1825 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1826 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1827 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
1828 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1829 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1830 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1831 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1832 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
1833 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1834 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1835 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
1836 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
1837 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
1838 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
1839 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
1840 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1841 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1842 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
1843 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1844 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
1845 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1846 // CHECK-NTARGET: cond.true:
1847 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
1848 // CHECK-NTARGET: cond.false:
1849 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1850 // CHECK-NTARGET-NEXT: br label [[COND_END]]
1851 // CHECK-NTARGET: cond.end:
1852 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
1853 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
1854 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
1855 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
1856 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1857 // CHECK-NTARGET: omp.inner.for.cond:
1858 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1859 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1860 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
1861 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1862 // CHECK-NTARGET: omp.inner.for.body:
1863 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1864 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
1865 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1866 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
1867 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
1868 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 12
1869 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
1870 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
1871 // CHECK-NTARGET: omp.body.continue:
1872 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
1873 // CHECK-NTARGET: omp.inner.for.inc:
1874 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1875 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
1876 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
1877 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
1878 // CHECK-NTARGET: omp.inner.for.end:
1879 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
1880 // CHECK-NTARGET: omp.loop.exit:
1881 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
1882 // CHECK-NTARGET-NEXT: ret void
1885 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.6
1886 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
1887 // CHECK-NTARGET-NEXT: entry:
1888 // CHECK-NTARGET-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
1889 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
1890 // CHECK-NTARGET-NEXT: ret void
1893 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SEC1Ev
1894 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1895 // CHECK-NTARGET-NEXT: entry:
1896 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1897 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1898 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1899 // CHECK-NTARGET-NEXT: call void @_ZN2SEC2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]])
1900 // CHECK-NTARGET-NEXT: ret void
1903 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SED1Ev
1904 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1905 // CHECK-NTARGET-NEXT: entry:
1906 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1907 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1908 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1909 // CHECK-NTARGET-NEXT: call void @_ZN2SED2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]]) #[[ATTR2]]
1910 // CHECK-NTARGET-NEXT: ret void
1913 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SEC2Ev
1914 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
1915 // CHECK-NTARGET-NEXT: entry:
1916 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
1917 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
1918 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1919 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
1920 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
1921 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
1922 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1923 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
1924 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
1925 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
1926 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
1927 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192(i64 [[TMP3]]) #[[ATTR2]]
1928 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
1929 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
1930 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
1931 // CHECK-NTARGET-NEXT: ret void
1934 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192
1935 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
1936 // CHECK-NTARGET-NEXT: entry:
1937 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1938 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
1939 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
1940 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
1941 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
1942 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
1943 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192.omp_outlined, i64 [[TMP1]])
1944 // CHECK-NTARGET-NEXT: ret void
1947 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192.omp_outlined
1948 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
1949 // CHECK-NTARGET-NEXT: entry:
1950 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
1951 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
1952 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
1953 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
1954 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
1955 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
1956 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
1957 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
1958 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
1959 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
1960 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
1961 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
1962 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
1963 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
1964 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
1965 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
1966 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
1967 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
1968 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
1969 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
1970 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1971 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
1972 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
1973 // CHECK-NTARGET: cond.true:
1974 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
1975 // CHECK-NTARGET: cond.false:
1976 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1977 // CHECK-NTARGET-NEXT: br label [[COND_END]]
1978 // CHECK-NTARGET: cond.end:
1979 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
1980 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
1981 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
1982 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
1983 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
1984 // CHECK-NTARGET: omp.inner.for.cond:
1985 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1986 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
1987 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
1988 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
1989 // CHECK-NTARGET: omp.inner.for.body:
1990 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
1991 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
1992 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
1993 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
1994 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
1995 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 14
1996 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
1997 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
1998 // CHECK-NTARGET: omp.body.continue:
1999 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2000 // CHECK-NTARGET: omp.inner.for.inc:
2001 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2002 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2003 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2004 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2005 // CHECK-NTARGET: omp.inner.for.end:
2006 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2007 // CHECK-NTARGET: omp.loop.exit:
2008 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2009 // CHECK-NTARGET-NEXT: ret void
2012 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2SED2Ev
2013 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2014 // CHECK-NTARGET-NEXT: entry:
2015 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2016 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
2017 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2018 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2019 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2020 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
2021 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2022 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
2023 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
2024 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
2025 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
2026 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199(i64 [[TMP3]]) #[[ATTR2]]
2027 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
2028 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
2029 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
2030 // CHECK-NTARGET-NEXT: ret void
2033 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199
2034 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2035 // CHECK-NTARGET-NEXT: entry:
2036 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2037 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2038 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2039 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2040 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2041 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2042 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199.omp_outlined, i64 [[TMP1]])
2043 // CHECK-NTARGET-NEXT: ret void
2046 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199.omp_outlined
2047 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2048 // CHECK-NTARGET-NEXT: entry:
2049 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2050 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2051 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2052 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2053 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2054 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2055 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2056 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2057 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2058 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2059 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2060 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2061 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2062 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2063 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2064 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2065 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2066 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2067 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2068 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2069 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2070 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2071 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2072 // CHECK-NTARGET: cond.true:
2073 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2074 // CHECK-NTARGET: cond.false:
2075 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2076 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2077 // CHECK-NTARGET: cond.end:
2078 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2079 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2080 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2081 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2082 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2083 // CHECK-NTARGET: omp.inner.for.cond:
2084 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2085 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2086 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2087 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2088 // CHECK-NTARGET: omp.inner.for.body:
2089 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2090 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2091 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2092 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2093 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2094 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 15
2095 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2096 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2097 // CHECK-NTARGET: omp.body.continue:
2098 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2099 // CHECK-NTARGET: omp.inner.for.inc:
2100 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2101 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2102 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2103 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2104 // CHECK-NTARGET: omp.inner.for.end:
2105 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2106 // CHECK-NTARGET: omp.loop.exit:
2107 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2108 // CHECK-NTARGET-NEXT: ret void
2111 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.7
2112 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
2113 // CHECK-NTARGET-NEXT: entry:
2114 // CHECK-NTARGET-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
2115 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
2116 // CHECK-NTARGET-NEXT: ret void
2119 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi100EEC1Ev
2120 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2121 // CHECK-NTARGET-NEXT: entry:
2122 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2123 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2124 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2125 // CHECK-NTARGET-NEXT: call void @_ZN2STILi100EEC2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]])
2126 // CHECK-NTARGET-NEXT: ret void
2129 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi100EED1Ev
2130 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2131 // CHECK-NTARGET-NEXT: entry:
2132 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2133 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2134 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2135 // CHECK-NTARGET-NEXT: call void @_ZN2STILi100EED2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]]) #[[ATTR2]]
2136 // CHECK-NTARGET-NEXT: ret void
2139 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi100EEC2Ev
2140 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2141 // CHECK-NTARGET-NEXT: entry:
2142 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2143 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
2144 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2145 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2146 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2147 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
2148 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2149 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
2150 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
2151 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
2152 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
2153 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218(i64 [[TMP3]]) #[[ATTR2]]
2154 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
2155 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
2156 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
2157 // CHECK-NTARGET-NEXT: ret void
2160 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218
2161 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2162 // CHECK-NTARGET-NEXT: entry:
2163 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2164 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2165 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2166 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2167 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2168 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2169 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218.omp_outlined, i64 [[TMP1]])
2170 // CHECK-NTARGET-NEXT: ret void
2173 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218.omp_outlined
2174 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2175 // CHECK-NTARGET-NEXT: entry:
2176 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2177 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2178 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2179 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2180 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2181 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2182 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2183 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2184 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2185 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2186 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2187 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2188 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2189 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2190 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2191 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2192 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2193 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2194 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2195 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2196 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2197 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2198 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2199 // CHECK-NTARGET: cond.true:
2200 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2201 // CHECK-NTARGET: cond.false:
2202 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2203 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2204 // CHECK-NTARGET: cond.end:
2205 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2206 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2207 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2208 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2209 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2210 // CHECK-NTARGET: omp.inner.for.cond:
2211 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2212 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2213 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2214 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2215 // CHECK-NTARGET: omp.inner.for.body:
2216 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2217 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2218 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2219 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2220 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2221 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 117
2222 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2223 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2224 // CHECK-NTARGET: omp.body.continue:
2225 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2226 // CHECK-NTARGET: omp.inner.for.inc:
2227 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2228 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2229 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2230 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2231 // CHECK-NTARGET: omp.inner.for.end:
2232 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2233 // CHECK-NTARGET: omp.loop.exit:
2234 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2235 // CHECK-NTARGET-NEXT: ret void
2238 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi100EED2Ev
2239 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2240 // CHECK-NTARGET-NEXT: entry:
2241 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2242 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
2243 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2244 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2245 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2246 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
2247 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2248 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
2249 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
2250 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
2251 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
2252 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225(i64 [[TMP3]]) #[[ATTR2]]
2253 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
2254 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
2255 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
2256 // CHECK-NTARGET-NEXT: ret void
2259 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225
2260 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2261 // CHECK-NTARGET-NEXT: entry:
2262 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2263 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2264 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2265 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2266 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2267 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2268 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225.omp_outlined, i64 [[TMP1]])
2269 // CHECK-NTARGET-NEXT: ret void
2272 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225.omp_outlined
2273 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2274 // CHECK-NTARGET-NEXT: entry:
2275 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2276 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2277 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2278 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2279 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2280 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2281 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2282 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2283 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2284 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2285 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2286 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2287 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2288 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2289 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2290 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2291 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2292 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2293 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2294 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2295 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2296 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2297 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2298 // CHECK-NTARGET: cond.true:
2299 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2300 // CHECK-NTARGET: cond.false:
2301 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2302 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2303 // CHECK-NTARGET: cond.end:
2304 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2305 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2306 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2307 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2308 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2309 // CHECK-NTARGET: omp.inner.for.cond:
2310 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2311 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2312 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2313 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2314 // CHECK-NTARGET: omp.inner.for.body:
2315 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2316 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2317 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2318 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2319 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2320 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 118
2321 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2322 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2323 // CHECK-NTARGET: omp.body.continue:
2324 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2325 // CHECK-NTARGET: omp.inner.for.inc:
2326 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2327 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2328 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2329 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2330 // CHECK-NTARGET: omp.inner.for.end:
2331 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2332 // CHECK-NTARGET: omp.loop.exit:
2333 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2334 // CHECK-NTARGET-NEXT: ret void
2337 // CHECK-NTARGET-LABEL: define {{[^@]+}}@__cxx_global_var_init.8
2338 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
2339 // CHECK-NTARGET-NEXT: entry:
2340 // CHECK-NTARGET-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
2341 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
2342 // CHECK-NTARGET-NEXT: ret void
2345 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC1Ev
2346 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2347 // CHECK-NTARGET-NEXT: entry:
2348 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2349 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2350 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2351 // CHECK-NTARGET-NEXT: call void @_ZN2STILi1000EEC2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]])
2352 // CHECK-NTARGET-NEXT: ret void
2355 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi1000EED1Ev
2356 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2357 // CHECK-NTARGET-NEXT: entry:
2358 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2359 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2360 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2361 // CHECK-NTARGET-NEXT: call void @_ZN2STILi1000EED2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]]) #[[ATTR2]]
2362 // CHECK-NTARGET-NEXT: ret void
2365 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC2Ev
2366 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2367 // CHECK-NTARGET-NEXT: entry:
2368 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2369 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
2370 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2371 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2372 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2373 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
2374 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2375 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
2376 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
2377 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
2378 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
2379 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218(i64 [[TMP3]]) #[[ATTR2]]
2380 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
2381 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
2382 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
2383 // CHECK-NTARGET-NEXT: ret void
2386 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218
2387 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2388 // CHECK-NTARGET-NEXT: entry:
2389 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2390 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2391 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2392 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2393 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2394 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2395 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218.omp_outlined, i64 [[TMP1]])
2396 // CHECK-NTARGET-NEXT: ret void
2399 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218.omp_outlined
2400 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2401 // CHECK-NTARGET-NEXT: entry:
2402 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2403 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2404 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2405 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2406 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2407 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2408 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2409 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2410 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2411 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2412 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2413 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2414 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2415 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2416 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2417 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2418 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2419 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2420 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2421 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2422 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2423 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2424 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2425 // CHECK-NTARGET: cond.true:
2426 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2427 // CHECK-NTARGET: cond.false:
2428 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2429 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2430 // CHECK-NTARGET: cond.end:
2431 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2432 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2433 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2434 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2435 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2436 // CHECK-NTARGET: omp.inner.for.cond:
2437 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2438 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2439 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2440 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2441 // CHECK-NTARGET: omp.inner.for.body:
2442 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2443 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2444 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2445 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2446 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2447 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1017
2448 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2449 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2450 // CHECK-NTARGET: omp.body.continue:
2451 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2452 // CHECK-NTARGET: omp.inner.for.inc:
2453 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2454 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2455 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2456 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2457 // CHECK-NTARGET: omp.inner.for.end:
2458 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2459 // CHECK-NTARGET: omp.loop.exit:
2460 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2461 // CHECK-NTARGET-NEXT: ret void
2464 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_ZN2STILi1000EED2Ev
2465 // CHECK-NTARGET-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat {
2466 // CHECK-NTARGET-NEXT: entry:
2467 // CHECK-NTARGET-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2468 // CHECK-NTARGET-NEXT: [[A:%.*]] = alloca i32, align 4
2469 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2470 // CHECK-NTARGET-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2471 // CHECK-NTARGET-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2472 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
2473 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2474 // CHECK-NTARGET-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
2475 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
2476 // CHECK-NTARGET-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
2477 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
2478 // CHECK-NTARGET-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225(i64 [[TMP3]]) #[[ATTR2]]
2479 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
2480 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
2481 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
2482 // CHECK-NTARGET-NEXT: ret void
2485 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225
2486 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2487 // CHECK-NTARGET-NEXT: entry:
2488 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2489 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2490 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2491 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2492 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2493 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2494 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225.omp_outlined, i64 [[TMP1]])
2495 // CHECK-NTARGET-NEXT: ret void
2498 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225.omp_outlined
2499 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2500 // CHECK-NTARGET-NEXT: entry:
2501 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2502 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2503 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2504 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2505 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2506 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2507 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2508 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2509 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2510 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2511 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2512 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2513 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2514 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2515 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2516 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2517 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2518 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2519 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2520 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2521 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2522 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2523 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2524 // CHECK-NTARGET: cond.true:
2525 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2526 // CHECK-NTARGET: cond.false:
2527 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2528 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2529 // CHECK-NTARGET: cond.end:
2530 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2531 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2532 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2533 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2534 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2535 // CHECK-NTARGET: omp.inner.for.cond:
2536 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2537 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2538 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2539 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2540 // CHECK-NTARGET: omp.inner.for.body:
2541 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2542 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2543 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2544 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2545 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2546 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1018
2547 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2548 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2549 // CHECK-NTARGET: omp.body.continue:
2550 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2551 // CHECK-NTARGET: omp.inner.for.inc:
2552 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2553 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2554 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2555 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2556 // CHECK-NTARGET: omp.inner.for.end:
2557 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2558 // CHECK-NTARGET: omp.loop.exit:
2559 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2560 // CHECK-NTARGET-NEXT: ret void
2563 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122
2564 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2565 // CHECK-NTARGET-NEXT: entry:
2566 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2567 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2568 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2569 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2570 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2571 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2572 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122.omp_outlined, i64 [[TMP1]])
2573 // CHECK-NTARGET-NEXT: ret void
2576 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122.omp_outlined
2577 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2578 // CHECK-NTARGET-NEXT: entry:
2579 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2580 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2581 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2582 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2583 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2584 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2585 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2586 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2587 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2588 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2589 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2590 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2591 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2592 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2593 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2594 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2595 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2596 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2597 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2598 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2599 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2600 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2601 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2602 // CHECK-NTARGET: cond.true:
2603 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2604 // CHECK-NTARGET: cond.false:
2605 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2606 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2607 // CHECK-NTARGET: cond.end:
2608 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2609 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2610 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2611 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2612 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2613 // CHECK-NTARGET: omp.inner.for.cond:
2614 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2615 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2616 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2617 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2618 // CHECK-NTARGET: omp.inner.for.body:
2619 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2620 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2621 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2622 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2623 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2624 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 4
2625 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2626 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2627 // CHECK-NTARGET: omp.body.continue:
2628 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2629 // CHECK-NTARGET: omp.inner.for.inc:
2630 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2631 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2632 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2633 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2634 // CHECK-NTARGET: omp.inner.for.end:
2635 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2636 // CHECK-NTARGET: omp.loop.exit:
2637 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2638 // CHECK-NTARGET-NEXT: ret void
2641 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185
2642 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2643 // CHECK-NTARGET-NEXT: entry:
2644 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2645 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2646 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2647 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2648 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2649 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2650 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185.omp_outlined, i64 [[TMP1]])
2651 // CHECK-NTARGET-NEXT: ret void
2654 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185.omp_outlined
2655 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2656 // CHECK-NTARGET-NEXT: entry:
2657 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2658 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2659 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2660 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2661 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2662 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2663 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2664 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2665 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2666 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2667 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2668 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2669 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2670 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2671 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2672 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2673 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2674 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2675 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2676 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2677 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2678 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2679 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2680 // CHECK-NTARGET: cond.true:
2681 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2682 // CHECK-NTARGET: cond.false:
2683 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2684 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2685 // CHECK-NTARGET: cond.end:
2686 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2687 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2688 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2689 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2690 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2691 // CHECK-NTARGET: omp.inner.for.cond:
2692 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2693 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2694 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2695 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2696 // CHECK-NTARGET: omp.inner.for.body:
2697 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2698 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2699 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2700 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2701 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2702 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 13
2703 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2704 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2705 // CHECK-NTARGET: omp.body.continue:
2706 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2707 // CHECK-NTARGET: omp.inner.for.inc:
2708 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2709 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2710 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2711 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2712 // CHECK-NTARGET: omp.inner.for.end:
2713 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2714 // CHECK-NTARGET: omp.loop.exit:
2715 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2716 // CHECK-NTARGET-NEXT: ret void
2719 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211
2720 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2721 // CHECK-NTARGET-NEXT: entry:
2722 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2723 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2724 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2725 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2726 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2727 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2728 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211.omp_outlined, i64 [[TMP1]])
2729 // CHECK-NTARGET-NEXT: ret void
2732 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211.omp_outlined
2733 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2734 // CHECK-NTARGET-NEXT: entry:
2735 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2736 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2737 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2738 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2739 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2740 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2741 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2742 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2743 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2744 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2745 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2746 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2747 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2748 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2749 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2750 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2751 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2752 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2753 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2754 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2755 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2756 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2757 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2758 // CHECK-NTARGET: cond.true:
2759 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2760 // CHECK-NTARGET: cond.false:
2761 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2762 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2763 // CHECK-NTARGET: cond.end:
2764 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2765 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2766 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2767 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2768 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2769 // CHECK-NTARGET: omp.inner.for.cond:
2770 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2771 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2772 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2773 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2774 // CHECK-NTARGET: omp.inner.for.body:
2775 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2776 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2777 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2778 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2779 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2780 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 116
2781 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2782 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2783 // CHECK-NTARGET: omp.body.continue:
2784 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2785 // CHECK-NTARGET: omp.inner.for.inc:
2786 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2787 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2788 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2789 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2790 // CHECK-NTARGET: omp.inner.for.end:
2791 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2792 // CHECK-NTARGET: omp.loop.exit:
2793 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2794 // CHECK-NTARGET-NEXT: ret void
2797 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211
2798 // CHECK-NTARGET-SAME: (i64 noundef [[A:%.*]]) #[[ATTR1]] {
2799 // CHECK-NTARGET-NEXT: entry:
2800 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2801 // CHECK-NTARGET-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
2802 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2803 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
2804 // CHECK-NTARGET-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
2805 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
2806 // CHECK-NTARGET-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211.omp_outlined, i64 [[TMP1]])
2807 // CHECK-NTARGET-NEXT: ret void
2810 // CHECK-NTARGET-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211.omp_outlined
2811 // CHECK-NTARGET-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR1]] {
2812 // CHECK-NTARGET-NEXT: entry:
2813 // CHECK-NTARGET-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
2814 // CHECK-NTARGET-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
2815 // CHECK-NTARGET-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
2816 // CHECK-NTARGET-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
2817 // CHECK-NTARGET-NEXT: [[TMP:%.*]] = alloca i32, align 4
2818 // CHECK-NTARGET-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
2819 // CHECK-NTARGET-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
2820 // CHECK-NTARGET-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
2821 // CHECK-NTARGET-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
2822 // CHECK-NTARGET-NEXT: [[I:%.*]] = alloca i32, align 4
2823 // CHECK-NTARGET-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
2824 // CHECK-NTARGET-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
2825 // CHECK-NTARGET-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
2826 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
2827 // CHECK-NTARGET-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
2828 // CHECK-NTARGET-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
2829 // CHECK-NTARGET-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
2830 // CHECK-NTARGET-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
2831 // CHECK-NTARGET-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
2832 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
2833 // CHECK-NTARGET-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2834 // CHECK-NTARGET-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
2835 // CHECK-NTARGET-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
2836 // CHECK-NTARGET: cond.true:
2837 // CHECK-NTARGET-NEXT: br label [[COND_END:%.*]]
2838 // CHECK-NTARGET: cond.false:
2839 // CHECK-NTARGET-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2840 // CHECK-NTARGET-NEXT: br label [[COND_END]]
2841 // CHECK-NTARGET: cond.end:
2842 // CHECK-NTARGET-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
2843 // CHECK-NTARGET-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
2844 // CHECK-NTARGET-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
2845 // CHECK-NTARGET-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
2846 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
2847 // CHECK-NTARGET: omp.inner.for.cond:
2848 // CHECK-NTARGET-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2849 // CHECK-NTARGET-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
2850 // CHECK-NTARGET-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
2851 // CHECK-NTARGET-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
2852 // CHECK-NTARGET: omp.inner.for.body:
2853 // CHECK-NTARGET-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2854 // CHECK-NTARGET-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
2855 // CHECK-NTARGET-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
2856 // CHECK-NTARGET-NEXT: store i32 [[ADD]], ptr [[I]], align 4
2857 // CHECK-NTARGET-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
2858 // CHECK-NTARGET-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1016
2859 // CHECK-NTARGET-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
2860 // CHECK-NTARGET-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
2861 // CHECK-NTARGET: omp.body.continue:
2862 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
2863 // CHECK-NTARGET: omp.inner.for.inc:
2864 // CHECK-NTARGET-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
2865 // CHECK-NTARGET-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
2866 // CHECK-NTARGET-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
2867 // CHECK-NTARGET-NEXT: br label [[OMP_INNER_FOR_COND]]
2868 // CHECK-NTARGET: omp.inner.for.end:
2869 // CHECK-NTARGET-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
2870 // CHECK-NTARGET: omp.loop.exit:
2871 // CHECK-NTARGET-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
2872 // CHECK-NTARGET-NEXT: ret void
2875 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
2876 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
2877 // CHECK-NTARGET-NEXT: entry:
2878 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init()
2879 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.2()
2880 // CHECK-NTARGET-NEXT: ret void
2883 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
2884 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
2885 // CHECK-NTARGET-NEXT: entry:
2886 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.3()
2887 // CHECK-NTARGET-NEXT: ret void
2890 // CHECK-NTARGET-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
2891 // CHECK-NTARGET-SAME: () #[[ATTR3]] {
2892 // CHECK-NTARGET-NEXT: entry:
2893 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.1()
2894 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.4()
2895 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.5()
2896 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.6()
2897 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.7()
2898 // CHECK-NTARGET-NEXT: call void @__cxx_global_var_init.8()
2899 // CHECK-NTARGET-NEXT: ret void
2902 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init
2903 // SIMD-ONLY2-SAME: () #[[ATTR0:[0-9]+]] {
2904 // SIMD-ONLY2-NEXT: entry:
2905 // SIMD-ONLY2-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
2906 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2:[0-9]+]]
2907 // SIMD-ONLY2-NEXT: ret void
2910 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SAC1Ev
2911 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {
2912 // SIMD-ONLY2-NEXT: entry:
2913 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2914 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2915 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2916 // SIMD-ONLY2-NEXT: call void @_ZN2SAC2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]])
2917 // SIMD-ONLY2-NEXT: ret void
2920 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SAD1Ev
2921 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
2922 // SIMD-ONLY2-NEXT: entry:
2923 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2924 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2925 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2926 // SIMD-ONLY2-NEXT: call void @_ZN2SAD2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]]) #[[ATTR2]]
2927 // SIMD-ONLY2-NEXT: ret void
2930 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
2931 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
2932 // SIMD-ONLY2-NEXT: entry:
2933 // SIMD-ONLY2-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
2934 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
2935 // SIMD-ONLY2-NEXT: ret void
2938 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
2939 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
2940 // SIMD-ONLY2-NEXT: entry:
2941 // SIMD-ONLY2-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
2942 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
2943 // SIMD-ONLY2-NEXT: ret void
2946 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SBC1Ev
2947 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
2948 // SIMD-ONLY2-NEXT: entry:
2949 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2950 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2951 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2952 // SIMD-ONLY2-NEXT: call void @_ZN2SBC2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]])
2953 // SIMD-ONLY2-NEXT: ret void
2956 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SBD1Ev
2957 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
2958 // SIMD-ONLY2-NEXT: entry:
2959 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2960 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2961 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2962 // SIMD-ONLY2-NEXT: call void @_ZN2SBD2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]]) #[[ATTR2]]
2963 // SIMD-ONLY2-NEXT: ret void
2966 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
2967 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
2968 // SIMD-ONLY2-NEXT: entry:
2969 // SIMD-ONLY2-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
2970 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
2971 // SIMD-ONLY2-NEXT: ret void
2974 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
2975 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
2976 // SIMD-ONLY2-NEXT: entry:
2977 // SIMD-ONLY2-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
2978 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
2979 // SIMD-ONLY2-NEXT: ret void
2982 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SCC1Ev
2983 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
2984 // SIMD-ONLY2-NEXT: entry:
2985 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2986 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2987 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2988 // SIMD-ONLY2-NEXT: call void @_ZN2SCC2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]])
2989 // SIMD-ONLY2-NEXT: ret void
2992 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SCD1Ev
2993 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
2994 // SIMD-ONLY2-NEXT: entry:
2995 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
2996 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
2997 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
2998 // SIMD-ONLY2-NEXT: call void @_ZN2SCD2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]]) #[[ATTR2]]
2999 // SIMD-ONLY2-NEXT: ret void
3002 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.5
3003 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
3004 // SIMD-ONLY2-NEXT: entry:
3005 // SIMD-ONLY2-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
3006 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
3007 // SIMD-ONLY2-NEXT: ret void
3010 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SDC1Ev
3011 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3012 // SIMD-ONLY2-NEXT: entry:
3013 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3014 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3015 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3016 // SIMD-ONLY2-NEXT: call void @_ZN2SDC2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]])
3017 // SIMD-ONLY2-NEXT: ret void
3020 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SDD1Ev
3021 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3022 // SIMD-ONLY2-NEXT: entry:
3023 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3024 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3025 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3026 // SIMD-ONLY2-NEXT: call void @_ZN2SDD2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]]) #[[ATTR2]]
3027 // SIMD-ONLY2-NEXT: ret void
3030 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.6
3031 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
3032 // SIMD-ONLY2-NEXT: entry:
3033 // SIMD-ONLY2-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
3034 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
3035 // SIMD-ONLY2-NEXT: ret void
3038 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SEC1Ev
3039 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3040 // SIMD-ONLY2-NEXT: entry:
3041 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3042 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3043 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3044 // SIMD-ONLY2-NEXT: call void @_ZN2SEC2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]])
3045 // SIMD-ONLY2-NEXT: ret void
3048 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SED1Ev
3049 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3050 // SIMD-ONLY2-NEXT: entry:
3051 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3052 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3053 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3054 // SIMD-ONLY2-NEXT: call void @_ZN2SED2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]]) #[[ATTR2]]
3055 // SIMD-ONLY2-NEXT: ret void
3058 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.7
3059 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
3060 // SIMD-ONLY2-NEXT: entry:
3061 // SIMD-ONLY2-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
3062 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
3063 // SIMD-ONLY2-NEXT: ret void
3066 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi100EEC1Ev
3067 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3068 // SIMD-ONLY2-NEXT: entry:
3069 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3070 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3071 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3072 // SIMD-ONLY2-NEXT: call void @_ZN2STILi100EEC2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]])
3073 // SIMD-ONLY2-NEXT: ret void
3076 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi100EED1Ev
3077 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3078 // SIMD-ONLY2-NEXT: entry:
3079 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3080 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3081 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3082 // SIMD-ONLY2-NEXT: call void @_ZN2STILi100EED2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]]) #[[ATTR2]]
3083 // SIMD-ONLY2-NEXT: ret void
3086 // SIMD-ONLY2-LABEL: define {{[^@]+}}@__cxx_global_var_init.8
3087 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
3088 // SIMD-ONLY2-NEXT: entry:
3089 // SIMD-ONLY2-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
3090 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
3091 // SIMD-ONLY2-NEXT: ret void
3094 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC1Ev
3095 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3096 // SIMD-ONLY2-NEXT: entry:
3097 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3098 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3099 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3100 // SIMD-ONLY2-NEXT: call void @_ZN2STILi1000EEC2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]])
3101 // SIMD-ONLY2-NEXT: ret void
3104 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi1000EED1Ev
3105 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3106 // SIMD-ONLY2-NEXT: entry:
3107 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3108 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3109 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3110 // SIMD-ONLY2-NEXT: call void @_ZN2STILi1000EED2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]]) #[[ATTR2]]
3111 // SIMD-ONLY2-NEXT: ret void
3114 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_Z3bari
3115 // SIMD-ONLY2-SAME: (i32 noundef signext [[A:%.*]]) #[[ATTR1]] {
3116 // SIMD-ONLY2-NEXT: entry:
3117 // SIMD-ONLY2-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
3118 // SIMD-ONLY2-NEXT: [[R:%.*]] = alloca i32, align 4
3119 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3120 // SIMD-ONLY2-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
3121 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
3122 // SIMD-ONLY2-NEXT: store i32 [[TMP0]], ptr [[R]], align 4
3123 // SIMD-ONLY2-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
3124 // SIMD-ONLY2-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @a2)
3125 // SIMD-ONLY2-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b1)
3126 // SIMD-ONLY2-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b2)
3127 // SIMD-ONLY2-NEXT: call void @_ZN2SC3fooEv(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
3128 // SIMD-ONLY2-NEXT: call void @_ZN2SD3fooEv(ptr noundef nonnull align 4 dereferenceable(128) @d1)
3129 // SIMD-ONLY2-NEXT: call void @_ZN2SE3fooEv(ptr noundef nonnull align 4 dereferenceable(256) @e1)
3130 // SIMD-ONLY2-NEXT: call void @_ZN2STILi100EE3fooEv(ptr noundef nonnull align 4 dereferenceable(912) @t1)
3131 // SIMD-ONLY2-NEXT: call void @_ZN2STILi1000EE3fooEv(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
3132 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3133 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3134 // SIMD-ONLY2: for.cond:
3135 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[I]], align 4
3136 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 10
3137 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3138 // SIMD-ONLY2: for.body:
3139 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[R]], align 4
3140 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1
3141 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[R]], align 4
3142 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3143 // SIMD-ONLY2: for.inc:
3144 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[I]], align 4
3145 // SIMD-ONLY2-NEXT: [[INC1:%.*]] = add nsw i32 [[TMP3]], 1
3146 // SIMD-ONLY2-NEXT: store i32 [[INC1]], ptr [[I]], align 4
3147 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]]
3148 // SIMD-ONLY2: for.end:
3149 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[R]], align 4
3150 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
3151 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4
3152 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP4]], [[TMP6]]
3153 // SIMD-ONLY2-NEXT: ret i32 [[ADD]]
3156 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SA3fooEv
3157 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) #[[ATTR1]] comdat {
3158 // SIMD-ONLY2-NEXT: entry:
3159 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3160 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3161 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3162 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3163 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3164 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3165 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3166 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3167 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
3168 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3169 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3170 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3171 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3172 // SIMD-ONLY2-NEXT: ret void
3175 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SB3fooEv
3176 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) #[[ATTR1]] comdat {
3177 // SIMD-ONLY2-NEXT: entry:
3178 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3179 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3180 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3181 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3182 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3183 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3184 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3185 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3186 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3187 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3188 // SIMD-ONLY2: for.cond:
3189 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3190 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3191 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3192 // SIMD-ONLY2: for.body:
3193 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3194 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 4
3195 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3196 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3197 // SIMD-ONLY2: for.inc:
3198 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3199 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3200 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3201 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]
3202 // SIMD-ONLY2: for.end:
3203 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3204 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3205 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3206 // SIMD-ONLY2-NEXT: ret void
3209 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SC3fooEv
3210 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) #[[ATTR1]] comdat {
3211 // SIMD-ONLY2-NEXT: entry:
3212 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3213 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3214 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3215 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3216 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3217 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3218 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3219 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3220 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 7
3221 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3222 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3223 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3224 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3225 // SIMD-ONLY2-NEXT: ret void
3228 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SD3fooEv
3229 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) #[[ATTR1]] comdat {
3230 // SIMD-ONLY2-NEXT: entry:
3231 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3232 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3233 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3234 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3235 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3236 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3237 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3238 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3239 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 10
3240 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3241 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3242 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3243 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3244 // SIMD-ONLY2-NEXT: ret void
3247 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SE3fooEv
3248 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) #[[ATTR1]] comdat {
3249 // SIMD-ONLY2-NEXT: entry:
3250 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3251 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3252 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3253 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3254 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3255 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3256 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3257 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3258 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3259 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3260 // SIMD-ONLY2: for.cond:
3261 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3262 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3263 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3264 // SIMD-ONLY2: for.body:
3265 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3266 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 13
3267 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3268 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3269 // SIMD-ONLY2: for.inc:
3270 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3271 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3272 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3273 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP5:![0-9]+]]
3274 // SIMD-ONLY2: for.end:
3275 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3276 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3277 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3278 // SIMD-ONLY2-NEXT: ret void
3281 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi100EE3fooEv
3282 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) #[[ATTR1]] comdat {
3283 // SIMD-ONLY2-NEXT: entry:
3284 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3285 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3286 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3287 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3288 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3289 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3290 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3291 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3292 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3293 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3294 // SIMD-ONLY2: for.cond:
3295 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3296 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3297 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3298 // SIMD-ONLY2: for.body:
3299 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3300 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 116
3301 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3302 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3303 // SIMD-ONLY2: for.inc:
3304 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3305 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3306 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3307 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP6:![0-9]+]]
3308 // SIMD-ONLY2: for.end:
3309 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3310 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3311 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3312 // SIMD-ONLY2-NEXT: ret void
3315 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi1000EE3fooEv
3316 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) #[[ATTR1]] comdat {
3317 // SIMD-ONLY2-NEXT: entry:
3318 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3319 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3320 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3321 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3322 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3323 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3324 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3325 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3326 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3327 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3328 // SIMD-ONLY2: for.cond:
3329 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3330 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3331 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3332 // SIMD-ONLY2: for.body:
3333 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3334 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 1016
3335 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3336 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3337 // SIMD-ONLY2: for.inc:
3338 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3339 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3340 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3341 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP7:![0-9]+]]
3342 // SIMD-ONLY2: for.end:
3343 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3344 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3345 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3346 // SIMD-ONLY2-NEXT: ret void
3349 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SAC2Ev
3350 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3351 // SIMD-ONLY2-NEXT: entry:
3352 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3353 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3354 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3355 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3356 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3357 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3358 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3359 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3360 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 2
3361 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3362 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3363 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3364 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3365 // SIMD-ONLY2-NEXT: ret void
3368 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SAD2Ev
3369 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3370 // SIMD-ONLY2-NEXT: entry:
3371 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3372 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3373 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3374 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3375 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3376 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3377 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3378 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3379 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 3
3380 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3381 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3382 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3383 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3384 // SIMD-ONLY2-NEXT: ret void
3387 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SBC2Ev
3388 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3389 // SIMD-ONLY2-NEXT: entry:
3390 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3391 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3392 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3393 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3394 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3395 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3396 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3397 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3398 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 5
3399 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3400 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3401 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3402 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3403 // SIMD-ONLY2-NEXT: ret void
3406 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SBD2Ev
3407 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3408 // SIMD-ONLY2-NEXT: entry:
3409 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3410 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3411 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3412 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3413 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3414 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3415 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3416 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3417 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 6
3418 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3419 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3420 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3421 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3422 // SIMD-ONLY2-NEXT: ret void
3425 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SCC2Ev
3426 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3427 // SIMD-ONLY2-NEXT: entry:
3428 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3429 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3430 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3431 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3432 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3433 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3434 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3435 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3436 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3437 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3438 // SIMD-ONLY2: for.cond:
3439 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3440 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3441 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3442 // SIMD-ONLY2: for.body:
3443 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3444 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 8
3445 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3446 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3447 // SIMD-ONLY2: for.inc:
3448 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3449 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3450 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3451 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP8:![0-9]+]]
3452 // SIMD-ONLY2: for.end:
3453 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3454 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3455 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3456 // SIMD-ONLY2-NEXT: ret void
3459 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SCD2Ev
3460 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3461 // SIMD-ONLY2-NEXT: entry:
3462 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3463 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3464 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3465 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3466 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3467 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3468 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3469 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3470 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 9
3471 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3472 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3473 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3474 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3475 // SIMD-ONLY2-NEXT: ret void
3478 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SDC2Ev
3479 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3480 // SIMD-ONLY2-NEXT: entry:
3481 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3482 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3483 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3484 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3485 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3486 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3487 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3488 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
3489 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 11
3490 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3491 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3492 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
3493 // SIMD-ONLY2-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
3494 // SIMD-ONLY2-NEXT: ret void
3497 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SDD2Ev
3498 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3499 // SIMD-ONLY2-NEXT: entry:
3500 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3501 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3502 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3503 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3504 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3505 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3506 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3507 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3508 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3509 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3510 // SIMD-ONLY2: for.cond:
3511 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3512 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3513 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3514 // SIMD-ONLY2: for.body:
3515 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3516 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 12
3517 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3518 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3519 // SIMD-ONLY2: for.inc:
3520 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3521 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3522 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3523 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP9:![0-9]+]]
3524 // SIMD-ONLY2: for.end:
3525 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3526 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3527 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3528 // SIMD-ONLY2-NEXT: ret void
3531 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SEC2Ev
3532 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3533 // SIMD-ONLY2-NEXT: entry:
3534 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3535 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3536 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3537 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3538 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3539 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3540 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3541 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3542 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3543 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3544 // SIMD-ONLY2: for.cond:
3545 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3546 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3547 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3548 // SIMD-ONLY2: for.body:
3549 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3550 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 14
3551 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3552 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3553 // SIMD-ONLY2: for.inc:
3554 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3555 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3556 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3557 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP10:![0-9]+]]
3558 // SIMD-ONLY2: for.end:
3559 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3560 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3561 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3562 // SIMD-ONLY2-NEXT: ret void
3565 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2SED2Ev
3566 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3567 // SIMD-ONLY2-NEXT: entry:
3568 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3569 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3570 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3571 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3572 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3573 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3574 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3575 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3576 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3577 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3578 // SIMD-ONLY2: for.cond:
3579 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3580 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3581 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3582 // SIMD-ONLY2: for.body:
3583 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3584 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 15
3585 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3586 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3587 // SIMD-ONLY2: for.inc:
3588 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3589 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3590 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3591 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP11:![0-9]+]]
3592 // SIMD-ONLY2: for.end:
3593 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3594 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3595 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3596 // SIMD-ONLY2-NEXT: ret void
3599 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi100EEC2Ev
3600 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3601 // SIMD-ONLY2-NEXT: entry:
3602 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3603 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3604 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3605 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3606 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3607 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3608 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3609 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3610 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3611 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3612 // SIMD-ONLY2: for.cond:
3613 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3614 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3615 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3616 // SIMD-ONLY2: for.body:
3617 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3618 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 117
3619 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3620 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3621 // SIMD-ONLY2: for.inc:
3622 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3623 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3624 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3625 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP12:![0-9]+]]
3626 // SIMD-ONLY2: for.end:
3627 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3628 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3629 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3630 // SIMD-ONLY2-NEXT: ret void
3633 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi100EED2Ev
3634 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3635 // SIMD-ONLY2-NEXT: entry:
3636 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3637 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3638 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3639 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3640 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3641 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3642 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3643 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3644 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3645 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3646 // SIMD-ONLY2: for.cond:
3647 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3648 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3649 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3650 // SIMD-ONLY2: for.body:
3651 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3652 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 118
3653 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3654 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3655 // SIMD-ONLY2: for.inc:
3656 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3657 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3658 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3659 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP13:![0-9]+]]
3660 // SIMD-ONLY2: for.end:
3661 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3662 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3663 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3664 // SIMD-ONLY2-NEXT: ret void
3667 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC2Ev
3668 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3669 // SIMD-ONLY2-NEXT: entry:
3670 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3671 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3672 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3673 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3674 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3675 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3676 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3677 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3678 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3679 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3680 // SIMD-ONLY2: for.cond:
3681 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3682 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3683 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3684 // SIMD-ONLY2: for.body:
3685 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3686 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 1017
3687 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3688 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3689 // SIMD-ONLY2: for.inc:
3690 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3691 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3692 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3693 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP14:![0-9]+]]
3694 // SIMD-ONLY2: for.end:
3695 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3696 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3697 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3698 // SIMD-ONLY2-NEXT: ret void
3701 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_ZN2STILi1000EED2Ev
3702 // SIMD-ONLY2-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
3703 // SIMD-ONLY2-NEXT: entry:
3704 // SIMD-ONLY2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
3705 // SIMD-ONLY2-NEXT: [[A:%.*]] = alloca i32, align 4
3706 // SIMD-ONLY2-NEXT: [[I:%.*]] = alloca i32, align 4
3707 // SIMD-ONLY2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
3708 // SIMD-ONLY2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
3709 // SIMD-ONLY2-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
3710 // SIMD-ONLY2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
3711 // SIMD-ONLY2-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
3712 // SIMD-ONLY2-NEXT: store i32 0, ptr [[I]], align 4
3713 // SIMD-ONLY2-NEXT: br label [[FOR_COND:%.*]]
3714 // SIMD-ONLY2: for.cond:
3715 // SIMD-ONLY2-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
3716 // SIMD-ONLY2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP2]], 10
3717 // SIMD-ONLY2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
3718 // SIMD-ONLY2: for.body:
3719 // SIMD-ONLY2-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
3720 // SIMD-ONLY2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 1018
3721 // SIMD-ONLY2-NEXT: store i32 [[ADD]], ptr [[A]], align 4
3722 // SIMD-ONLY2-NEXT: br label [[FOR_INC:%.*]]
3723 // SIMD-ONLY2: for.inc:
3724 // SIMD-ONLY2-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4
3725 // SIMD-ONLY2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP4]], 1
3726 // SIMD-ONLY2-NEXT: store i32 [[INC]], ptr [[I]], align 4
3727 // SIMD-ONLY2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP15:![0-9]+]]
3728 // SIMD-ONLY2: for.end:
3729 // SIMD-ONLY2-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
3730 // SIMD-ONLY2-NEXT: [[TMP6:%.*]] = load ptr, ptr @R, align 8
3731 // SIMD-ONLY2-NEXT: store i32 [[TMP5]], ptr [[TMP6]], align 4
3732 // SIMD-ONLY2-NEXT: ret void
3735 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
3736 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
3737 // SIMD-ONLY2-NEXT: entry:
3738 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init()
3739 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.2()
3740 // SIMD-ONLY2-NEXT: ret void
3743 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
3744 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
3745 // SIMD-ONLY2-NEXT: entry:
3746 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.3()
3747 // SIMD-ONLY2-NEXT: ret void
3750 // SIMD-ONLY2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
3751 // SIMD-ONLY2-SAME: () #[[ATTR0]] {
3752 // SIMD-ONLY2-NEXT: entry:
3753 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.1()
3754 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.4()
3755 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.5()
3756 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.6()
3757 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.7()
3758 // SIMD-ONLY2-NEXT: call void @__cxx_global_var_init.8()
3759 // SIMD-ONLY2-NEXT: ret void
3762 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init
3763 // OMP-DEFAULT-SAME: () #[[ATTR0:[0-9]+]] {
3764 // OMP-DEFAULT-NEXT: entry:
3765 // OMP-DEFAULT-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
3766 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2:[0-9]+]]
3767 // OMP-DEFAULT-NEXT: ret void
3774 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
3775 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3776 // OMP-DEFAULT-NEXT: entry:
3777 // OMP-DEFAULT-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
3778 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
3779 // OMP-DEFAULT-NEXT: ret void
3782 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
3783 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3784 // OMP-DEFAULT-NEXT: entry:
3785 // OMP-DEFAULT-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
3786 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
3787 // OMP-DEFAULT-NEXT: ret void
3794 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
3795 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3796 // OMP-DEFAULT-NEXT: entry:
3797 // OMP-DEFAULT-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
3798 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
3799 // OMP-DEFAULT-NEXT: ret void
3802 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
3803 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3804 // OMP-DEFAULT-NEXT: entry:
3805 // OMP-DEFAULT-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
3806 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
3807 // OMP-DEFAULT-NEXT: ret void
3816 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.5
3817 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3818 // OMP-DEFAULT-NEXT: entry:
3819 // OMP-DEFAULT-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
3820 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
3821 // OMP-DEFAULT-NEXT: ret void
3830 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.8
3831 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3832 // OMP-DEFAULT-NEXT: entry:
3833 // OMP-DEFAULT-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
3834 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
3835 // OMP-DEFAULT-NEXT: ret void
3846 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.13
3847 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3848 // OMP-DEFAULT-NEXT: entry:
3849 // OMP-DEFAULT-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
3850 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
3851 // OMP-DEFAULT-NEXT: ret void
3862 // OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.18
3863 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3864 // OMP-DEFAULT-NEXT: entry:
3865 // OMP-DEFAULT-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
3866 // OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
3867 // OMP-DEFAULT-NEXT: ret void
3896 // OMP-DEFAULT-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
3897 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3898 // OMP-DEFAULT-NEXT: entry:
3899 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init()
3900 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.2()
3901 // OMP-DEFAULT-NEXT: ret void
3904 // OMP-DEFAULT-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
3905 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3906 // OMP-DEFAULT-NEXT: entry:
3907 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.3()
3908 // OMP-DEFAULT-NEXT: ret void
3911 // OMP-DEFAULT-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
3912 // OMP-DEFAULT-SAME: () #[[ATTR0]] {
3913 // OMP-DEFAULT-NEXT: entry:
3914 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.1()
3915 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.4()
3916 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.5()
3917 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.8()
3918 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.13()
3919 // OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.18()
3920 // OMP-DEFAULT-NEXT: ret void
3985 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init
3986 // OMP-DEfAULT-SAME: () #[[ATTR0:[0-9]+]] {
3987 // OMP-DEfAULT-NEXT: entry:
3988 // OMP-DEfAULT-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
3989 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2:[0-9]+]]
3990 // OMP-DEfAULT-NEXT: ret void
3993 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SAC1Ev
3994 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
3995 // OMP-DEfAULT-NEXT: entry:
3996 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
3997 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
3998 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
3999 // OMP-DEfAULT-NEXT: call void @_ZN2SAC2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]])
4000 // OMP-DEfAULT-NEXT: ret void
4003 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SAD1Ev
4004 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4005 // OMP-DEfAULT-NEXT: entry:
4006 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4007 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4008 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4009 // OMP-DEfAULT-NEXT: call void @_ZN2SAD2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]]) #[[ATTR2]]
4010 // OMP-DEfAULT-NEXT: ret void
4013 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SAC2Ev
4014 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4015 // OMP-DEfAULT-NEXT: entry:
4016 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4017 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4018 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4019 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4020 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4021 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4022 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4023 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4024 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 2
4025 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
4026 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
4027 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
4028 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4029 // OMP-DEfAULT-NEXT: ret void
4032 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SAD2Ev
4033 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4034 // OMP-DEfAULT-NEXT: entry:
4035 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4036 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4037 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4038 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4039 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4040 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4041 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4042 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4043 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 3
4044 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
4045 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
4046 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
4047 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4048 // OMP-DEfAULT-NEXT: ret void
4051 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
4052 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
4053 // OMP-DEfAULT-NEXT: entry:
4054 // OMP-DEfAULT-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
4055 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
4056 // OMP-DEfAULT-NEXT: ret void
4059 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
4060 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
4061 // OMP-DEfAULT-NEXT: entry:
4062 // OMP-DEfAULT-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
4063 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
4064 // OMP-DEfAULT-NEXT: ret void
4067 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SBC1Ev
4068 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4069 // OMP-DEfAULT-NEXT: entry:
4070 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4071 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4072 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4073 // OMP-DEfAULT-NEXT: call void @_ZN2SBC2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]])
4074 // OMP-DEfAULT-NEXT: ret void
4077 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SBD1Ev
4078 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4079 // OMP-DEfAULT-NEXT: entry:
4080 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4081 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4082 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4083 // OMP-DEfAULT-NEXT: call void @_ZN2SBD2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]]) #[[ATTR2]]
4084 // OMP-DEfAULT-NEXT: ret void
4087 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SBC2Ev
4088 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4089 // OMP-DEfAULT-NEXT: entry:
4090 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4091 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4092 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4093 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4094 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4095 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4096 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4097 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4098 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 5
4099 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
4100 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
4101 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
4102 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4103 // OMP-DEfAULT-NEXT: ret void
4106 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SBD2Ev
4107 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4108 // OMP-DEfAULT-NEXT: entry:
4109 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4110 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4111 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4112 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4113 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4114 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4115 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4116 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4117 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 6
4118 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
4119 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
4120 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
4121 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4122 // OMP-DEfAULT-NEXT: ret void
4125 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
4126 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
4127 // OMP-DEfAULT-NEXT: entry:
4128 // OMP-DEfAULT-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
4129 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
4130 // OMP-DEfAULT-NEXT: ret void
4133 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
4134 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
4135 // OMP-DEfAULT-NEXT: entry:
4136 // OMP-DEfAULT-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
4137 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
4138 // OMP-DEfAULT-NEXT: ret void
4141 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SCC1Ev
4142 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4143 // OMP-DEfAULT-NEXT: entry:
4144 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4145 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4146 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4147 // OMP-DEfAULT-NEXT: call void @_ZN2SCC2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]])
4148 // OMP-DEfAULT-NEXT: ret void
4151 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SCD1Ev
4152 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4153 // OMP-DEfAULT-NEXT: entry:
4154 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4155 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4156 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4157 // OMP-DEfAULT-NEXT: call void @_ZN2SCD2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]]) #[[ATTR2]]
4158 // OMP-DEfAULT-NEXT: ret void
4161 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SCC2Ev
4162 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4163 // OMP-DEfAULT-NEXT: entry:
4164 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4165 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4166 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4167 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
4168 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
4169 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
4170 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
4171 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4172 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4173 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4174 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4175 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4176 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4177 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
4178 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
4179 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4180 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4181 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4182 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
4183 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4184 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
4185 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4186 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4187 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
4188 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
4189 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
4190 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
4191 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
4192 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
4193 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
4194 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
4195 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
4196 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes, ptr [[TMP13]], align 4
4197 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
4198 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes, ptr [[TMP14]], align 4
4199 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
4200 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
4201 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
4202 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
4203 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
4204 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
4205 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
4206 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
4207 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
4208 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
4209 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
4210 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
4211 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
4212 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
4213 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2:[0-9]+]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148.region_id, ptr [[KERNEL_ARGS]])
4214 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
4215 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4216 // OMP-DEfAULT: omp_offload.failed:
4217 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148(i32 [[TMP3]]) #[[ATTR2]]
4218 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
4219 // OMP-DEfAULT: omp_offload.cont:
4220 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
4221 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
4222 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
4223 // OMP-DEfAULT-NEXT: ret void
4226 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148
4227 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3:[0-9]+]] {
4228 // OMP-DEfAULT-NEXT: entry:
4229 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4230 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4231 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4232 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
4233 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
4234 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
4235 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148.omp_outlined, i32 [[TMP1]])
4236 // OMP-DEfAULT-NEXT: ret void
4239 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148.omp_outlined
4240 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
4241 // OMP-DEfAULT-NEXT: entry:
4242 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
4243 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
4244 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4245 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4246 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
4247 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4248 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4249 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4250 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4251 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
4252 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
4253 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
4254 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4255 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
4256 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
4257 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
4258 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
4259 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
4260 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4261 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
4262 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4263 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
4264 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4265 // OMP-DEfAULT: cond.true:
4266 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
4267 // OMP-DEfAULT: cond.false:
4268 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4269 // OMP-DEfAULT-NEXT: br label [[COND_END]]
4270 // OMP-DEfAULT: cond.end:
4271 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
4272 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
4273 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
4274 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
4275 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4276 // OMP-DEfAULT: omp.inner.for.cond:
4277 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4278 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4279 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
4280 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4281 // OMP-DEfAULT: omp.inner.for.body:
4282 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4283 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
4284 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4285 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
4286 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
4287 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 8
4288 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
4289 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4290 // OMP-DEfAULT: omp.body.continue:
4291 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4292 // OMP-DEfAULT: omp.inner.for.inc:
4293 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4294 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
4295 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
4296 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
4297 // OMP-DEfAULT: omp.inner.for.end:
4298 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4299 // OMP-DEfAULT: omp.loop.exit:
4300 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
4301 // OMP-DEfAULT-NEXT: ret void
4304 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SCD2Ev
4305 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4306 // OMP-DEfAULT-NEXT: entry:
4307 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4308 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4309 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4310 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4311 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4312 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4313 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4314 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4315 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 9
4316 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
4317 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
4318 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
4319 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4320 // OMP-DEfAULT-NEXT: ret void
4323 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.5
4324 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
4325 // OMP-DEfAULT-NEXT: entry:
4326 // OMP-DEfAULT-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
4327 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
4328 // OMP-DEfAULT-NEXT: ret void
4331 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SDC1Ev
4332 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4333 // OMP-DEfAULT-NEXT: entry:
4334 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4335 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4336 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4337 // OMP-DEfAULT-NEXT: call void @_ZN2SDC2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]])
4338 // OMP-DEfAULT-NEXT: ret void
4341 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SDD1Ev
4342 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4343 // OMP-DEfAULT-NEXT: entry:
4344 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4345 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4346 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4347 // OMP-DEfAULT-NEXT: call void @_ZN2SDD2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]]) #[[ATTR2]]
4348 // OMP-DEfAULT-NEXT: ret void
4351 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SDC2Ev
4352 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4353 // OMP-DEfAULT-NEXT: entry:
4354 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4355 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4356 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4357 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4358 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4359 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4360 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4361 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4362 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 11
4363 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
4364 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
4365 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
4366 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4367 // OMP-DEfAULT-NEXT: ret void
4370 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SDD2Ev
4371 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4372 // OMP-DEfAULT-NEXT: entry:
4373 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4374 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4375 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4376 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
4377 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
4378 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
4379 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
4380 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4381 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4382 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4383 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4384 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4385 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4386 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
4387 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
4388 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4389 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4390 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4391 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
4392 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4393 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
4394 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4395 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4396 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
4397 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
4398 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
4399 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
4400 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
4401 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
4402 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
4403 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
4404 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
4405 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.6, ptr [[TMP13]], align 4
4406 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
4407 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.7, ptr [[TMP14]], align 4
4408 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
4409 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
4410 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
4411 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
4412 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
4413 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
4414 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
4415 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
4416 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
4417 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
4418 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
4419 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
4420 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
4421 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
4422 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174.region_id, ptr [[KERNEL_ARGS]])
4423 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
4424 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4425 // OMP-DEfAULT: omp_offload.failed:
4426 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174(i32 [[TMP3]]) #[[ATTR2]]
4427 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
4428 // OMP-DEfAULT: omp_offload.cont:
4429 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
4430 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
4431 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
4432 // OMP-DEfAULT-NEXT: ret void
4435 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174
4436 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
4437 // OMP-DEfAULT-NEXT: entry:
4438 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4439 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4440 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4441 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
4442 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
4443 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
4444 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174.omp_outlined, i32 [[TMP1]])
4445 // OMP-DEfAULT-NEXT: ret void
4448 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174.omp_outlined
4449 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
4450 // OMP-DEfAULT-NEXT: entry:
4451 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
4452 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
4453 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4454 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4455 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
4456 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4457 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4458 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4459 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4460 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
4461 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
4462 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
4463 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4464 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
4465 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
4466 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
4467 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
4468 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
4469 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4470 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
4471 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4472 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
4473 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4474 // OMP-DEfAULT: cond.true:
4475 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
4476 // OMP-DEfAULT: cond.false:
4477 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4478 // OMP-DEfAULT-NEXT: br label [[COND_END]]
4479 // OMP-DEfAULT: cond.end:
4480 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
4481 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
4482 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
4483 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
4484 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4485 // OMP-DEfAULT: omp.inner.for.cond:
4486 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4487 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4488 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
4489 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4490 // OMP-DEfAULT: omp.inner.for.body:
4491 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4492 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
4493 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4494 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
4495 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
4496 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 12
4497 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
4498 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4499 // OMP-DEfAULT: omp.body.continue:
4500 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4501 // OMP-DEfAULT: omp.inner.for.inc:
4502 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4503 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
4504 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
4505 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
4506 // OMP-DEfAULT: omp.inner.for.end:
4507 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4508 // OMP-DEfAULT: omp.loop.exit:
4509 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
4510 // OMP-DEfAULT-NEXT: ret void
4513 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.8
4514 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
4515 // OMP-DEfAULT-NEXT: entry:
4516 // OMP-DEfAULT-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
4517 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
4518 // OMP-DEfAULT-NEXT: ret void
4521 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SEC1Ev
4522 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4523 // OMP-DEfAULT-NEXT: entry:
4524 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4525 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4526 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4527 // OMP-DEfAULT-NEXT: call void @_ZN2SEC2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]])
4528 // OMP-DEfAULT-NEXT: ret void
4531 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SED1Ev
4532 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4533 // OMP-DEfAULT-NEXT: entry:
4534 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4535 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4536 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4537 // OMP-DEfAULT-NEXT: call void @_ZN2SED2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]]) #[[ATTR2]]
4538 // OMP-DEfAULT-NEXT: ret void
4541 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SEC2Ev
4542 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4543 // OMP-DEfAULT-NEXT: entry:
4544 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4545 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4546 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4547 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
4548 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
4549 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
4550 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
4551 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4552 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4553 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4554 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4555 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4556 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4557 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
4558 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
4559 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4560 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4561 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4562 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
4563 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4564 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
4565 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4566 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4567 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
4568 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
4569 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
4570 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
4571 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
4572 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
4573 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
4574 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
4575 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
4576 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.9, ptr [[TMP13]], align 4
4577 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
4578 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.10, ptr [[TMP14]], align 4
4579 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
4580 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
4581 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
4582 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
4583 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
4584 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
4585 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
4586 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
4587 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
4588 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
4589 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
4590 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
4591 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
4592 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
4593 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192.region_id, ptr [[KERNEL_ARGS]])
4594 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
4595 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4596 // OMP-DEfAULT: omp_offload.failed:
4597 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192(i32 [[TMP3]]) #[[ATTR2]]
4598 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
4599 // OMP-DEfAULT: omp_offload.cont:
4600 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
4601 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
4602 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
4603 // OMP-DEfAULT-NEXT: ret void
4606 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192
4607 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
4608 // OMP-DEfAULT-NEXT: entry:
4609 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4610 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4611 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4612 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
4613 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
4614 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
4615 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192.omp_outlined, i32 [[TMP1]])
4616 // OMP-DEfAULT-NEXT: ret void
4619 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192.omp_outlined
4620 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
4621 // OMP-DEfAULT-NEXT: entry:
4622 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
4623 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
4624 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4625 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4626 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
4627 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4628 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4629 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4630 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4631 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
4632 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
4633 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
4634 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4635 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
4636 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
4637 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
4638 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
4639 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
4640 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4641 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
4642 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4643 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
4644 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4645 // OMP-DEfAULT: cond.true:
4646 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
4647 // OMP-DEfAULT: cond.false:
4648 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4649 // OMP-DEfAULT-NEXT: br label [[COND_END]]
4650 // OMP-DEfAULT: cond.end:
4651 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
4652 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
4653 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
4654 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
4655 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4656 // OMP-DEfAULT: omp.inner.for.cond:
4657 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4658 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4659 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
4660 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4661 // OMP-DEfAULT: omp.inner.for.body:
4662 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4663 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
4664 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4665 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
4666 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
4667 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 14
4668 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
4669 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4670 // OMP-DEfAULT: omp.body.continue:
4671 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4672 // OMP-DEfAULT: omp.inner.for.inc:
4673 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4674 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
4675 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
4676 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
4677 // OMP-DEfAULT: omp.inner.for.end:
4678 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4679 // OMP-DEfAULT: omp.loop.exit:
4680 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
4681 // OMP-DEfAULT-NEXT: ret void
4684 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SED2Ev
4685 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4686 // OMP-DEfAULT-NEXT: entry:
4687 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4688 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4689 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4690 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
4691 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
4692 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
4693 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
4694 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4695 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4696 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4697 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4698 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4699 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4700 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
4701 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
4702 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4703 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4704 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4705 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
4706 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4707 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
4708 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4709 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4710 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
4711 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
4712 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
4713 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
4714 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
4715 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
4716 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
4717 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
4718 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
4719 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.11, ptr [[TMP13]], align 4
4720 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
4721 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.12, ptr [[TMP14]], align 4
4722 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
4723 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
4724 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
4725 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
4726 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
4727 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
4728 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
4729 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
4730 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
4731 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
4732 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
4733 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
4734 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
4735 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
4736 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199.region_id, ptr [[KERNEL_ARGS]])
4737 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
4738 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4739 // OMP-DEfAULT: omp_offload.failed:
4740 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199(i32 [[TMP3]]) #[[ATTR2]]
4741 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
4742 // OMP-DEfAULT: omp_offload.cont:
4743 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
4744 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
4745 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
4746 // OMP-DEfAULT-NEXT: ret void
4749 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199
4750 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
4751 // OMP-DEfAULT-NEXT: entry:
4752 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4753 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4754 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4755 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
4756 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
4757 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
4758 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199.omp_outlined, i32 [[TMP1]])
4759 // OMP-DEfAULT-NEXT: ret void
4762 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199.omp_outlined
4763 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
4764 // OMP-DEfAULT-NEXT: entry:
4765 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
4766 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
4767 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4768 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4769 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
4770 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4771 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4772 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4773 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4774 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
4775 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
4776 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
4777 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4778 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
4779 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
4780 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
4781 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
4782 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
4783 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4784 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
4785 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4786 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
4787 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4788 // OMP-DEfAULT: cond.true:
4789 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
4790 // OMP-DEfAULT: cond.false:
4791 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4792 // OMP-DEfAULT-NEXT: br label [[COND_END]]
4793 // OMP-DEfAULT: cond.end:
4794 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
4795 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
4796 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
4797 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
4798 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4799 // OMP-DEfAULT: omp.inner.for.cond:
4800 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4801 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4802 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
4803 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4804 // OMP-DEfAULT: omp.inner.for.body:
4805 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4806 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
4807 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4808 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
4809 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
4810 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 15
4811 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
4812 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4813 // OMP-DEfAULT: omp.body.continue:
4814 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4815 // OMP-DEfAULT: omp.inner.for.inc:
4816 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4817 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
4818 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
4819 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
4820 // OMP-DEfAULT: omp.inner.for.end:
4821 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4822 // OMP-DEfAULT: omp.loop.exit:
4823 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
4824 // OMP-DEfAULT-NEXT: ret void
4827 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.13
4828 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
4829 // OMP-DEfAULT-NEXT: entry:
4830 // OMP-DEfAULT-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
4831 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
4832 // OMP-DEfAULT-NEXT: ret void
4835 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EEC1Ev
4836 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4837 // OMP-DEfAULT-NEXT: entry:
4838 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4839 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4840 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4841 // OMP-DEfAULT-NEXT: call void @_ZN2STILi100EEC2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]])
4842 // OMP-DEfAULT-NEXT: ret void
4845 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EED1Ev
4846 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4847 // OMP-DEfAULT-NEXT: entry:
4848 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4849 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4850 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4851 // OMP-DEfAULT-NEXT: call void @_ZN2STILi100EED2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]]) #[[ATTR2]]
4852 // OMP-DEfAULT-NEXT: ret void
4855 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EEC2Ev
4856 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
4857 // OMP-DEfAULT-NEXT: entry:
4858 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
4859 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
4860 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4861 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
4862 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
4863 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
4864 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
4865 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
4866 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
4867 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
4868 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4869 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
4870 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
4871 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
4872 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
4873 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4874 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
4875 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4876 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
4877 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
4878 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
4879 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
4880 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
4881 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
4882 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
4883 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
4884 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
4885 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
4886 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
4887 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
4888 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
4889 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
4890 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.14, ptr [[TMP13]], align 4
4891 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
4892 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.15, ptr [[TMP14]], align 4
4893 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
4894 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
4895 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
4896 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
4897 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
4898 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
4899 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
4900 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
4901 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
4902 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
4903 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
4904 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
4905 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
4906 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
4907 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218.region_id, ptr [[KERNEL_ARGS]])
4908 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
4909 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
4910 // OMP-DEfAULT: omp_offload.failed:
4911 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218(i32 [[TMP3]]) #[[ATTR2]]
4912 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
4913 // OMP-DEfAULT: omp_offload.cont:
4914 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
4915 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
4916 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
4917 // OMP-DEfAULT-NEXT: ret void
4920 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218
4921 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
4922 // OMP-DEfAULT-NEXT: entry:
4923 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4924 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
4925 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4926 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
4927 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
4928 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
4929 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218.omp_outlined, i32 [[TMP1]])
4930 // OMP-DEfAULT-NEXT: ret void
4933 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218.omp_outlined
4934 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
4935 // OMP-DEfAULT-NEXT: entry:
4936 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
4937 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
4938 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
4939 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
4940 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
4941 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
4942 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
4943 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
4944 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
4945 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
4946 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
4947 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
4948 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
4949 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
4950 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
4951 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
4952 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
4953 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
4954 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
4955 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
4956 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4957 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
4958 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
4959 // OMP-DEfAULT: cond.true:
4960 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
4961 // OMP-DEfAULT: cond.false:
4962 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4963 // OMP-DEfAULT-NEXT: br label [[COND_END]]
4964 // OMP-DEfAULT: cond.end:
4965 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
4966 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
4967 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
4968 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
4969 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
4970 // OMP-DEfAULT: omp.inner.for.cond:
4971 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4972 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
4973 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
4974 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
4975 // OMP-DEfAULT: omp.inner.for.body:
4976 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4977 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
4978 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
4979 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
4980 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
4981 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 117
4982 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
4983 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
4984 // OMP-DEfAULT: omp.body.continue:
4985 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
4986 // OMP-DEfAULT: omp.inner.for.inc:
4987 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
4988 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
4989 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
4990 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
4991 // OMP-DEfAULT: omp.inner.for.end:
4992 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
4993 // OMP-DEfAULT: omp.loop.exit:
4994 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
4995 // OMP-DEfAULT-NEXT: ret void
4998 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EED2Ev
4999 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
5000 // OMP-DEfAULT-NEXT: entry:
5001 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5002 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5003 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5004 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
5005 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
5006 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
5007 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
5008 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5009 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5010 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5011 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5012 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5013 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5014 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
5015 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
5016 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5017 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5018 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5019 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
5020 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5021 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
5022 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5023 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5024 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
5025 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
5026 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
5027 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
5028 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
5029 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
5030 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
5031 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
5032 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
5033 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.16, ptr [[TMP13]], align 4
5034 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
5035 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.17, ptr [[TMP14]], align 4
5036 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
5037 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
5038 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
5039 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
5040 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
5041 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
5042 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
5043 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
5044 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
5045 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
5046 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
5047 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
5048 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
5049 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
5050 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225.region_id, ptr [[KERNEL_ARGS]])
5051 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
5052 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5053 // OMP-DEfAULT: omp_offload.failed:
5054 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225(i32 [[TMP3]]) #[[ATTR2]]
5055 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
5056 // OMP-DEfAULT: omp_offload.cont:
5057 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
5058 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
5059 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
5060 // OMP-DEfAULT-NEXT: ret void
5063 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225
5064 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
5065 // OMP-DEfAULT-NEXT: entry:
5066 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5067 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5068 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5069 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
5070 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
5071 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
5072 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225.omp_outlined, i32 [[TMP1]])
5073 // OMP-DEfAULT-NEXT: ret void
5076 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225.omp_outlined
5077 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
5078 // OMP-DEfAULT-NEXT: entry:
5079 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
5080 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
5081 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5082 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
5083 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
5084 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
5085 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
5086 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5087 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5088 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
5089 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
5090 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
5091 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5092 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
5093 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
5094 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
5095 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
5096 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
5097 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5098 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
5099 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5100 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
5101 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5102 // OMP-DEfAULT: cond.true:
5103 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
5104 // OMP-DEfAULT: cond.false:
5105 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5106 // OMP-DEfAULT-NEXT: br label [[COND_END]]
5107 // OMP-DEfAULT: cond.end:
5108 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
5109 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
5110 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
5111 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
5112 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
5113 // OMP-DEfAULT: omp.inner.for.cond:
5114 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5115 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5116 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
5117 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5118 // OMP-DEfAULT: omp.inner.for.body:
5119 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5120 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
5121 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5122 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
5123 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
5124 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 118
5125 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
5126 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
5127 // OMP-DEfAULT: omp.body.continue:
5128 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
5129 // OMP-DEfAULT: omp.inner.for.inc:
5130 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5131 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
5132 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
5133 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
5134 // OMP-DEfAULT: omp.inner.for.end:
5135 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
5136 // OMP-DEfAULT: omp.loop.exit:
5137 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
5138 // OMP-DEfAULT-NEXT: ret void
5141 // OMP-DEfAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.18
5142 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
5143 // OMP-DEfAULT-NEXT: entry:
5144 // OMP-DEfAULT-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
5145 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
5146 // OMP-DEfAULT-NEXT: ret void
5149 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC1Ev
5150 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
5151 // OMP-DEfAULT-NEXT: entry:
5152 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5153 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5154 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5155 // OMP-DEfAULT-NEXT: call void @_ZN2STILi1000EEC2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]])
5156 // OMP-DEfAULT-NEXT: ret void
5159 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EED1Ev
5160 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
5161 // OMP-DEfAULT-NEXT: entry:
5162 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5163 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5164 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5165 // OMP-DEfAULT-NEXT: call void @_ZN2STILi1000EED2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]]) #[[ATTR2]]
5166 // OMP-DEfAULT-NEXT: ret void
5169 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC2Ev
5170 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
5171 // OMP-DEfAULT-NEXT: entry:
5172 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5173 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5174 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5175 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
5176 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
5177 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
5178 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
5179 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5180 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5181 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5182 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5183 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5184 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5185 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
5186 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
5187 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5188 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5189 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5190 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
5191 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5192 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
5193 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5194 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5195 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
5196 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
5197 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
5198 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
5199 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
5200 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
5201 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
5202 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
5203 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
5204 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.19, ptr [[TMP13]], align 4
5205 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
5206 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.20, ptr [[TMP14]], align 4
5207 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
5208 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
5209 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
5210 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
5211 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
5212 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
5213 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
5214 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
5215 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
5216 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
5217 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
5218 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
5219 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
5220 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
5221 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218.region_id, ptr [[KERNEL_ARGS]])
5222 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
5223 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5224 // OMP-DEfAULT: omp_offload.failed:
5225 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218(i32 [[TMP3]]) #[[ATTR2]]
5226 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
5227 // OMP-DEfAULT: omp_offload.cont:
5228 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
5229 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
5230 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
5231 // OMP-DEfAULT-NEXT: ret void
5234 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218
5235 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
5236 // OMP-DEfAULT-NEXT: entry:
5237 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5238 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5239 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5240 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
5241 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
5242 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
5243 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218.omp_outlined, i32 [[TMP1]])
5244 // OMP-DEfAULT-NEXT: ret void
5247 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218.omp_outlined
5248 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
5249 // OMP-DEfAULT-NEXT: entry:
5250 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
5251 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
5252 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5253 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
5254 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
5255 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
5256 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
5257 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5258 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5259 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
5260 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
5261 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
5262 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5263 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
5264 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
5265 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
5266 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
5267 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
5268 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5269 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
5270 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5271 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
5272 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5273 // OMP-DEfAULT: cond.true:
5274 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
5275 // OMP-DEfAULT: cond.false:
5276 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5277 // OMP-DEfAULT-NEXT: br label [[COND_END]]
5278 // OMP-DEfAULT: cond.end:
5279 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
5280 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
5281 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
5282 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
5283 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
5284 // OMP-DEfAULT: omp.inner.for.cond:
5285 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5286 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5287 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
5288 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5289 // OMP-DEfAULT: omp.inner.for.body:
5290 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5291 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
5292 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5293 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
5294 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
5295 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1017
5296 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
5297 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
5298 // OMP-DEfAULT: omp.body.continue:
5299 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
5300 // OMP-DEfAULT: omp.inner.for.inc:
5301 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5302 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
5303 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
5304 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
5305 // OMP-DEfAULT: omp.inner.for.end:
5306 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
5307 // OMP-DEfAULT: omp.loop.exit:
5308 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
5309 // OMP-DEfAULT-NEXT: ret void
5312 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EED2Ev
5313 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
5314 // OMP-DEfAULT-NEXT: entry:
5315 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5316 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5317 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5318 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
5319 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
5320 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
5321 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
5322 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5323 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5324 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5325 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5326 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5327 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5328 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
5329 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
5330 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5331 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5332 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5333 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
5334 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5335 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
5336 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5337 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5338 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
5339 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
5340 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
5341 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
5342 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
5343 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
5344 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
5345 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
5346 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
5347 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.21, ptr [[TMP13]], align 4
5348 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
5349 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.22, ptr [[TMP14]], align 4
5350 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
5351 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
5352 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
5353 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
5354 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
5355 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
5356 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
5357 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
5358 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
5359 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
5360 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
5361 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
5362 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
5363 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
5364 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225.region_id, ptr [[KERNEL_ARGS]])
5365 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
5366 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5367 // OMP-DEfAULT: omp_offload.failed:
5368 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225(i32 [[TMP3]]) #[[ATTR2]]
5369 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
5370 // OMP-DEfAULT: omp_offload.cont:
5371 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
5372 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
5373 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
5374 // OMP-DEfAULT-NEXT: ret void
5377 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225
5378 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
5379 // OMP-DEfAULT-NEXT: entry:
5380 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5381 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5382 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5383 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
5384 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
5385 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
5386 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225.omp_outlined, i32 [[TMP1]])
5387 // OMP-DEfAULT-NEXT: ret void
5390 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225.omp_outlined
5391 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
5392 // OMP-DEfAULT-NEXT: entry:
5393 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
5394 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
5395 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5396 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
5397 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
5398 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
5399 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
5400 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5401 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5402 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
5403 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
5404 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
5405 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5406 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
5407 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
5408 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
5409 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
5410 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
5411 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5412 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
5413 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5414 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
5415 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5416 // OMP-DEfAULT: cond.true:
5417 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
5418 // OMP-DEfAULT: cond.false:
5419 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5420 // OMP-DEfAULT-NEXT: br label [[COND_END]]
5421 // OMP-DEfAULT: cond.end:
5422 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
5423 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
5424 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
5425 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
5426 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
5427 // OMP-DEfAULT: omp.inner.for.cond:
5428 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5429 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5430 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
5431 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5432 // OMP-DEfAULT: omp.inner.for.body:
5433 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5434 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
5435 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5436 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
5437 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
5438 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1018
5439 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
5440 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
5441 // OMP-DEfAULT: omp.body.continue:
5442 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
5443 // OMP-DEfAULT: omp.inner.for.inc:
5444 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5445 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
5446 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
5447 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
5448 // OMP-DEfAULT: omp.inner.for.end:
5449 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
5450 // OMP-DEfAULT: omp.loop.exit:
5451 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
5452 // OMP-DEfAULT-NEXT: ret void
5455 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_Z3bari
5456 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] {
5457 // OMP-DEfAULT-NEXT: entry:
5458 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5459 // OMP-DEfAULT-NEXT: [[R:%.*]] = alloca i32, align 4
5460 // OMP-DEfAULT-NEXT: [[R_CASTED:%.*]] = alloca i32, align 4
5461 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
5462 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
5463 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
5464 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
5465 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5466 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
5467 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[R]], align 4
5468 // OMP-DEfAULT-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
5469 // OMP-DEfAULT-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @a2)
5470 // OMP-DEfAULT-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b1)
5471 // OMP-DEfAULT-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b2)
5472 // OMP-DEfAULT-NEXT: call void @_ZN2SC3fooEv(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
5473 // OMP-DEfAULT-NEXT: call void @_ZN2SD3fooEv(ptr noundef nonnull align 4 dereferenceable(128) @d1)
5474 // OMP-DEfAULT-NEXT: call void @_ZN2SE3fooEv(ptr noundef nonnull align 4 dereferenceable(256) @e1)
5475 // OMP-DEfAULT-NEXT: call void @_ZN2STILi100EE3fooEv(ptr noundef nonnull align 4 dereferenceable(912) @t1)
5476 // OMP-DEfAULT-NEXT: call void @_ZN2STILi1000EE3fooEv(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
5477 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[R]], align 4
5478 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[R_CASTED]], align 4
5479 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[R_CASTED]], align 4
5480 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5481 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[TMP3]], align 4
5482 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5483 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[TMP4]], align 4
5484 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5485 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP5]], align 4
5486 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5487 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5488 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
5489 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP8]], align 4
5490 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
5491 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP9]], align 4
5492 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
5493 // OMP-DEfAULT-NEXT: store ptr [[TMP6]], ptr [[TMP10]], align 4
5494 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
5495 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
5496 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
5497 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.23, ptr [[TMP12]], align 4
5498 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
5499 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.24, ptr [[TMP13]], align 4
5500 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
5501 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP14]], align 4
5502 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
5503 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
5504 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
5505 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP16]], align 8
5506 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
5507 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
5508 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
5509 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP18]], align 4
5510 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
5511 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP19]], align 4
5512 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
5513 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP20]], align 4
5514 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267.region_id, ptr [[KERNEL_ARGS]])
5515 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0
5516 // OMP-DEfAULT-NEXT: br i1 [[TMP22]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5517 // OMP-DEfAULT: omp_offload.failed:
5518 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267(i32 [[TMP2]]) #[[ATTR2]]
5519 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
5520 // OMP-DEfAULT: omp_offload.cont:
5521 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = load i32, ptr [[R]], align 4
5522 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load ptr, ptr @R, align 4
5523 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
5524 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP23]], [[TMP25]]
5525 // OMP-DEfAULT-NEXT: ret i32 [[ADD]]
5528 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SA3fooEv
5529 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) #[[ATTR1]] comdat align 2 {
5530 // OMP-DEfAULT-NEXT: entry:
5531 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5532 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5533 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5534 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5535 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5536 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5537 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5538 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5539 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
5540 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
5541 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
5542 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
5543 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5544 // OMP-DEfAULT-NEXT: ret void
5547 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SB3fooEv
5548 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) #[[ATTR1]] comdat align 2 {
5549 // OMP-DEfAULT-NEXT: entry:
5550 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5551 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5552 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5553 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
5554 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
5555 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
5556 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
5557 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5558 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5559 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5560 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5561 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5562 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5563 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
5564 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
5565 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5566 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5567 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5568 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
5569 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5570 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
5571 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5572 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5573 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
5574 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
5575 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
5576 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
5577 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
5578 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
5579 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
5580 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
5581 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
5582 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.25, ptr [[TMP13]], align 4
5583 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
5584 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.26, ptr [[TMP14]], align 4
5585 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
5586 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
5587 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
5588 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
5589 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
5590 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
5591 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
5592 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
5593 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
5594 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
5595 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
5596 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
5597 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
5598 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
5599 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122.region_id, ptr [[KERNEL_ARGS]])
5600 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
5601 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5602 // OMP-DEfAULT: omp_offload.failed:
5603 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122(i32 [[TMP3]]) #[[ATTR2]]
5604 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
5605 // OMP-DEfAULT: omp_offload.cont:
5606 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
5607 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
5608 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
5609 // OMP-DEfAULT-NEXT: ret void
5612 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SC3fooEv
5613 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) #[[ATTR1]] comdat align 2 {
5614 // OMP-DEfAULT-NEXT: entry:
5615 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5616 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5617 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5618 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5619 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5620 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5621 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5622 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5623 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 7
5624 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
5625 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
5626 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
5627 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5628 // OMP-DEfAULT-NEXT: ret void
5631 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SD3fooEv
5632 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) #[[ATTR1]] comdat align 2 {
5633 // OMP-DEfAULT-NEXT: entry:
5634 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5635 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5636 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5637 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5638 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5639 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5640 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5641 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5642 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 10
5643 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
5644 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
5645 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 4
5646 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5647 // OMP-DEfAULT-NEXT: ret void
5650 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2SE3fooEv
5651 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) #[[ATTR1]] comdat align 2 {
5652 // OMP-DEfAULT-NEXT: entry:
5653 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5654 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5655 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5656 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5657 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5658 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5659 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5660 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5661 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5662 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
5663 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
5664 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185(i32 [[TMP3]]) #[[ATTR2]]
5665 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
5666 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 4
5667 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
5668 // OMP-DEfAULT-NEXT: ret void
5671 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EE3fooEv
5672 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) #[[ATTR1]] comdat align 2 {
5673 // OMP-DEfAULT-NEXT: entry:
5674 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5675 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5676 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5677 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
5678 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
5679 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
5680 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
5681 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5682 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5683 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5684 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5685 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5686 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5687 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
5688 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
5689 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5690 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5691 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5692 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
5693 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5694 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
5695 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5696 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5697 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
5698 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
5699 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
5700 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
5701 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
5702 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
5703 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
5704 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
5705 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
5706 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.27, ptr [[TMP13]], align 4
5707 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
5708 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.28, ptr [[TMP14]], align 4
5709 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
5710 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
5711 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
5712 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
5713 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
5714 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
5715 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
5716 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
5717 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
5718 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
5719 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
5720 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
5721 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
5722 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
5723 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211.region_id, ptr [[KERNEL_ARGS]])
5724 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
5725 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5726 // OMP-DEfAULT: omp_offload.failed:
5727 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211(i32 [[TMP3]]) #[[ATTR2]]
5728 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
5729 // OMP-DEfAULT: omp_offload.cont:
5730 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
5731 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
5732 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
5733 // OMP-DEfAULT-NEXT: ret void
5736 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EE3fooEv
5737 // OMP-DEfAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) #[[ATTR1]] comdat align 2 {
5738 // OMP-DEfAULT-NEXT: entry:
5739 // OMP-DEfAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 4
5740 // OMP-DEfAULT-NEXT: [[A:%.*]] = alloca i32, align 4
5741 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5742 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x ptr], align 4
5743 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x ptr], align 4
5744 // OMP-DEfAULT-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x ptr], align 4
5745 // OMP-DEfAULT-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8
5746 // OMP-DEfAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 4
5747 // OMP-DEfAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 4
5748 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 4
5749 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5750 // OMP-DEfAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
5751 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
5752 // OMP-DEfAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
5753 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A_CASTED]], align 4
5754 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5755 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
5756 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5757 // OMP-DEfAULT-NEXT: store i32 [[TMP3]], ptr [[TMP5]], align 4
5758 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
5759 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP6]], align 4
5760 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
5761 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOFFLOAD_PTRS]], i32 0, i32 0
5762 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 0
5763 // OMP-DEfAULT-NEXT: store i32 3, ptr [[TMP9]], align 4
5764 // OMP-DEfAULT-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 1
5765 // OMP-DEfAULT-NEXT: store i32 1, ptr [[TMP10]], align 4
5766 // OMP-DEfAULT-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 2
5767 // OMP-DEfAULT-NEXT: store ptr [[TMP7]], ptr [[TMP11]], align 4
5768 // OMP-DEfAULT-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 3
5769 // OMP-DEfAULT-NEXT: store ptr [[TMP8]], ptr [[TMP12]], align 4
5770 // OMP-DEfAULT-NEXT: [[TMP13:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 4
5771 // OMP-DEfAULT-NEXT: store ptr @.offload_sizes.29, ptr [[TMP13]], align 4
5772 // OMP-DEfAULT-NEXT: [[TMP14:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 5
5773 // OMP-DEfAULT-NEXT: store ptr @.offload_maptypes.30, ptr [[TMP14]], align 4
5774 // OMP-DEfAULT-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 6
5775 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP15]], align 4
5776 // OMP-DEfAULT-NEXT: [[TMP16:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 7
5777 // OMP-DEfAULT-NEXT: store ptr null, ptr [[TMP16]], align 4
5778 // OMP-DEfAULT-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 8
5779 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP17]], align 8
5780 // OMP-DEfAULT-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 9
5781 // OMP-DEfAULT-NEXT: store i64 0, ptr [[TMP18]], align 8
5782 // OMP-DEfAULT-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 10
5783 // OMP-DEfAULT-NEXT: store [3 x i32] [i32 1, i32 0, i32 0], ptr [[TMP19]], align 4
5784 // OMP-DEfAULT-NEXT: [[TMP20:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 11
5785 // OMP-DEfAULT-NEXT: store [3 x i32] zeroinitializer, ptr [[TMP20]], align 4
5786 // OMP-DEfAULT-NEXT: [[TMP21:%.*]] = getelementptr inbounds nuw [[STRUCT___TGT_KERNEL_ARGUMENTS]], ptr [[KERNEL_ARGS]], i32 0, i32 12
5787 // OMP-DEfAULT-NEXT: store i32 0, ptr [[TMP21]], align 4
5788 // OMP-DEfAULT-NEXT: [[TMP22:%.*]] = call i32 @__tgt_target_kernel(ptr @[[GLOB2]], i64 -1, i32 1, i32 0, ptr @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211.region_id, ptr [[KERNEL_ARGS]])
5789 // OMP-DEfAULT-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0
5790 // OMP-DEfAULT-NEXT: br i1 [[TMP23]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
5791 // OMP-DEfAULT: omp_offload.failed:
5792 // OMP-DEfAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211(i32 [[TMP3]]) #[[ATTR2]]
5793 // OMP-DEfAULT-NEXT: br label [[OMP_OFFLOAD_CONT]]
5794 // OMP-DEfAULT: omp_offload.cont:
5795 // OMP-DEfAULT-NEXT: [[TMP24:%.*]] = load i32, ptr [[A]], align 4
5796 // OMP-DEfAULT-NEXT: [[TMP25:%.*]] = load ptr, ptr @R, align 4
5797 // OMP-DEfAULT-NEXT: store i32 [[TMP24]], ptr [[TMP25]], align 4
5798 // OMP-DEfAULT-NEXT: ret void
5801 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267
5802 // OMP-DEfAULT-SAME: (i32 noundef [[R:%.*]]) #[[ATTR3]] {
5803 // OMP-DEfAULT-NEXT: entry:
5804 // OMP-DEfAULT-NEXT: [[R_ADDR:%.*]] = alloca i32, align 4
5805 // OMP-DEfAULT-NEXT: [[R_CASTED:%.*]] = alloca i32, align 4
5806 // OMP-DEfAULT-NEXT: store i32 [[R]], ptr [[R_ADDR]], align 4
5807 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[R_ADDR]], align 4
5808 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[R_CASTED]], align 4
5809 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[R_CASTED]], align 4
5810 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267.omp_outlined, i32 [[TMP1]])
5811 // OMP-DEfAULT-NEXT: ret void
5814 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267.omp_outlined
5815 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[R:%.*]]) #[[ATTR3]] {
5816 // OMP-DEfAULT-NEXT: entry:
5817 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
5818 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
5819 // OMP-DEfAULT-NEXT: [[R_ADDR:%.*]] = alloca i32, align 4
5820 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
5821 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
5822 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
5823 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
5824 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5825 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5826 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
5827 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
5828 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
5829 // OMP-DEfAULT-NEXT: store i32 [[R]], ptr [[R_ADDR]], align 4
5830 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
5831 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
5832 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
5833 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
5834 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
5835 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5836 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
5837 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5838 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
5839 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5840 // OMP-DEfAULT: cond.true:
5841 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
5842 // OMP-DEfAULT: cond.false:
5843 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5844 // OMP-DEfAULT-NEXT: br label [[COND_END]]
5845 // OMP-DEfAULT: cond.end:
5846 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
5847 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
5848 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
5849 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
5850 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
5851 // OMP-DEfAULT: omp.inner.for.cond:
5852 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5853 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5854 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
5855 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5856 // OMP-DEfAULT: omp.inner.for.body:
5857 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5858 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
5859 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5860 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
5861 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[R_ADDR]], align 4
5862 // OMP-DEfAULT-NEXT: [[INC:%.*]] = add nsw i32 [[TMP8]], 1
5863 // OMP-DEfAULT-NEXT: store i32 [[INC]], ptr [[R_ADDR]], align 4
5864 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
5865 // OMP-DEfAULT: omp.body.continue:
5866 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
5867 // OMP-DEfAULT: omp.inner.for.inc:
5868 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5869 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], 1
5870 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4
5871 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
5872 // OMP-DEfAULT: omp.inner.for.end:
5873 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
5874 // OMP-DEfAULT: omp.loop.exit:
5875 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
5876 // OMP-DEfAULT-NEXT: ret void
5879 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122
5880 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
5881 // OMP-DEfAULT-NEXT: entry:
5882 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5883 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5884 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5885 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
5886 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
5887 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
5888 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122.omp_outlined, i32 [[TMP1]])
5889 // OMP-DEfAULT-NEXT: ret void
5892 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122.omp_outlined
5893 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
5894 // OMP-DEfAULT-NEXT: entry:
5895 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
5896 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
5897 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5898 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
5899 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
5900 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
5901 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
5902 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5903 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5904 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
5905 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
5906 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
5907 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5908 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
5909 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
5910 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
5911 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
5912 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
5913 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5914 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
5915 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5916 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
5917 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5918 // OMP-DEfAULT: cond.true:
5919 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
5920 // OMP-DEfAULT: cond.false:
5921 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5922 // OMP-DEfAULT-NEXT: br label [[COND_END]]
5923 // OMP-DEfAULT: cond.end:
5924 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
5925 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
5926 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
5927 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
5928 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
5929 // OMP-DEfAULT: omp.inner.for.cond:
5930 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5931 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5932 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
5933 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
5934 // OMP-DEfAULT: omp.inner.for.body:
5935 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5936 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
5937 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
5938 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
5939 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
5940 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 4
5941 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
5942 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
5943 // OMP-DEfAULT: omp.body.continue:
5944 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
5945 // OMP-DEfAULT: omp.inner.for.inc:
5946 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
5947 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
5948 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
5949 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
5950 // OMP-DEfAULT: omp.inner.for.end:
5951 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
5952 // OMP-DEfAULT: omp.loop.exit:
5953 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
5954 // OMP-DEfAULT-NEXT: ret void
5957 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185
5958 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
5959 // OMP-DEfAULT-NEXT: entry:
5960 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5961 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
5962 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5963 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
5964 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
5965 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
5966 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185.omp_outlined, i32 [[TMP1]])
5967 // OMP-DEfAULT-NEXT: ret void
5970 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185.omp_outlined
5971 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
5972 // OMP-DEfAULT-NEXT: entry:
5973 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
5974 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
5975 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
5976 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
5977 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
5978 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
5979 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
5980 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
5981 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
5982 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
5983 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
5984 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
5985 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
5986 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
5987 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
5988 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
5989 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
5990 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
5991 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
5992 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
5993 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
5994 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
5995 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
5996 // OMP-DEfAULT: cond.true:
5997 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
5998 // OMP-DEfAULT: cond.false:
5999 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6000 // OMP-DEfAULT-NEXT: br label [[COND_END]]
6001 // OMP-DEfAULT: cond.end:
6002 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
6003 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
6004 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
6005 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
6006 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
6007 // OMP-DEfAULT: omp.inner.for.cond:
6008 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6009 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6010 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
6011 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6012 // OMP-DEfAULT: omp.inner.for.body:
6013 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6014 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
6015 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6016 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
6017 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
6018 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 13
6019 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
6020 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
6021 // OMP-DEfAULT: omp.body.continue:
6022 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
6023 // OMP-DEfAULT: omp.inner.for.inc:
6024 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6025 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
6026 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
6027 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
6028 // OMP-DEfAULT: omp.inner.for.end:
6029 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
6030 // OMP-DEfAULT: omp.loop.exit:
6031 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
6032 // OMP-DEfAULT-NEXT: ret void
6035 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211
6036 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
6037 // OMP-DEfAULT-NEXT: entry:
6038 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
6039 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
6040 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
6041 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
6042 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
6043 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
6044 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211.omp_outlined, i32 [[TMP1]])
6045 // OMP-DEfAULT-NEXT: ret void
6048 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211.omp_outlined
6049 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
6050 // OMP-DEfAULT-NEXT: entry:
6051 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
6052 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
6053 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
6054 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
6055 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
6056 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
6057 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
6058 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6059 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6060 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
6061 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
6062 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
6063 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
6064 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
6065 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
6066 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
6067 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
6068 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
6069 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6070 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
6071 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6072 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
6073 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6074 // OMP-DEfAULT: cond.true:
6075 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
6076 // OMP-DEfAULT: cond.false:
6077 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6078 // OMP-DEfAULT-NEXT: br label [[COND_END]]
6079 // OMP-DEfAULT: cond.end:
6080 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
6081 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
6082 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
6083 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
6084 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
6085 // OMP-DEfAULT: omp.inner.for.cond:
6086 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6087 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6088 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
6089 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6090 // OMP-DEfAULT: omp.inner.for.body:
6091 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6092 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
6093 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6094 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
6095 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
6096 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 116
6097 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
6098 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
6099 // OMP-DEfAULT: omp.body.continue:
6100 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
6101 // OMP-DEfAULT: omp.inner.for.inc:
6102 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6103 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
6104 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
6105 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
6106 // OMP-DEfAULT: omp.inner.for.end:
6107 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
6108 // OMP-DEfAULT: omp.loop.exit:
6109 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
6110 // OMP-DEfAULT-NEXT: ret void
6113 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211
6114 // OMP-DEfAULT-SAME: (i32 noundef [[A:%.*]]) #[[ATTR3]] {
6115 // OMP-DEfAULT-NEXT: entry:
6116 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
6117 // OMP-DEfAULT-NEXT: [[A_CASTED:%.*]] = alloca i32, align 4
6118 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
6119 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
6120 // OMP-DEfAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
6121 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A_CASTED]], align 4
6122 // OMP-DEfAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211.omp_outlined, i32 [[TMP1]])
6123 // OMP-DEfAULT-NEXT: ret void
6126 // OMP-DEfAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211.omp_outlined
6127 // OMP-DEfAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]]) #[[ATTR3]] {
6128 // OMP-DEfAULT-NEXT: entry:
6129 // OMP-DEfAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
6130 // OMP-DEfAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
6131 // OMP-DEfAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
6132 // OMP-DEfAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
6133 // OMP-DEfAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
6134 // OMP-DEfAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
6135 // OMP-DEfAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
6136 // OMP-DEfAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6137 // OMP-DEfAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6138 // OMP-DEfAULT-NEXT: [[I:%.*]] = alloca i32, align 4
6139 // OMP-DEfAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
6140 // OMP-DEfAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
6141 // OMP-DEfAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
6142 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
6143 // OMP-DEfAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
6144 // OMP-DEfAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
6145 // OMP-DEfAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
6146 // OMP-DEfAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
6147 // OMP-DEfAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6148 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
6149 // OMP-DEfAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6150 // OMP-DEfAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
6151 // OMP-DEfAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6152 // OMP-DEfAULT: cond.true:
6153 // OMP-DEfAULT-NEXT: br label [[COND_END:%.*]]
6154 // OMP-DEfAULT: cond.false:
6155 // OMP-DEfAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6156 // OMP-DEfAULT-NEXT: br label [[COND_END]]
6157 // OMP-DEfAULT: cond.end:
6158 // OMP-DEfAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
6159 // OMP-DEfAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
6160 // OMP-DEfAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
6161 // OMP-DEfAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
6162 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
6163 // OMP-DEfAULT: omp.inner.for.cond:
6164 // OMP-DEfAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6165 // OMP-DEfAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6166 // OMP-DEfAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
6167 // OMP-DEfAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6168 // OMP-DEfAULT: omp.inner.for.body:
6169 // OMP-DEfAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6170 // OMP-DEfAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
6171 // OMP-DEfAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6172 // OMP-DEfAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
6173 // OMP-DEfAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
6174 // OMP-DEfAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1016
6175 // OMP-DEfAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
6176 // OMP-DEfAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
6177 // OMP-DEfAULT: omp.body.continue:
6178 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
6179 // OMP-DEfAULT: omp.inner.for.inc:
6180 // OMP-DEfAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6181 // OMP-DEfAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
6182 // OMP-DEfAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
6183 // OMP-DEfAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
6184 // OMP-DEfAULT: omp.inner.for.end:
6185 // OMP-DEfAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
6186 // OMP-DEfAULT: omp.loop.exit:
6187 // OMP-DEfAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
6188 // OMP-DEfAULT-NEXT: ret void
6191 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
6192 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
6193 // OMP-DEfAULT-NEXT: entry:
6194 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init()
6195 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.2()
6196 // OMP-DEfAULT-NEXT: ret void
6199 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
6200 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
6201 // OMP-DEfAULT-NEXT: entry:
6202 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.3()
6203 // OMP-DEfAULT-NEXT: ret void
6206 // OMP-DEfAULT-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
6207 // OMP-DEfAULT-SAME: () #[[ATTR0]] {
6208 // OMP-DEfAULT-NEXT: entry:
6209 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.1()
6210 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.4()
6211 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.5()
6212 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.8()
6213 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.13()
6214 // OMP-DEfAULT-NEXT: call void @__cxx_global_var_init.18()
6215 // OMP-DEfAULT-NEXT: ret void
6664 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init
6665 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0:[0-9]+]] {
6666 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6667 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
6668 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @_ZL2a1, ptr @__dso_handle) #[[ATTR2:[0-9]+]]
6669 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6672 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SAC1Ev
6673 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat {
6674 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6675 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6676 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6677 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6678 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SAC2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]])
6679 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6682 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SAD1Ev
6683 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6684 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6685 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6686 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6687 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6688 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SAD2Ev(ptr noundef nonnull align 4 dereferenceable(16) [[THIS1]]) #[[ATTR2]]
6689 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6692 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SAC2Ev
6693 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6694 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6695 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6696 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
6697 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6698 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6699 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
6700 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6701 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
6702 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
6703 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 2
6704 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
6705 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
6706 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
6707 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
6708 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6711 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SAD2Ev
6712 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6713 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6714 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6715 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
6716 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6717 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6718 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
6719 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6720 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
6721 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
6722 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 3
6723 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
6724 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
6725 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
6726 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
6727 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6730 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.1
6731 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
6732 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6733 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SAC1Ev(ptr noundef nonnull align 4 dereferenceable(16) @a2)
6734 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SAD1Ev, ptr @a2, ptr @__dso_handle) #[[ATTR2]]
6735 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6738 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.2
6739 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
6740 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6741 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b1)
6742 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b1, ptr @__dso_handle) #[[ATTR2]]
6743 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6746 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SBC1Ev
6747 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6748 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6749 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6750 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6751 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6752 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SBC2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]])
6753 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6756 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SBD1Ev
6757 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6758 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6759 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6760 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6761 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6762 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SBD2Ev(ptr noundef nonnull align 4 dereferenceable(32) [[THIS1]]) #[[ATTR2]]
6763 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6766 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SBC2Ev
6767 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6768 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6769 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6770 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
6771 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6772 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6773 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
6774 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6775 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
6776 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
6777 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 5
6778 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
6779 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
6780 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
6781 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
6782 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6785 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SBD2Ev
6786 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6787 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6788 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6789 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
6790 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6791 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6792 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
6793 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6794 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
6795 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
6796 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 6
6797 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
6798 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
6799 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
6800 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
6801 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6804 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.3
6805 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
6806 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6807 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SBC1Ev(ptr noundef nonnull align 4 dereferenceable(32) @b2)
6808 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SBD1Ev, ptr @b2, ptr @__dso_handle) #[[ATTR2]]
6809 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6812 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.4
6813 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
6814 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6815 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SCC1Ev(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
6816 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SCD1Ev, ptr @_ZL2c1, ptr @__dso_handle) #[[ATTR2]]
6817 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6820 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SCC1Ev
6821 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6822 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6823 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6824 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6825 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6826 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SCC2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]])
6827 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6830 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SCD1Ev
6831 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6832 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6833 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6834 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6835 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6836 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SCD2Ev(ptr noundef nonnull align 4 dereferenceable(64) [[THIS1]]) #[[ATTR2]]
6837 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6840 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SCC2Ev
6841 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6842 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6843 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6844 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
6845 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
6846 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6847 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6848 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
6849 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6850 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
6851 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
6852 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
6853 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
6854 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148(i64 [[TMP3]]) #[[ATTR2]]
6855 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
6856 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
6857 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
6858 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6861 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148
6862 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3:[0-9]+]] {
6863 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6864 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
6865 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
6866 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
6867 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
6868 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
6869 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
6870 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2:[0-9]+]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148.omp_outlined, i64 [[TMP1]])
6871 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6874 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SCC1Ev_l148.omp_outlined
6875 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
6876 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6877 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
6878 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
6879 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
6880 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
6881 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
6882 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
6883 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
6884 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
6885 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
6886 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
6887 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
6888 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
6889 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
6890 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
6891 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
6892 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
6893 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
6894 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
6895 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6896 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
6897 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6898 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
6899 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
6900 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
6901 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
6902 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
6903 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6904 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
6905 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
6906 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
6907 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
6908 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
6909 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
6910 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
6911 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
6912 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6913 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
6914 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
6915 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
6916 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
6917 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6918 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
6919 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
6920 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
6921 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
6922 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 8
6923 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
6924 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
6925 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
6926 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
6927 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
6928 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
6929 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
6930 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
6931 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
6932 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
6933 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
6934 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
6935 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
6936 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6939 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SCD2Ev
6940 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6941 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6942 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6943 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
6944 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6945 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6946 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
6947 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6948 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
6949 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
6950 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 9
6951 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
6952 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
6953 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
6954 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
6955 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6958 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.5
6959 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
6960 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6961 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SDC1Ev(ptr noundef nonnull align 4 dereferenceable(128) @d1)
6962 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SDD1Ev, ptr @d1, ptr @__dso_handle) #[[ATTR2]]
6963 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6966 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SDC1Ev
6967 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6968 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6969 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6970 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6971 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6972 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SDC2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]])
6973 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6976 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SDD1Ev
6977 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6978 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6979 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6980 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6981 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6982 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SDD2Ev(ptr noundef nonnull align 4 dereferenceable(128) [[THIS1]]) #[[ATTR2]]
6983 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
6986 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SDC2Ev
6987 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
6988 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
6989 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
6990 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
6991 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
6992 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
6993 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
6994 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
6995 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
6996 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
6997 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 11
6998 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
6999 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
7000 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
7001 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
7002 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7005 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SDD2Ev
7006 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7007 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7008 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7009 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7010 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7011 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7012 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7013 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7014 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7015 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7016 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7017 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7018 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7019 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174(i64 [[TMP3]]) #[[ATTR2]]
7020 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7021 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7022 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7023 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7026 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174
7027 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
7028 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7029 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7030 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7031 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7032 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7033 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
7034 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
7035 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174.omp_outlined, i64 [[TMP1]])
7036 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7039 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SDD1Ev_l174.omp_outlined
7040 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
7041 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7042 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7043 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7044 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7045 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7046 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7047 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7048 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7049 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7050 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7051 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7052 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7053 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7054 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7055 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7056 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7057 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7058 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7059 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7060 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7061 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7062 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7063 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7064 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7065 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7066 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7067 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7068 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7069 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7070 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7071 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7072 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7073 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
7074 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
7075 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
7076 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
7077 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7078 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7079 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
7080 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7081 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
7082 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7083 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
7084 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7085 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
7086 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
7087 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 12
7088 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
7089 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
7090 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
7091 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
7092 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
7093 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7094 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
7095 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
7096 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
7097 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
7098 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
7099 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
7100 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
7101 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7104 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.6
7105 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
7106 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7107 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SEC1Ev(ptr noundef nonnull align 4 dereferenceable(256) @e1)
7108 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2SED1Ev, ptr @e1, ptr @__dso_handle) #[[ATTR2]]
7109 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7112 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SEC1Ev
7113 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7114 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7115 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7116 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7117 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7118 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SEC2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]])
7119 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7122 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SED1Ev
7123 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7124 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7125 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7126 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7127 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7128 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SED2Ev(ptr noundef nonnull align 4 dereferenceable(256) [[THIS1]]) #[[ATTR2]]
7129 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7132 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SEC2Ev
7133 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7134 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7135 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7136 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7137 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7138 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7139 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7140 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7141 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7142 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7143 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7144 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7145 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7146 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192(i64 [[TMP3]]) #[[ATTR2]]
7147 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7148 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7149 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7150 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7153 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192
7154 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
7155 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7156 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7157 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7158 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7159 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7160 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
7161 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
7162 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192.omp_outlined, i64 [[TMP1]])
7163 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7166 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SEC1Ev_l192.omp_outlined
7167 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
7168 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7169 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7170 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7171 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7172 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7173 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7174 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7175 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7176 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7177 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7178 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7179 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7180 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7181 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7182 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7183 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7184 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7185 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7186 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7187 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7188 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7189 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7190 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7191 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7192 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7193 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7194 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7195 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7196 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7197 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7198 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7199 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7200 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
7201 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
7202 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
7203 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
7204 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7205 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7206 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
7207 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7208 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
7209 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7210 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
7211 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7212 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
7213 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
7214 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 14
7215 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
7216 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
7217 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
7218 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
7219 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
7220 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7221 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
7222 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
7223 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
7224 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
7225 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
7226 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
7227 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
7228 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7231 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SED2Ev
7232 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7233 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7234 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7235 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7236 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7237 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7238 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7239 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7240 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7241 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7242 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7243 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7244 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7245 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199(i64 [[TMP3]]) #[[ATTR2]]
7246 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7247 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7248 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7249 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7252 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199
7253 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
7254 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7255 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7256 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7257 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7258 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7259 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
7260 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
7261 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199.omp_outlined, i64 [[TMP1]])
7262 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7265 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SED1Ev_l199.omp_outlined
7266 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
7267 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7268 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7269 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7270 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7271 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7272 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7273 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7274 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7275 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7276 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7277 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7278 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7279 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7280 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7281 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7282 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7283 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7284 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7285 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7286 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7287 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7288 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7289 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7290 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7291 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7292 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7293 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7294 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7295 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7296 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7297 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7298 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7299 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
7300 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
7301 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
7302 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
7303 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7304 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7305 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
7306 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7307 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
7308 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7309 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
7310 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7311 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
7312 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
7313 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 15
7314 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
7315 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
7316 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
7317 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
7318 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
7319 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7320 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
7321 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
7322 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
7323 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
7324 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
7325 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
7326 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
7327 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7330 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.7
7331 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
7332 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7333 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi100EEC1Ev(ptr noundef nonnull align 4 dereferenceable(912) @t1)
7334 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi100EED1Ev, ptr @t1, ptr @__dso_handle) #[[ATTR2]]
7335 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7338 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EEC1Ev
7339 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7340 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7341 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7342 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7343 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7344 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi100EEC2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]])
7345 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7348 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EED1Ev
7349 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7350 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7351 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7352 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7353 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7354 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi100EED2Ev(ptr noundef nonnull align 4 dereferenceable(912) [[THIS1]]) #[[ATTR2]]
7355 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7358 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EEC2Ev
7359 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7360 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7361 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7362 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7363 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7364 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7365 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7366 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7367 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7368 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7369 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7370 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7371 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7372 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218(i64 [[TMP3]]) #[[ATTR2]]
7373 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7374 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7375 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7376 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7379 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218
7380 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
7381 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7382 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7383 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7384 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7385 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7386 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
7387 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
7388 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218.omp_outlined, i64 [[TMP1]])
7389 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7392 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EEC1Ev_l218.omp_outlined
7393 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
7394 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7395 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7396 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7397 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7398 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7399 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7400 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7401 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7402 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7403 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7404 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7405 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7406 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7407 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7408 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7409 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7410 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7411 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7412 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7413 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7414 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7415 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7416 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7417 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7418 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7419 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7420 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7421 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7422 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7423 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7424 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7425 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7426 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
7427 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
7428 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
7429 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
7430 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7431 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7432 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
7433 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7434 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
7435 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7436 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
7437 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7438 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
7439 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
7440 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 117
7441 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
7442 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
7443 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
7444 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
7445 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
7446 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7447 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
7448 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
7449 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
7450 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
7451 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
7452 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
7453 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
7454 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7457 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EED2Ev
7458 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7459 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7460 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7461 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7462 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7463 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7464 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7465 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7466 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7467 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7468 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7469 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7470 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7471 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225(i64 [[TMP3]]) #[[ATTR2]]
7472 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7473 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7474 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7475 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7478 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225
7479 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
7480 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7481 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7482 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7483 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7484 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7485 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
7486 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
7487 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225.omp_outlined, i64 [[TMP1]])
7488 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7491 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EED1Ev_l225.omp_outlined
7492 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
7493 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7494 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7495 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7496 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7497 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7498 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7499 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7500 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7501 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7502 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7503 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7504 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7505 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7506 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7507 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7508 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7509 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7510 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7511 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7512 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7513 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7514 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7515 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7516 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7517 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7518 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7519 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7520 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7521 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7522 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7523 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7524 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7525 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
7526 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
7527 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
7528 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
7529 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7530 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7531 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
7532 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7533 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
7534 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7535 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
7536 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7537 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
7538 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
7539 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 118
7540 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
7541 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
7542 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
7543 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
7544 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
7545 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7546 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
7547 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
7548 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
7549 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
7550 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
7551 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
7552 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
7553 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7556 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@__cxx_global_var_init.8
7557 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
7558 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7559 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi1000EEC1Ev(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
7560 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = call i32 @__cxa_atexit(ptr @_ZN2STILi1000EED1Ev, ptr @t2, ptr @__dso_handle) #[[ATTR2]]
7561 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7564 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC1Ev
7565 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7566 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7567 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7568 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7569 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7570 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi1000EEC2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]])
7571 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7574 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EED1Ev
7575 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7576 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7577 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7578 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7579 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7580 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi1000EED2Ev(ptr noundef nonnull align 4 dereferenceable(4512) [[THIS1]]) #[[ATTR2]]
7581 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7584 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EEC2Ev
7585 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7586 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7587 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7588 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7589 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7590 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7591 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7592 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7593 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7594 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7595 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7596 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7597 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7598 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218(i64 [[TMP3]]) #[[ATTR2]]
7599 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7600 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7601 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7602 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7605 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218
7606 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
7607 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7608 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7609 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7610 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7611 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7612 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
7613 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
7614 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218.omp_outlined, i64 [[TMP1]])
7615 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7618 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EEC1Ev_l218.omp_outlined
7619 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
7620 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7621 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7622 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7623 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7624 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7625 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7626 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7627 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7628 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7629 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7630 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7631 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7632 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7633 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7634 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7635 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7636 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7637 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7638 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7639 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7640 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7641 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7642 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7643 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7644 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7645 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7646 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7647 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7648 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7649 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7650 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7651 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7652 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
7653 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
7654 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
7655 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
7656 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7657 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7658 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
7659 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7660 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
7661 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7662 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
7663 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7664 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
7665 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
7666 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1017
7667 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
7668 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
7669 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
7670 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
7671 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
7672 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7673 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
7674 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
7675 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
7676 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
7677 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
7678 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
7679 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
7680 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7683 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EED2Ev
7684 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat {
7685 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7686 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7687 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7688 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7689 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7690 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7691 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7692 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7693 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7694 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7695 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7696 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7697 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225(i64 [[TMP3]]) #[[ATTR2]]
7698 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7699 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7700 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7701 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7704 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225
7705 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
7706 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7707 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7708 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7709 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7710 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7711 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
7712 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
7713 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225.omp_outlined, i64 [[TMP1]])
7714 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7717 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EED1Ev_l225.omp_outlined
7718 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
7719 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7720 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7721 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7722 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
7723 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7724 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7725 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7726 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7727 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7728 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7729 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7730 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7731 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7732 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
7733 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7734 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7735 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7736 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7737 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7738 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7739 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7740 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7741 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7742 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7743 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7744 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7745 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7746 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7747 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7748 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7749 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7750 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7751 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
7752 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
7753 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
7754 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
7755 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7756 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7757 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
7758 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
7759 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
7760 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7761 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
7762 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
7763 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
7764 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
7765 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1018
7766 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
7767 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
7768 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
7769 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
7770 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
7771 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
7772 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
7773 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
7774 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
7775 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
7776 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
7777 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
7778 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
7779 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7782 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_Z3bari
7783 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i32 noundef signext [[A:%.*]]) #[[ATTR1]] {
7784 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7785 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4
7786 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[R:%.*]] = alloca i32, align 4
7787 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[R_CASTED:%.*]] = alloca i64, align 8
7788 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4
7789 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
7790 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[R]], align 4
7791 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @_ZL2a1)
7792 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SA3fooEv(ptr noundef nonnull align 4 dereferenceable(16) @a2)
7793 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b1)
7794 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SB3fooEv(ptr noundef nonnull align 4 dereferenceable(32) @b2)
7795 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SC3fooEv(ptr noundef nonnull align 4 dereferenceable(64) @_ZL2c1)
7796 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SD3fooEv(ptr noundef nonnull align 4 dereferenceable(128) @d1)
7797 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2SE3fooEv(ptr noundef nonnull align 4 dereferenceable(256) @e1)
7798 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi100EE3fooEv(ptr noundef nonnull align 4 dereferenceable(912) @t1)
7799 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @_ZN2STILi1000EE3fooEv(ptr noundef nonnull align 4 dereferenceable(4512) @t2)
7800 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[R]], align 4
7801 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[R_CASTED]], align 4
7802 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i64, ptr [[R_CASTED]], align 8
7803 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267(i64 [[TMP2]]) #[[ATTR2]]
7804 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[R]], align 4
7805 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
7806 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4
7807 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], [[TMP5]]
7808 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret i32 [[ADD]]
7811 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SA3fooEv
7812 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(16) [[THIS:%.*]]) #[[ATTR1]] comdat {
7813 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7814 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7815 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7816 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7817 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7818 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7819 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7820 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7821 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7822 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 1
7823 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
7824 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
7825 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
7826 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
7827 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7830 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SB3fooEv
7831 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(32) [[THIS:%.*]]) #[[ATTR1]] comdat {
7832 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7833 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7834 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7835 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7836 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7837 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7838 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7839 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7840 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7841 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7842 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7843 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7844 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122(i64 [[TMP3]]) #[[ATTR2]]
7845 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7846 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7847 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7848 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7851 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SC3fooEv
7852 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(64) [[THIS:%.*]]) #[[ATTR1]] comdat {
7853 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7854 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7855 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7856 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7857 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7858 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7859 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7860 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7861 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7862 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 7
7863 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
7864 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
7865 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
7866 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
7867 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7870 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SD3fooEv
7871 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(128) [[THIS:%.*]]) #[[ATTR1]] comdat {
7872 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7873 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7874 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7875 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7876 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7877 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7878 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7879 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7880 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7881 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], 10
7882 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[A]], align 4
7883 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[A]], align 4
7884 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load ptr, ptr @R, align 8
7885 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP3]], ptr [[TMP4]], align 4
7886 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7889 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2SE3fooEv
7890 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(256) [[THIS:%.*]]) #[[ATTR1]] comdat {
7891 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7892 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7893 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7894 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7895 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7896 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7897 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7898 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7899 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7900 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7901 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7902 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7903 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185(i64 [[TMP3]]) #[[ATTR2]]
7904 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7905 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7906 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7907 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7910 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi100EE3fooEv
7911 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(912) [[THIS:%.*]]) #[[ATTR1]] comdat {
7912 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7913 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7914 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7915 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7916 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7917 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7918 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7919 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7920 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7921 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7922 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7923 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7924 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211(i64 [[TMP3]]) #[[ATTR2]]
7925 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7926 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7927 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7928 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7931 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_ZN2STILi1000EE3fooEv
7932 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noundef nonnull align 4 dereferenceable(4512) [[THIS:%.*]]) #[[ATTR1]] comdat {
7933 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7934 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
7935 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A:%.*]] = alloca i32, align 4
7936 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
7937 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
7938 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
7939 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr @R, align 8
7940 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7941 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP1]], ptr [[A]], align 4
7942 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4
7943 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP2]], ptr [[A_CASTED]], align 4
7944 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i64, ptr [[A_CASTED]], align 8
7945 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211(i64 [[TMP3]]) #[[ATTR2]]
7946 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
7947 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load ptr, ptr @R, align 8
7948 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4
7949 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7952 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267
7953 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[R:%.*]]) #[[ATTR3]] {
7954 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7955 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[R_ADDR:%.*]] = alloca i64, align 8
7956 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[R_CASTED:%.*]] = alloca i64, align 8
7957 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[R]], ptr [[R_ADDR]], align 8
7958 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[R_ADDR]], align 4
7959 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[R_CASTED]], align 4
7960 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[R_CASTED]], align 8
7961 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267.omp_outlined, i64 [[TMP1]])
7962 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
7965 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3bari_l267.omp_outlined
7966 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[R:%.*]]) #[[ATTR3]] {
7967 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
7968 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
7969 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
7970 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[R_ADDR:%.*]] = alloca i64, align 8
7971 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
7972 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
7973 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
7974 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
7975 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
7976 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
7977 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
7978 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
7979 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
7980 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[R]], ptr [[R_ADDR]], align 8
7981 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
7982 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
7983 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
7984 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
7985 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
7986 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
7987 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
7988 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7989 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
7990 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
7991 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
7992 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
7993 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
7994 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
7995 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
7996 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
7997 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
7998 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
7999 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
8000 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
8001 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
8002 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
8003 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8004 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8005 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
8006 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8007 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
8008 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8009 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
8010 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8011 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
8012 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[R_ADDR]], align 4
8013 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[INC:%.*]] = add nsw i32 [[TMP8]], 1
8014 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[INC]], ptr [[R_ADDR]], align 4
8015 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
8016 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
8017 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
8018 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
8019 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8020 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], 1
8021 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4
8022 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
8023 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
8024 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
8025 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
8026 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
8027 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8030 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122
8031 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
8032 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8033 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8034 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
8035 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8036 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
8037 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
8038 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
8039 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122.omp_outlined, i64 [[TMP1]])
8040 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8043 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SB3fooEv_l122.omp_outlined
8044 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
8045 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8046 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
8047 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
8048 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8049 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
8050 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
8051 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
8052 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
8053 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8054 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8055 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
8056 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
8057 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
8058 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8059 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
8060 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
8061 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
8062 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
8063 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
8064 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
8065 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
8066 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8067 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
8068 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8069 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
8070 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
8071 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
8072 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8073 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
8074 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
8075 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
8076 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
8077 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
8078 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
8079 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
8080 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
8081 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8082 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8083 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
8084 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8085 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
8086 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8087 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
8088 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8089 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
8090 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
8091 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 4
8092 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
8093 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
8094 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
8095 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
8096 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
8097 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8098 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
8099 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
8100 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
8101 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
8102 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
8103 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
8104 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
8105 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8108 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185
8109 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
8110 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8111 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8112 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
8113 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8114 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
8115 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
8116 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
8117 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185.omp_outlined, i64 [[TMP1]])
8118 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8121 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2SE3fooEv_l185.omp_outlined
8122 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
8123 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8124 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
8125 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
8126 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8127 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
8128 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
8129 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
8130 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
8131 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8132 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8133 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
8134 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
8135 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
8136 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8137 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
8138 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
8139 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
8140 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
8141 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
8142 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
8143 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
8144 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8145 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
8146 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8147 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
8148 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
8149 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
8150 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8151 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
8152 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
8153 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
8154 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
8155 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
8156 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
8157 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
8158 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
8159 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8160 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8161 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
8162 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8163 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
8164 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8165 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
8166 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8167 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
8168 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
8169 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 13
8170 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
8171 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
8172 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
8173 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
8174 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
8175 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8176 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
8177 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
8178 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
8179 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
8180 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
8181 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
8182 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
8183 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8186 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211
8187 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
8188 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8189 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8190 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
8191 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8192 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
8193 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
8194 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
8195 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211.omp_outlined, i64 [[TMP1]])
8196 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8199 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi100EE3fooEv_l211.omp_outlined
8200 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
8201 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8202 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
8203 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
8204 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8205 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
8206 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
8207 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
8208 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
8209 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8210 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8211 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
8212 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
8213 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
8214 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8215 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
8216 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
8217 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
8218 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
8219 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
8220 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
8221 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
8222 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8223 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
8224 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8225 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
8226 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
8227 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
8228 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8229 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
8230 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
8231 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
8232 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
8233 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
8234 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
8235 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
8236 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
8237 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8238 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8239 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
8240 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8241 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
8242 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8243 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
8244 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8245 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
8246 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
8247 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 116
8248 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
8249 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
8250 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
8251 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
8252 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
8253 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8254 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
8255 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
8256 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
8257 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
8258 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
8259 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
8260 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
8261 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8264 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211
8265 // CHECK-NTARGET-OMP-DEFAULT-SAME: (i64 noundef [[A:%.*]]) #[[ATTR3]] {
8266 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8267 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8268 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_CASTED:%.*]] = alloca i64, align 8
8269 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8270 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
8271 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP0]], ptr [[A_CASTED]], align 4
8272 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i64, ptr [[A_CASTED]], align 8
8273 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211.omp_outlined, i64 [[TMP1]])
8274 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8277 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2STILi1000EE3fooEv_l211.omp_outlined
8278 // CHECK-NTARGET-OMP-DEFAULT-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i64 noundef [[A:%.*]]) #[[ATTR3]] {
8279 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8280 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
8281 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
8282 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8
8283 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
8284 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP:%.*]] = alloca i32, align 4
8285 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
8286 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
8287 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
8288 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
8289 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[I:%.*]] = alloca i32, align 4
8290 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
8291 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
8292 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8
8293 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
8294 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 9, ptr [[DOTOMP_UB]], align 4
8295 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
8296 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
8297 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
8298 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
8299 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
8300 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8301 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 9
8302 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
8303 // CHECK-NTARGET-OMP-DEFAULT: cond.true:
8304 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END:%.*]]
8305 // CHECK-NTARGET-OMP-DEFAULT: cond.false:
8306 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8307 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[COND_END]]
8308 // CHECK-NTARGET-OMP-DEFAULT: cond.end:
8309 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
8310 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
8311 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
8312 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
8313 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
8314 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.cond:
8315 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8316 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
8317 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
8318 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
8319 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.body:
8320 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8321 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
8322 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
8323 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD]], ptr [[I]], align 4
8324 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP8:%.*]] = load i32, ptr [[A_ADDR]], align 4
8325 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP8]], 1016
8326 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD2]], ptr [[A_ADDR]], align 4
8327 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
8328 // CHECK-NTARGET-OMP-DEFAULT: omp.body.continue:
8329 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
8330 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.inc:
8331 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
8332 // CHECK-NTARGET-OMP-DEFAULT-NEXT: [[ADD3:%.*]] = add nsw i32 [[TMP9]], 1
8333 // CHECK-NTARGET-OMP-DEFAULT-NEXT: store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4
8334 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_INNER_FOR_COND]]
8335 // CHECK-NTARGET-OMP-DEFAULT: omp.inner.for.end:
8336 // CHECK-NTARGET-OMP-DEFAULT-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
8337 // CHECK-NTARGET-OMP-DEFAULT: omp.loop.exit:
8338 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
8339 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8342 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_GLOBAL__I_000500
8343 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
8344 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8345 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init()
8346 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.2()
8347 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8350 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_GLOBAL__I_000501
8351 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
8352 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8353 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.3()
8354 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8357 // CHECK-NTARGET-OMP-DEFAULT-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_target_parallel_generic_loop_codegen_1.cpp
8358 // CHECK-NTARGET-OMP-DEFAULT-SAME: () #[[ATTR0]] {
8359 // CHECK-NTARGET-OMP-DEFAULT-NEXT: entry:
8360 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.1()
8361 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.4()
8362 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.5()
8363 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.6()
8364 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.7()
8365 // CHECK-NTARGET-OMP-DEFAULT-NEXT: call void @__cxx_global_var_init.8()
8366 // CHECK-NTARGET-OMP-DEFAULT-NEXT: ret void
8368 //// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: