17df2371bSDavid Pagan // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs
2532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -o - -fopenmp \
37df2371bSDavid Pagan // RUN: -triple i386-unknown-unknown -fopenmp-version=51 %s | \
47df2371bSDavid Pagan // RUN: FileCheck %s --check-prefix=CHECK-32
5532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -o - -fopenmp \
67df2371bSDavid Pagan // RUN: -triple x86_64-unknown-linux-gnu -fopenmp-version=51 %s | FileCheck %s
7532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp \
87df2371bSDavid Pagan // RUN: -triple x86_64-unknown-linux-gnu -fopenmp-version=51 \
97df2371bSDavid Pagan // RUN: -emit-pch %s -o %t
10532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp \
117df2371bSDavid Pagan // RUN: -triple x86_64-unknown-linux-gnu -fopenmp-version=51 \
127df2371bSDavid Pagan // RUN: -include-pch %t -emit-llvm %s -o - | FileCheck %s
137df2371bSDavid Pagan // expected-no-diagnostics
147df2371bSDavid Pagan #ifndef HEADER
157df2371bSDavid Pagan #define HEADER
167df2371bSDavid Pagan
177df2371bSDavid Pagan typedef enum omp_allocator_handle_t {
187df2371bSDavid Pagan omp_null_allocator = 0,
197df2371bSDavid Pagan omp_default_mem_alloc = 1,
207df2371bSDavid Pagan omp_large_cap_mem_alloc = 2,
217df2371bSDavid Pagan omp_const_mem_alloc = 3,
227df2371bSDavid Pagan omp_high_bw_mem_alloc = 4,
237df2371bSDavid Pagan omp_low_lat_mem_alloc = 5,
247df2371bSDavid Pagan omp_cgroup_mem_alloc = 6,
257df2371bSDavid Pagan omp_pteam_mem_alloc = 7,
267df2371bSDavid Pagan omp_thread_mem_alloc = 8,
277df2371bSDavid Pagan KMP_ALLOCATOR_MAX_HANDLE = __UINTPTR_MAX__
287df2371bSDavid Pagan } omp_allocator_handle_t;
297df2371bSDavid Pagan
main()307df2371bSDavid Pagan int main() {
317df2371bSDavid Pagan int foo0[5];
327df2371bSDavid Pagan int foo1[10];
337df2371bSDavid Pagan int foo2[20];
347df2371bSDavid Pagan int foo3[30];
357df2371bSDavid Pagan int foo4[40];
367df2371bSDavid Pagan int foo5[50];
377df2371bSDavid Pagan int foo6[60];
387df2371bSDavid Pagan int foo7[70];
397df2371bSDavid Pagan int foo8[80];
407df2371bSDavid Pagan omp_allocator_handle_t MyAlloc = omp_large_cap_mem_alloc;
417df2371bSDavid Pagan
427df2371bSDavid Pagan #pragma omp allocate(foo0) align(1)
437df2371bSDavid Pagan #pragma omp allocate(foo1) allocator(omp_pteam_mem_alloc) align(2)
447df2371bSDavid Pagan #pragma omp allocate(foo2) align(4) allocator(omp_cgroup_mem_alloc)
457df2371bSDavid Pagan #pragma omp allocate(foo3) align(8) allocator(omp_low_lat_mem_alloc)
467df2371bSDavid Pagan #pragma omp allocate(foo4) align(16) allocator(omp_high_bw_mem_alloc)
477df2371bSDavid Pagan #pragma omp allocate(foo5) align(32) allocator(omp_const_mem_alloc)
487df2371bSDavid Pagan #pragma omp allocate(foo6) align(64) allocator(omp_large_cap_mem_alloc)
497df2371bSDavid Pagan #pragma omp allocate(foo7) align(32) allocator(omp_thread_mem_alloc)
507df2371bSDavid Pagan #pragma omp allocate(foo8) align(16) allocator(omp_null_allocator)
517df2371bSDavid Pagan {
527df2371bSDavid Pagan double foo9[80];
537df2371bSDavid Pagan double foo10[90];
547df2371bSDavid Pagan #pragma omp allocate(foo9) align(8) allocator(omp_thread_mem_alloc)
557df2371bSDavid Pagan #pragma omp allocate(foo10) align(128)
567df2371bSDavid Pagan }
577df2371bSDavid Pagan {
587df2371bSDavid Pagan int bar1;
597df2371bSDavid Pagan int bar2[10];
607df2371bSDavid Pagan int bar3[20];
617df2371bSDavid Pagan int *bar4;
627df2371bSDavid Pagan float bar5;
637df2371bSDavid Pagan double bar6[30];
647df2371bSDavid Pagan #pragma omp allocate(bar1, bar2, bar3) align(2) allocator(MyAlloc)
657df2371bSDavid Pagan #pragma omp allocate(bar4, bar5, bar6) align(16)
667df2371bSDavid Pagan }
677df2371bSDavid Pagan }
687df2371bSDavid Pagan
697df2371bSDavid Pagan // Verify align clause in template with non-type template parameter.
707df2371bSDavid Pagan template <typename T, unsigned size, unsigned align>
run()717df2371bSDavid Pagan T run() {
727df2371bSDavid Pagan T foo[size];
737df2371bSDavid Pagan #pragma omp allocate(foo) align(align) allocator(omp_cgroup_mem_alloc)
747df2371bSDavid Pagan return foo[0];
757df2371bSDavid Pagan }
767df2371bSDavid Pagan
template_test()777df2371bSDavid Pagan int template_test() {
787df2371bSDavid Pagan double result;
797df2371bSDavid Pagan result = run<double, 1000, 16>();
807df2371bSDavid Pagan return 0;
817df2371bSDavid Pagan }
827df2371bSDavid Pagan #endif
837df2371bSDavid Pagan // CHECK-32-LABEL: define {{[^@]+}}@main
847df2371bSDavid Pagan // CHECK-32-SAME: () #[[ATTR0:[0-9]+]] {
857df2371bSDavid Pagan // CHECK-32-NEXT: entry:
867df2371bSDavid Pagan // CHECK-32-NEXT: [[MYALLOC:%.*]] = alloca i32, align 4
877df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
88*37471cf2SDavid Pagan // CHECK-32-NEXT: [[DOTFOO0__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 20, i8* null)
897df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO0__ADDR:%.*]] = bitcast i8* [[DOTFOO0__VOID_ADDR]] to [5 x i32]*
90*37471cf2SDavid Pagan // CHECK-32-NEXT: [[DOTFOO1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 40, i8* inttoptr (i32 7 to i8*))
917df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO1__ADDR:%.*]] = bitcast i8* [[DOTFOO1__VOID_ADDR]] to [10 x i32]*
927df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO2__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 80, i8* inttoptr (i32 6 to i8*))
937df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO2__ADDR:%.*]] = bitcast i8* [[DOTFOO2__VOID_ADDR]] to [20 x i32]*
947df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO3__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 8, i32 120, i8* inttoptr (i32 5 to i8*))
957df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO3__ADDR:%.*]] = bitcast i8* [[DOTFOO3__VOID_ADDR]] to [30 x i32]*
967df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO4__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 16, i32 160, i8* inttoptr (i32 4 to i8*))
977df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO4__ADDR:%.*]] = bitcast i8* [[DOTFOO4__VOID_ADDR]] to [40 x i32]*
987df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO5__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 32, i32 200, i8* inttoptr (i32 3 to i8*))
997df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO5__ADDR:%.*]] = bitcast i8* [[DOTFOO5__VOID_ADDR]] to [50 x i32]*
1007df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO6__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 64, i32 240, i8* inttoptr (i32 2 to i8*))
1017df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO6__ADDR:%.*]] = bitcast i8* [[DOTFOO6__VOID_ADDR]] to [60 x i32]*
1027df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO7__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 32, i32 280, i8* inttoptr (i32 8 to i8*))
1037df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO7__ADDR:%.*]] = bitcast i8* [[DOTFOO7__VOID_ADDR]] to [70 x i32]*
1047df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO8__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 16, i32 320, i8* null)
1057df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO8__ADDR:%.*]] = bitcast i8* [[DOTFOO8__VOID_ADDR]] to [80 x i32]*
1067df2371bSDavid Pagan // CHECK-32-NEXT: store i32 2, i32* [[MYALLOC]], align 4
1077df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO9__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 8, i32 640, i8* inttoptr (i32 8 to i8*))
1087df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO9__ADDR:%.*]] = bitcast i8* [[DOTFOO9__VOID_ADDR]] to [80 x double]*
1097df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO10__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 128, i32 720, i8* null)
1107df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO10__ADDR:%.*]] = bitcast i8* [[DOTFOO10__VOID_ADDR]] to [90 x double]*
1117df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP1:%.*]] = bitcast [90 x double]* [[DOTFOO10__ADDR]] to i8*
1127df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP1]], i8* null)
1137df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP2:%.*]] = bitcast [80 x double]* [[DOTFOO9__ADDR]] to i8*
1147df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP2]], i8* inttoptr (i32 8 to i8*))
1157df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP3:%.*]] = load i32, i32* [[MYALLOC]], align 4
1167df2371bSDavid Pagan // CHECK-32-NEXT: [[CONV:%.*]] = inttoptr i32 [[TMP3]] to i8*
117*37471cf2SDavid Pagan // CHECK-32-NEXT: [[DOTBAR1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 4, i8* [[CONV]])
1187df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR1__ADDR:%.*]] = bitcast i8* [[DOTBAR1__VOID_ADDR]] to i32*
1197df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP4:%.*]] = load i32, i32* [[MYALLOC]], align 4
1207df2371bSDavid Pagan // CHECK-32-NEXT: [[CONV1:%.*]] = inttoptr i32 [[TMP4]] to i8*
121*37471cf2SDavid Pagan // CHECK-32-NEXT: [[DOTBAR2__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 40, i8* [[CONV1]])
1227df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR2__ADDR:%.*]] = bitcast i8* [[DOTBAR2__VOID_ADDR]] to [10 x i32]*
1237df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP5:%.*]] = load i32, i32* [[MYALLOC]], align 4
1247df2371bSDavid Pagan // CHECK-32-NEXT: [[CONV2:%.*]] = inttoptr i32 [[TMP5]] to i8*
125*37471cf2SDavid Pagan // CHECK-32-NEXT: [[DOTBAR3__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 80, i8* [[CONV2]])
1267df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR3__ADDR:%.*]] = bitcast i8* [[DOTBAR3__VOID_ADDR]] to [20 x i32]*
1277df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR4__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 16, i32 4, i8* null)
1287df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR4__ADDR:%.*]] = bitcast i8* [[DOTBAR4__VOID_ADDR]] to i32**
1297df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR5__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 16, i32 4, i8* null)
1307df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR5__ADDR:%.*]] = bitcast i8* [[DOTBAR5__VOID_ADDR]] to float*
1317df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR6__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 16, i32 240, i8* null)
1327df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTBAR6__ADDR:%.*]] = bitcast i8* [[DOTBAR6__VOID_ADDR]] to [30 x double]*
1337df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP6:%.*]] = bitcast [30 x double]* [[DOTBAR6__ADDR]] to i8*
1347df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP6]], i8* null)
1357df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP7:%.*]] = bitcast float* [[DOTBAR5__ADDR]] to i8*
1367df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP7]], i8* null)
1377df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP8:%.*]] = bitcast i32** [[DOTBAR4__ADDR]] to i8*
1387df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP8]], i8* null)
1397df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP9:%.*]] = bitcast [20 x i32]* [[DOTBAR3__ADDR]] to i8*
1407df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP10:%.*]] = load i32, i32* [[MYALLOC]], align 4
1417df2371bSDavid Pagan // CHECK-32-NEXT: [[CONV3:%.*]] = inttoptr i32 [[TMP10]] to i8*
1427df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP9]], i8* [[CONV3]])
1437df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP11:%.*]] = bitcast [10 x i32]* [[DOTBAR2__ADDR]] to i8*
1447df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP12:%.*]] = load i32, i32* [[MYALLOC]], align 4
1457df2371bSDavid Pagan // CHECK-32-NEXT: [[CONV4:%.*]] = inttoptr i32 [[TMP12]] to i8*
1467df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP11]], i8* [[CONV4]])
1477df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP13:%.*]] = bitcast i32* [[DOTBAR1__ADDR]] to i8*
1487df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP14:%.*]] = load i32, i32* [[MYALLOC]], align 4
1497df2371bSDavid Pagan // CHECK-32-NEXT: [[CONV5:%.*]] = inttoptr i32 [[TMP14]] to i8*
1507df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP13]], i8* [[CONV5]])
1517df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP15:%.*]] = bitcast [80 x i32]* [[DOTFOO8__ADDR]] to i8*
1527df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP15]], i8* null)
1537df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP16:%.*]] = bitcast [70 x i32]* [[DOTFOO7__ADDR]] to i8*
1547df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP16]], i8* inttoptr (i32 8 to i8*))
1557df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP17:%.*]] = bitcast [60 x i32]* [[DOTFOO6__ADDR]] to i8*
1567df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP17]], i8* inttoptr (i32 2 to i8*))
1577df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP18:%.*]] = bitcast [50 x i32]* [[DOTFOO5__ADDR]] to i8*
1587df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP18]], i8* inttoptr (i32 3 to i8*))
1597df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP19:%.*]] = bitcast [40 x i32]* [[DOTFOO4__ADDR]] to i8*
1607df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP19]], i8* inttoptr (i32 4 to i8*))
1617df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP20:%.*]] = bitcast [30 x i32]* [[DOTFOO3__ADDR]] to i8*
1627df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP20]], i8* inttoptr (i32 5 to i8*))
1637df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP21:%.*]] = bitcast [20 x i32]* [[DOTFOO2__ADDR]] to i8*
1647df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP21]], i8* inttoptr (i32 6 to i8*))
1657df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP22:%.*]] = bitcast [10 x i32]* [[DOTFOO1__ADDR]] to i8*
1667df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP22]], i8* inttoptr (i32 7 to i8*))
1677df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP23:%.*]] = bitcast [5 x i32]* [[DOTFOO0__ADDR]] to i8*
1687df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP23]], i8* null)
1697df2371bSDavid Pagan // CHECK-32-NEXT: ret i32 0
1707df2371bSDavid Pagan //
1717df2371bSDavid Pagan //
1727df2371bSDavid Pagan // CHECK-32-LABEL: define {{[^@]+}}@_Z13template_testv
1737df2371bSDavid Pagan // CHECK-32-SAME: () #[[ATTR2:[0-9]+]] {
1747df2371bSDavid Pagan // CHECK-32-NEXT: entry:
1757df2371bSDavid Pagan // CHECK-32-NEXT: [[RESULT:%.*]] = alloca double, align 8
1761b1c8d83Shyeongyu kim // CHECK-32-NEXT: [[CALL:%.*]] = call noundef double @_Z3runIdLj1000ELj16EET_v()
1777df2371bSDavid Pagan // CHECK-32-NEXT: store double [[CALL]], double* [[RESULT]], align 8
1787df2371bSDavid Pagan // CHECK-32-NEXT: ret i32 0
1797df2371bSDavid Pagan //
1807df2371bSDavid Pagan //
1817df2371bSDavid Pagan // CHECK-32-LABEL: define {{[^@]+}}@_Z3runIdLj1000ELj16EET_v
1827df2371bSDavid Pagan // CHECK-32-SAME: () #[[ATTR2]] comdat {
1837df2371bSDavid Pagan // CHECK-32-NEXT: entry:
1847df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
1857df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 16, i32 8000, i8* inttoptr (i32 6 to i8*))
1867df2371bSDavid Pagan // CHECK-32-NEXT: [[DOTFOO__ADDR:%.*]] = bitcast i8* [[DOTFOO__VOID_ADDR]] to [1000 x double]*
1877df2371bSDavid Pagan // CHECK-32-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [1000 x double], [1000 x double]* [[DOTFOO__ADDR]], i32 0, i32 0
1887df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP1:%.*]] = load double, double* [[ARRAYIDX]], align 8
1897df2371bSDavid Pagan // CHECK-32-NEXT: [[TMP2:%.*]] = bitcast [1000 x double]* [[DOTFOO__ADDR]] to i8*
1907df2371bSDavid Pagan // CHECK-32-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP2]], i8* inttoptr (i32 6 to i8*))
1917df2371bSDavid Pagan // CHECK-32-NEXT: ret double [[TMP1]]
1927df2371bSDavid Pagan //
1937df2371bSDavid Pagan //
1947df2371bSDavid Pagan // CHECK-LABEL: define {{[^@]+}}@main
1957df2371bSDavid Pagan // CHECK-SAME: () #[[ATTR0:[0-9]+]] {
1967df2371bSDavid Pagan // CHECK-NEXT: entry:
1977df2371bSDavid Pagan // CHECK-NEXT: [[MYALLOC:%.*]] = alloca i64, align 8
1987df2371bSDavid Pagan // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
199*37471cf2SDavid Pagan // CHECK-NEXT: [[DOTFOO0__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 32, i8* null)
2007df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO0__ADDR:%.*]] = bitcast i8* [[DOTFOO0__VOID_ADDR]] to [5 x i32]*
201*37471cf2SDavid Pagan // CHECK-NEXT: [[DOTFOO1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 48, i8* inttoptr (i64 7 to i8*))
2027df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO1__ADDR:%.*]] = bitcast i8* [[DOTFOO1__VOID_ADDR]] to [10 x i32]*
2037df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO2__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 80, i8* inttoptr (i64 6 to i8*))
2047df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO2__ADDR:%.*]] = bitcast i8* [[DOTFOO2__VOID_ADDR]] to [20 x i32]*
2057df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO3__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 128, i8* inttoptr (i64 5 to i8*))
2067df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO3__ADDR:%.*]] = bitcast i8* [[DOTFOO3__VOID_ADDR]] to [30 x i32]*
2077df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO4__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 16, i64 160, i8* inttoptr (i64 4 to i8*))
2087df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO4__ADDR:%.*]] = bitcast i8* [[DOTFOO4__VOID_ADDR]] to [40 x i32]*
2097df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO5__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 32, i64 208, i8* inttoptr (i64 3 to i8*))
2107df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO5__ADDR:%.*]] = bitcast i8* [[DOTFOO5__VOID_ADDR]] to [50 x i32]*
2117df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO6__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 64, i64 240, i8* inttoptr (i64 2 to i8*))
2127df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO6__ADDR:%.*]] = bitcast i8* [[DOTFOO6__VOID_ADDR]] to [60 x i32]*
2137df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO7__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 32, i64 288, i8* inttoptr (i64 8 to i8*))
2147df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO7__ADDR:%.*]] = bitcast i8* [[DOTFOO7__VOID_ADDR]] to [70 x i32]*
2157df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO8__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 16, i64 320, i8* null)
2167df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO8__ADDR:%.*]] = bitcast i8* [[DOTFOO8__VOID_ADDR]] to [80 x i32]*
2177df2371bSDavid Pagan // CHECK-NEXT: store i64 2, i64* [[MYALLOC]], align 8
2187df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO9__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 8, i64 640, i8* inttoptr (i64 8 to i8*))
2197df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO9__ADDR:%.*]] = bitcast i8* [[DOTFOO9__VOID_ADDR]] to [80 x double]*
2207df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO10__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 128, i64 720, i8* null)
2217df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO10__ADDR:%.*]] = bitcast i8* [[DOTFOO10__VOID_ADDR]] to [90 x double]*
2227df2371bSDavid Pagan // CHECK-NEXT: [[TMP1:%.*]] = bitcast [90 x double]* [[DOTFOO10__ADDR]] to i8*
2237df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP1]], i8* null)
2247df2371bSDavid Pagan // CHECK-NEXT: [[TMP2:%.*]] = bitcast [80 x double]* [[DOTFOO9__ADDR]] to i8*
2257df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP2]], i8* inttoptr (i64 8 to i8*))
2267df2371bSDavid Pagan // CHECK-NEXT: [[TMP3:%.*]] = load i64, i64* [[MYALLOC]], align 8
2277df2371bSDavid Pagan // CHECK-NEXT: [[CONV:%.*]] = inttoptr i64 [[TMP3]] to i8*
228*37471cf2SDavid Pagan // CHECK-NEXT: [[DOTBAR1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 4, i8* [[CONV]])
2297df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR1__ADDR:%.*]] = bitcast i8* [[DOTBAR1__VOID_ADDR]] to i32*
2307df2371bSDavid Pagan // CHECK-NEXT: [[TMP4:%.*]] = load i64, i64* [[MYALLOC]], align 8
2317df2371bSDavid Pagan // CHECK-NEXT: [[CONV1:%.*]] = inttoptr i64 [[TMP4]] to i8*
232*37471cf2SDavid Pagan // CHECK-NEXT: [[DOTBAR2__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 48, i8* [[CONV1]])
2337df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR2__ADDR:%.*]] = bitcast i8* [[DOTBAR2__VOID_ADDR]] to [10 x i32]*
2347df2371bSDavid Pagan // CHECK-NEXT: [[TMP5:%.*]] = load i64, i64* [[MYALLOC]], align 8
2357df2371bSDavid Pagan // CHECK-NEXT: [[CONV2:%.*]] = inttoptr i64 [[TMP5]] to i8*
236*37471cf2SDavid Pagan // CHECK-NEXT: [[DOTBAR3__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 4, i64 80, i8* [[CONV2]])
2377df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR3__ADDR:%.*]] = bitcast i8* [[DOTBAR3__VOID_ADDR]] to [20 x i32]*
2387df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR4__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 16, i64 8, i8* null)
2397df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR4__ADDR:%.*]] = bitcast i8* [[DOTBAR4__VOID_ADDR]] to i32**
2407df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR5__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 16, i64 4, i8* null)
2417df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR5__ADDR:%.*]] = bitcast i8* [[DOTBAR5__VOID_ADDR]] to float*
2427df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR6__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 16, i64 240, i8* null)
2437df2371bSDavid Pagan // CHECK-NEXT: [[DOTBAR6__ADDR:%.*]] = bitcast i8* [[DOTBAR6__VOID_ADDR]] to [30 x double]*
2447df2371bSDavid Pagan // CHECK-NEXT: [[TMP6:%.*]] = bitcast [30 x double]* [[DOTBAR6__ADDR]] to i8*
2457df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP6]], i8* null)
2467df2371bSDavid Pagan // CHECK-NEXT: [[TMP7:%.*]] = bitcast float* [[DOTBAR5__ADDR]] to i8*
2477df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP7]], i8* null)
2487df2371bSDavid Pagan // CHECK-NEXT: [[TMP8:%.*]] = bitcast i32** [[DOTBAR4__ADDR]] to i8*
2497df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP8]], i8* null)
2507df2371bSDavid Pagan // CHECK-NEXT: [[TMP9:%.*]] = bitcast [20 x i32]* [[DOTBAR3__ADDR]] to i8*
2517df2371bSDavid Pagan // CHECK-NEXT: [[TMP10:%.*]] = load i64, i64* [[MYALLOC]], align 8
2527df2371bSDavid Pagan // CHECK-NEXT: [[CONV3:%.*]] = inttoptr i64 [[TMP10]] to i8*
2537df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP9]], i8* [[CONV3]])
2547df2371bSDavid Pagan // CHECK-NEXT: [[TMP11:%.*]] = bitcast [10 x i32]* [[DOTBAR2__ADDR]] to i8*
2557df2371bSDavid Pagan // CHECK-NEXT: [[TMP12:%.*]] = load i64, i64* [[MYALLOC]], align 8
2567df2371bSDavid Pagan // CHECK-NEXT: [[CONV4:%.*]] = inttoptr i64 [[TMP12]] to i8*
2577df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP11]], i8* [[CONV4]])
2587df2371bSDavid Pagan // CHECK-NEXT: [[TMP13:%.*]] = bitcast i32* [[DOTBAR1__ADDR]] to i8*
2597df2371bSDavid Pagan // CHECK-NEXT: [[TMP14:%.*]] = load i64, i64* [[MYALLOC]], align 8
2607df2371bSDavid Pagan // CHECK-NEXT: [[CONV5:%.*]] = inttoptr i64 [[TMP14]] to i8*
2617df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP13]], i8* [[CONV5]])
2627df2371bSDavid Pagan // CHECK-NEXT: [[TMP15:%.*]] = bitcast [80 x i32]* [[DOTFOO8__ADDR]] to i8*
2637df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP15]], i8* null)
2647df2371bSDavid Pagan // CHECK-NEXT: [[TMP16:%.*]] = bitcast [70 x i32]* [[DOTFOO7__ADDR]] to i8*
2657df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP16]], i8* inttoptr (i64 8 to i8*))
2667df2371bSDavid Pagan // CHECK-NEXT: [[TMP17:%.*]] = bitcast [60 x i32]* [[DOTFOO6__ADDR]] to i8*
2677df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP17]], i8* inttoptr (i64 2 to i8*))
2687df2371bSDavid Pagan // CHECK-NEXT: [[TMP18:%.*]] = bitcast [50 x i32]* [[DOTFOO5__ADDR]] to i8*
2697df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP18]], i8* inttoptr (i64 3 to i8*))
2707df2371bSDavid Pagan // CHECK-NEXT: [[TMP19:%.*]] = bitcast [40 x i32]* [[DOTFOO4__ADDR]] to i8*
2717df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP19]], i8* inttoptr (i64 4 to i8*))
2727df2371bSDavid Pagan // CHECK-NEXT: [[TMP20:%.*]] = bitcast [30 x i32]* [[DOTFOO3__ADDR]] to i8*
2737df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP20]], i8* inttoptr (i64 5 to i8*))
2747df2371bSDavid Pagan // CHECK-NEXT: [[TMP21:%.*]] = bitcast [20 x i32]* [[DOTFOO2__ADDR]] to i8*
2757df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP21]], i8* inttoptr (i64 6 to i8*))
2767df2371bSDavid Pagan // CHECK-NEXT: [[TMP22:%.*]] = bitcast [10 x i32]* [[DOTFOO1__ADDR]] to i8*
2777df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP22]], i8* inttoptr (i64 7 to i8*))
2787df2371bSDavid Pagan // CHECK-NEXT: [[TMP23:%.*]] = bitcast [5 x i32]* [[DOTFOO0__ADDR]] to i8*
2797df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP23]], i8* null)
2807df2371bSDavid Pagan // CHECK-NEXT: ret i32 0
2817df2371bSDavid Pagan //
2827df2371bSDavid Pagan //
2837df2371bSDavid Pagan // CHECK-LABEL: define {{[^@]+}}@_Z13template_testv
2847df2371bSDavid Pagan // CHECK-SAME: () #[[ATTR2:[0-9]+]] {
2857df2371bSDavid Pagan // CHECK-NEXT: entry:
2867df2371bSDavid Pagan // CHECK-NEXT: [[RESULT:%.*]] = alloca double, align 8
2871b1c8d83Shyeongyu kim // CHECK-NEXT: [[CALL:%.*]] = call noundef double @_Z3runIdLj1000ELj16EET_v()
2887df2371bSDavid Pagan // CHECK-NEXT: store double [[CALL]], double* [[RESULT]], align 8
2897df2371bSDavid Pagan // CHECK-NEXT: ret i32 0
2907df2371bSDavid Pagan //
2917df2371bSDavid Pagan //
2927df2371bSDavid Pagan // CHECK-LABEL: define {{[^@]+}}@_Z3runIdLj1000ELj16EET_v
2937df2371bSDavid Pagan // CHECK-SAME: () #[[ATTR2]] comdat {
2947df2371bSDavid Pagan // CHECK-NEXT: entry:
2957df2371bSDavid Pagan // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]])
2967df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i64 16, i64 8000, i8* inttoptr (i64 6 to i8*))
2977df2371bSDavid Pagan // CHECK-NEXT: [[DOTFOO__ADDR:%.*]] = bitcast i8* [[DOTFOO__VOID_ADDR]] to [1000 x double]*
2987df2371bSDavid Pagan // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [1000 x double], [1000 x double]* [[DOTFOO__ADDR]], i64 0, i64 0
2997df2371bSDavid Pagan // CHECK-NEXT: [[TMP1:%.*]] = load double, double* [[ARRAYIDX]], align 16
3007df2371bSDavid Pagan // CHECK-NEXT: [[TMP2:%.*]] = bitcast [1000 x double]* [[DOTFOO__ADDR]] to i8*
3017df2371bSDavid Pagan // CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP2]], i8* inttoptr (i64 6 to i8*))
3027df2371bSDavid Pagan // CHECK-NEXT: ret double [[TMP1]]
3037df2371bSDavid Pagan //
304