xref: /llvm-project/clang/test/OpenMP/allocate_modifiers_codegen.cpp (revision ad38e24eb74e97148faec97c4f843b87768b6e9b)
1*ad38e24eSDavid Pagan // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _ --version 5
2*ad38e24eSDavid Pagan // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
3*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s
4*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
5*ad38e24eSDavid Pagan // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
6*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s
7*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp -fopenmp-version=52 -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CHECK-TLS %s
8*ad38e24eSDavid Pagan 
9*ad38e24eSDavid Pagan // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
10*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s
11*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
12*ad38e24eSDavid Pagan // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=52 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
13*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -x c++ -std=c++11 -emit-pch -o %t %s
14*ad38e24eSDavid Pagan // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=52 -fnoopenmp-use-tls -triple x86_64-unknown-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
15*ad38e24eSDavid Pagan // expected-no-diagnostics
16*ad38e24eSDavid Pagan 
17*ad38e24eSDavid Pagan #ifndef HEADER
18*ad38e24eSDavid Pagan #define HEADER
19*ad38e24eSDavid Pagan 
20*ad38e24eSDavid Pagan enum omp_allocator_handle_t {
21*ad38e24eSDavid Pagan   omp_null_allocator = 0,
22*ad38e24eSDavid Pagan   omp_default_mem_alloc = 1,
23*ad38e24eSDavid Pagan   omp_large_cap_mem_alloc = 2,
24*ad38e24eSDavid Pagan   omp_const_mem_alloc = 3,
25*ad38e24eSDavid Pagan   omp_high_bw_mem_alloc = 4,
26*ad38e24eSDavid Pagan   omp_low_lat_mem_alloc = 5,
27*ad38e24eSDavid Pagan   omp_cgroup_mem_alloc = 6,
28*ad38e24eSDavid Pagan   omp_pteam_mem_alloc = 7,
29*ad38e24eSDavid Pagan   omp_thread_mem_alloc = 8,
30*ad38e24eSDavid Pagan   KMP_ALLOCATOR_MAX_HANDLE = __UINTPTR_MAX__
31*ad38e24eSDavid Pagan };
32*ad38e24eSDavid Pagan 
33*ad38e24eSDavid Pagan template <class T>
34*ad38e24eSDavid Pagan struct ST {
35*ad38e24eSDavid Pagan   static T m;
36*ad38e24eSDavid Pagan };
37*ad38e24eSDavid Pagan 
38*ad38e24eSDavid Pagan template <class T, omp_allocator_handle_t TY, unsigned al> T foo() {
39*ad38e24eSDavid Pagan   T v;
40*ad38e24eSDavid Pagan  #pragma omp scope private(v) allocate(allocator(TY):v)
41*ad38e24eSDavid Pagan   v = ST<T>::m;
42*ad38e24eSDavid Pagan   #pragma omp scope private(v) allocate(align(al), allocator(TY):v)
43*ad38e24eSDavid Pagan   ++v;
44*ad38e24eSDavid Pagan   return v;
45*ad38e24eSDavid Pagan }
46*ad38e24eSDavid Pagan 
47*ad38e24eSDavid Pagan namespace ns {
48*ad38e24eSDavid Pagan int a;
49*ad38e24eSDavid Pagan }
50*ad38e24eSDavid Pagan 
51*ad38e24eSDavid Pagan omp_allocator_handle_t foo();
52*ad38e24eSDavid Pagan 
53*ad38e24eSDavid Pagan int main() {
54*ad38e24eSDavid Pagan   static int a;
55*ad38e24eSDavid Pagan   static int temp;
56*ad38e24eSDavid Pagan   int v;
57*ad38e24eSDavid Pagan   #pragma omp scope private(ns::a) allocate(allocator(omp_pteam_mem_alloc):ns::a)
58*ad38e24eSDavid Pagan   ns::a++;
59*ad38e24eSDavid Pagan   #pragma omp scope private(a) allocate(align(8),allocator(omp_thread_mem_alloc):a)
60*ad38e24eSDavid Pagan   a = 2;
61*ad38e24eSDavid Pagan   #pragma omp scope private(v) allocate(align(1) : v)
62*ad38e24eSDavid Pagan   ++v;
63*ad38e24eSDavid Pagan   #pragma omp scope private(v) allocate(allocator(omp_default_mem_alloc) : v)
64*ad38e24eSDavid Pagan   ++v;
65*ad38e24eSDavid Pagan   #pragma omp scope private(v) allocate(allocator(omp_large_cap_mem_alloc), align(8) : v)
66*ad38e24eSDavid Pagan   ++v;
67*ad38e24eSDavid Pagan   #pragma omp scope private(v) allocate(align(4) : v)
68*ad38e24eSDavid Pagan   ++v;
69*ad38e24eSDavid Pagan   #pragma omp scope private(v) allocate(align(2), allocator(omp_default_mem_alloc) : v)
70*ad38e24eSDavid Pagan   ++v;
71*ad38e24eSDavid Pagan   #pragma omp scope private(v) allocate(align(8), allocator(foo()) : v)
72*ad38e24eSDavid Pagan   ++v;
73*ad38e24eSDavid Pagan 
74*ad38e24eSDavid Pagan   double b = 3;
75*ad38e24eSDavid Pagan   #pragma omp scope private(temp) allocate(temp)
76*ad38e24eSDavid Pagan   temp += foo<int, omp_cgroup_mem_alloc, 8>();
77*ad38e24eSDavid Pagan   return temp+ns::a;
78*ad38e24eSDavid Pagan }
79*ad38e24eSDavid Pagan 
80*ad38e24eSDavid Pagan extern template int ST<int>::m;
81*ad38e24eSDavid Pagan 
82*ad38e24eSDavid Pagan const int b = 8;
83*ad38e24eSDavid Pagan 
84*ad38e24eSDavid Pagan void bar(int a, float &z) {
85*ad38e24eSDavid Pagan   #pragma omp scope private(a,z) allocate(align(b), allocator(omp_default_mem_alloc) : a,z)
86*ad38e24eSDavid Pagan   a += b + z;
87*ad38e24eSDavid Pagan }
88*ad38e24eSDavid Pagan #endif
89*ad38e24eSDavid Pagan // CHECK-LABEL: define dso_local noundef i32 @main(
90*ad38e24eSDavid Pagan // CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
91*ad38e24eSDavid Pagan // CHECK-NEXT:  [[ENTRY:.*:]]
92*ad38e24eSDavid Pagan // CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
93*ad38e24eSDavid Pagan // CHECK-NEXT:    [[V:%.*]] = alloca i32, align 4
94*ad38e24eSDavid Pagan // CHECK-NEXT:    [[B:%.*]] = alloca double, align 8
95*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
96*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 0, ptr [[RETVAL]], align 4
97*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr inttoptr (i64 7 to ptr))
98*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTA__VOID_ADDR]], align 4
99*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
100*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC]], ptr [[DOTA__VOID_ADDR]], align 4
101*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTA__VOID_ADDR]], ptr inttoptr (i64 7 to ptr))
102*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]])
103*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTA__VOID_ADDR1:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 8 to ptr))
104*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 2, ptr [[DOTA__VOID_ADDR1]], align 4
105*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTA__VOID_ADDR1]], ptr inttoptr (i64 8 to ptr))
106*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
107*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 4, ptr null)
108*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTV__VOID_ADDR]], align 4
109*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC2:%.*]] = add nsw i32 [[TMP2]], 1
110*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC2]], ptr [[DOTV__VOID_ADDR]], align 4
111*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR]], ptr null)
112*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
113*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR3:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr inttoptr (i64 1 to ptr))
114*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTV__VOID_ADDR3]], align 4
115*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC4:%.*]] = add nsw i32 [[TMP3]], 1
116*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC4]], ptr [[DOTV__VOID_ADDR3]], align 4
117*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR3]], ptr inttoptr (i64 1 to ptr))
118*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
119*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR5:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 2 to ptr))
120*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTV__VOID_ADDR5]], align 4
121*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC6:%.*]] = add nsw i32 [[TMP4]], 1
122*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC6]], ptr [[DOTV__VOID_ADDR5]], align 4
123*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR5]], ptr inttoptr (i64 2 to ptr))
124*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
125*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR7:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 4, ptr null)
126*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTV__VOID_ADDR7]], align 4
127*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC8:%.*]] = add nsw i32 [[TMP5]], 1
128*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC8]], ptr [[DOTV__VOID_ADDR7]], align 4
129*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR7]], ptr null)
130*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
131*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR9:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 4, ptr inttoptr (i64 1 to ptr))
132*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTV__VOID_ADDR9]], align 4
133*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC10:%.*]] = add nsw i32 [[TMP6]], 1
134*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC10]], ptr [[DOTV__VOID_ADDR9]], align 4
135*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR9]], ptr inttoptr (i64 1 to ptr))
136*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
137*ad38e24eSDavid Pagan // CHECK-NEXT:    [[CALL:%.*]] = call noundef i64 @_Z3foov()
138*ad38e24eSDavid Pagan // CHECK-NEXT:    [[CONV:%.*]] = inttoptr i64 [[CALL]] to ptr
139*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR11:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr [[CONV]])
140*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTV__VOID_ADDR11]], align 4
141*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC12:%.*]] = add nsw i32 [[TMP7]], 1
142*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC12]], ptr [[DOTV__VOID_ADDR11]], align 4
143*ad38e24eSDavid Pagan // CHECK-NEXT:    [[CALL13:%.*]] = call noundef i64 @_Z3foov()
144*ad38e24eSDavid Pagan // CHECK-NEXT:    [[CONV14:%.*]] = inttoptr i64 [[CALL13]] to ptr
145*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR11]], ptr [[CONV14]])
146*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
147*ad38e24eSDavid Pagan // CHECK-NEXT:    store double 3.000000e+00, ptr [[B]], align 8
148*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTTEMP__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr null)
149*ad38e24eSDavid Pagan // CHECK-NEXT:    [[CALL15:%.*]] = call noundef i32 @_Z3fooIiL22omp_allocator_handle_t6ELj8EET_v()
150*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTTEMP__VOID_ADDR]], align 4
151*ad38e24eSDavid Pagan // CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[CALL15]]
152*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[ADD]], ptr [[DOTTEMP__VOID_ADDR]], align 4
153*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTTEMP__VOID_ADDR]], ptr null)
154*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
155*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr @_ZZ4mainE4temp, align 4
156*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr @_ZN2ns1aE, align 4
157*ad38e24eSDavid Pagan // CHECK-NEXT:    [[ADD16:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]
158*ad38e24eSDavid Pagan // CHECK-NEXT:    ret i32 [[ADD16]]
159*ad38e24eSDavid Pagan //
160*ad38e24eSDavid Pagan //
161*ad38e24eSDavid Pagan // CHECK-LABEL: define linkonce_odr noundef i32 @_Z3fooIiL22omp_allocator_handle_t6ELj8EET_v(
162*ad38e24eSDavid Pagan // CHECK-SAME: ) #[[ATTR4:[0-9]+]] comdat {
163*ad38e24eSDavid Pagan // CHECK-NEXT:  [[ENTRY:.*:]]
164*ad38e24eSDavid Pagan // CHECK-NEXT:    [[V:%.*]] = alloca i32, align 4
165*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
166*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr inttoptr (i64 6 to ptr))
167*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr @_ZN2STIiE1mE, align 4
168*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[TMP1]], ptr [[DOTV__VOID_ADDR]], align 4
169*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR]], ptr inttoptr (i64 6 to ptr))
170*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
171*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTV__VOID_ADDR1:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 6 to ptr))
172*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTV__VOID_ADDR1]], align 4
173*ad38e24eSDavid Pagan // CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP2]], 1
174*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[INC]], ptr [[DOTV__VOID_ADDR1]], align 4
175*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR1]], ptr inttoptr (i64 6 to ptr))
176*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
177*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[V]], align 4
178*ad38e24eSDavid Pagan // CHECK-NEXT:    ret i32 [[TMP3]]
179*ad38e24eSDavid Pagan //
180*ad38e24eSDavid Pagan //
181*ad38e24eSDavid Pagan // CHECK-LABEL: define dso_local void @_Z3bariRf(
182*ad38e24eSDavid Pagan // CHECK-SAME: i32 noundef [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[Z:%.*]]) #[[ATTR4]] {
183*ad38e24eSDavid Pagan // CHECK-NEXT:  [[ENTRY:.*:]]
184*ad38e24eSDavid Pagan // CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
185*ad38e24eSDavid Pagan // CHECK-NEXT:    [[Z_ADDR:%.*]] = alloca ptr, align 8
186*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
187*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
188*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
189*ad38e24eSDavid Pagan // CHECK-NEXT:    store ptr [[Z]], ptr [[Z_ADDR]], align 8
190*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 1 to ptr))
191*ad38e24eSDavid Pagan // CHECK-NEXT:    [[DOTZ__VOID_ADDR:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 1 to ptr))
192*ad38e24eSDavid Pagan // CHECK-NEXT:    store ptr [[DOTZ__VOID_ADDR]], ptr [[TMP]], align 8
193*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8
194*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[TMP1]], align 4
195*ad38e24eSDavid Pagan // CHECK-NEXT:    [[ADD:%.*]] = fadd float 8.000000e+00, [[TMP2]]
196*ad38e24eSDavid Pagan // CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTA__VOID_ADDR]], align 4
197*ad38e24eSDavid Pagan // CHECK-NEXT:    [[CONV:%.*]] = sitofp i32 [[TMP3]] to float
198*ad38e24eSDavid Pagan // CHECK-NEXT:    [[ADD1:%.*]] = fadd float [[CONV]], [[ADD]]
199*ad38e24eSDavid Pagan // CHECK-NEXT:    [[CONV2:%.*]] = fptosi float [[ADD1]] to i32
200*ad38e24eSDavid Pagan // CHECK-NEXT:    store i32 [[CONV2]], ptr [[DOTA__VOID_ADDR]], align 4
201*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTZ__VOID_ADDR]], ptr inttoptr (i64 1 to ptr))
202*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTA__VOID_ADDR]], ptr inttoptr (i64 1 to ptr))
203*ad38e24eSDavid Pagan // CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
204*ad38e24eSDavid Pagan // CHECK-NEXT:    ret void
205*ad38e24eSDavid Pagan //
206*ad38e24eSDavid Pagan //
207*ad38e24eSDavid Pagan // CHECK-TLS-LABEL: define dso_local noundef i32 @main(
208*ad38e24eSDavid Pagan // CHECK-TLS-SAME: ) #[[ATTR0:[0-9]+]] {
209*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:  [[ENTRY:.*:]]
210*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
211*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[V:%.*]] = alloca i32, align 4
212*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[B:%.*]] = alloca double, align 8
213*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])
214*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 0, ptr [[RETVAL]], align 4
215*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr inttoptr (i64 7 to ptr))
216*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTA__VOID_ADDR]], align 4
217*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
218*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC]], ptr [[DOTA__VOID_ADDR]], align 4
219*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTA__VOID_ADDR]], ptr inttoptr (i64 7 to ptr))
220*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]])
221*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTA__VOID_ADDR1:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 8 to ptr))
222*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 2, ptr [[DOTA__VOID_ADDR1]], align 4
223*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTA__VOID_ADDR1]], ptr inttoptr (i64 8 to ptr))
224*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
225*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 4, ptr null)
226*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTV__VOID_ADDR]], align 4
227*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC2:%.*]] = add nsw i32 [[TMP2]], 1
228*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC2]], ptr [[DOTV__VOID_ADDR]], align 4
229*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR]], ptr null)
230*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
231*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR3:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr inttoptr (i64 1 to ptr))
232*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTV__VOID_ADDR3]], align 4
233*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC4:%.*]] = add nsw i32 [[TMP3]], 1
234*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC4]], ptr [[DOTV__VOID_ADDR3]], align 4
235*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR3]], ptr inttoptr (i64 1 to ptr))
236*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
237*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR5:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 2 to ptr))
238*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTV__VOID_ADDR5]], align 4
239*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC6:%.*]] = add nsw i32 [[TMP4]], 1
240*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC6]], ptr [[DOTV__VOID_ADDR5]], align 4
241*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR5]], ptr inttoptr (i64 2 to ptr))
242*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
243*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR7:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 4, ptr null)
244*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTV__VOID_ADDR7]], align 4
245*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC8:%.*]] = add nsw i32 [[TMP5]], 1
246*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC8]], ptr [[DOTV__VOID_ADDR7]], align 4
247*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR7]], ptr null)
248*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
249*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR9:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 4, ptr inttoptr (i64 1 to ptr))
250*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTV__VOID_ADDR9]], align 4
251*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC10:%.*]] = add nsw i32 [[TMP6]], 1
252*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC10]], ptr [[DOTV__VOID_ADDR9]], align 4
253*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR9]], ptr inttoptr (i64 1 to ptr))
254*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
255*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[CALL:%.*]] = call noundef i64 @_Z3foov()
256*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[CONV:%.*]] = inttoptr i64 [[CALL]] to ptr
257*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR11:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr [[CONV]])
258*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTV__VOID_ADDR11]], align 4
259*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC12:%.*]] = add nsw i32 [[TMP7]], 1
260*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC12]], ptr [[DOTV__VOID_ADDR11]], align 4
261*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[CALL13:%.*]] = call noundef i64 @_Z3foov()
262*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[CONV14:%.*]] = inttoptr i64 [[CALL13]] to ptr
263*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR11]], ptr [[CONV14]])
264*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
265*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store double 3.000000e+00, ptr [[B]], align 8
266*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTTEMP__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr null)
267*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[CALL15:%.*]] = call noundef i32 @_Z3fooIiL22omp_allocator_handle_t6ELj8EET_v()
268*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTTEMP__VOID_ADDR]], align 4
269*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[CALL15]]
270*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[ADD]], ptr [[DOTTEMP__VOID_ADDR]], align 4
271*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTTEMP__VOID_ADDR]], ptr null)
272*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
273*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP9:%.*]] = load i32, ptr @_ZZ4mainE4temp, align 4
274*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP10:%.*]] = load i32, ptr @_ZN2ns1aE, align 4
275*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[ADD16:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]
276*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    ret i32 [[ADD16]]
277*ad38e24eSDavid Pagan //
278*ad38e24eSDavid Pagan //
279*ad38e24eSDavid Pagan // CHECK-TLS-LABEL: define linkonce_odr noundef i32 @_Z3fooIiL22omp_allocator_handle_t6ELj8EET_v(
280*ad38e24eSDavid Pagan // CHECK-TLS-SAME: ) #[[ATTR4:[0-9]+]] comdat {
281*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:  [[ENTRY:.*:]]
282*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[V:%.*]] = alloca i32, align 4
283*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
284*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP0]], i64 4, ptr inttoptr (i64 6 to ptr))
285*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP1:%.*]] = load i32, ptr @_ZN2STIiE1mE, align 4
286*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[TMP1]], ptr [[DOTV__VOID_ADDR]], align 4
287*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR]], ptr inttoptr (i64 6 to ptr))
288*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
289*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTV__VOID_ADDR1:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 6 to ptr))
290*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTV__VOID_ADDR1]], align 4
291*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP2]], 1
292*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[INC]], ptr [[DOTV__VOID_ADDR1]], align 4
293*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTV__VOID_ADDR1]], ptr inttoptr (i64 6 to ptr))
294*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
295*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP3:%.*]] = load i32, ptr [[V]], align 4
296*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    ret i32 [[TMP3]]
297*ad38e24eSDavid Pagan //
298*ad38e24eSDavid Pagan //
299*ad38e24eSDavid Pagan // CHECK-TLS-LABEL: define dso_local void @_Z3bariRf(
300*ad38e24eSDavid Pagan // CHECK-TLS-SAME: i32 noundef [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[Z:%.*]]) #[[ATTR4]] {
301*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:  [[ENTRY:.*:]]
302*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
303*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[Z_ADDR:%.*]] = alloca ptr, align 8
304*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
305*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
306*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
307*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store ptr [[Z]], ptr [[Z_ADDR]], align 8
308*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTA__VOID_ADDR:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 1 to ptr))
309*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[DOTZ__VOID_ADDR:%.*]] = call ptr @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 4, ptr inttoptr (i64 1 to ptr))
310*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store ptr [[DOTZ__VOID_ADDR]], ptr [[TMP]], align 8
311*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TMP]], align 8
312*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP2:%.*]] = load float, ptr [[TMP1]], align 4
313*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[ADD:%.*]] = fadd float 8.000000e+00, [[TMP2]]
314*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTA__VOID_ADDR]], align 4
315*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[CONV:%.*]] = sitofp i32 [[TMP3]] to float
316*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[ADD1:%.*]] = fadd float [[CONV]], [[ADD]]
317*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    [[CONV2:%.*]] = fptosi float [[ADD1]] to i32
318*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    store i32 [[CONV2]], ptr [[DOTA__VOID_ADDR]], align 4
319*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTZ__VOID_ADDR]], ptr inttoptr (i64 1 to ptr))
320*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTA__VOID_ADDR]], ptr inttoptr (i64 1 to ptr))
321*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])
322*ad38e24eSDavid Pagan // CHECK-TLS-NEXT:    ret void
323*ad38e24eSDavid Pagan //
324*ad38e24eSDavid Pagan //
325*ad38e24eSDavid Pagan // SIMD-ONLY0-LABEL: define dso_local noundef i32 @main(
326*ad38e24eSDavid Pagan // SIMD-ONLY0-SAME: ) #[[ATTR0:[0-9]+]] {
327*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:  [[ENTRY:.*:]]
328*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4
329*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V:%.*]] = alloca i32, align 4
330*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[A:%.*]] = alloca i32, align 4
331*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[A1:%.*]] = alloca i32, align 4
332*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V2:%.*]] = alloca i32, align 4
333*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V4:%.*]] = alloca i32, align 4
334*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V6:%.*]] = alloca i32, align 4
335*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V8:%.*]] = alloca i32, align 4
336*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V10:%.*]] = alloca i32, align 4
337*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V12:%.*]] = alloca i32, align 4
338*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[B:%.*]] = alloca double, align 8
339*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TEMP:%.*]] = alloca i32, align 4
340*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 0, ptr [[RETVAL]], align 4
341*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
342*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP0]], 1
343*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC]], ptr [[A]], align 4
344*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 2, ptr [[A1]], align 4
345*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP1:%.*]] = load i32, ptr [[V2]], align 4
346*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC3:%.*]] = add nsw i32 [[TMP1]], 1
347*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC3]], ptr [[V2]], align 4
348*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP2:%.*]] = load i32, ptr [[V4]], align 4
349*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC5:%.*]] = add nsw i32 [[TMP2]], 1
350*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC5]], ptr [[V4]], align 4
351*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP3:%.*]] = load i32, ptr [[V6]], align 4
352*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC7:%.*]] = add nsw i32 [[TMP3]], 1
353*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC7]], ptr [[V6]], align 4
354*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP4:%.*]] = load i32, ptr [[V8]], align 4
355*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC9:%.*]] = add nsw i32 [[TMP4]], 1
356*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC9]], ptr [[V8]], align 4
357*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP5:%.*]] = load i32, ptr [[V10]], align 4
358*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC11:%.*]] = add nsw i32 [[TMP5]], 1
359*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC11]], ptr [[V10]], align 4
360*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP6:%.*]] = load i32, ptr [[V12]], align 4
361*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC13:%.*]] = add nsw i32 [[TMP6]], 1
362*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC13]], ptr [[V12]], align 4
363*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store double 3.000000e+00, ptr [[B]], align 8
364*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z3fooIiL22omp_allocator_handle_t6ELj8EET_v()
365*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TEMP]], align 4
366*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP7]], [[CALL]]
367*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[ADD]], ptr [[TEMP]], align 4
368*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP8:%.*]] = load i32, ptr @_ZZ4mainE4temp, align 4
369*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP9:%.*]] = load i32, ptr @_ZN2ns1aE, align 4
370*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[ADD14:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]
371*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    ret i32 [[ADD14]]
372*ad38e24eSDavid Pagan //
373*ad38e24eSDavid Pagan //
374*ad38e24eSDavid Pagan // SIMD-ONLY0-LABEL: define linkonce_odr noundef i32 @_Z3fooIiL22omp_allocator_handle_t6ELj8EET_v(
375*ad38e24eSDavid Pagan // SIMD-ONLY0-SAME: ) #[[ATTR1:[0-9]+]] comdat {
376*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:  [[ENTRY:.*:]]
377*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V:%.*]] = alloca i32, align 4
378*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V1:%.*]] = alloca i32, align 4
379*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[V2:%.*]] = alloca i32, align 4
380*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP0:%.*]] = load i32, ptr @_ZN2STIiE1mE, align 4
381*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[TMP0]], ptr [[V1]], align 4
382*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP1:%.*]] = load i32, ptr [[V2]], align 4
383*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP1]], 1
384*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[INC]], ptr [[V2]], align 4
385*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP2:%.*]] = load i32, ptr [[V]], align 4
386*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    ret i32 [[TMP2]]
387*ad38e24eSDavid Pagan //
388*ad38e24eSDavid Pagan //
389*ad38e24eSDavid Pagan // SIMD-ONLY0-LABEL: define dso_local void @_Z3bariRf(
390*ad38e24eSDavid Pagan // SIMD-ONLY0-SAME: i32 noundef [[A:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[Z:%.*]]) #[[ATTR1]] {
391*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:  [[ENTRY:.*:]]
392*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
393*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[Z_ADDR:%.*]] = alloca ptr, align 8
394*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[A1:%.*]] = alloca i32, align 4
395*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[Z2:%.*]] = alloca float, align 4
396*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP:%.*]] = alloca ptr, align 8
397*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
398*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store ptr [[Z]], ptr [[Z_ADDR]], align 8
399*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store ptr [[Z2]], ptr [[TMP]], align 8
400*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[TMP]], align 8
401*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP1:%.*]] = load float, ptr [[TMP0]], align 4
402*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[ADD:%.*]] = fadd float 8.000000e+00, [[TMP1]]
403*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A1]], align 4
404*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[CONV:%.*]] = sitofp i32 [[TMP2]] to float
405*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[ADD3:%.*]] = fadd float [[CONV]], [[ADD]]
406*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    [[CONV4:%.*]] = fptosi float [[ADD3]] to i32
407*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    store i32 [[CONV4]], ptr [[A1]], align 4
408*ad38e24eSDavid Pagan // SIMD-ONLY0-NEXT:    ret void
409*ad38e24eSDavid Pagan //
410