123 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --prefix-filecheck-ir-name _ --version 62// RUN: %clang_cc1 -fopenmp -O1 -x c -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK3 4typedef enum omp_allocator_handle_t {5 omp_null_allocator = 0,6 omp_default_mem_alloc = 1,7 omp_large_cap_mem_alloc = 2,8 omp_const_mem_alloc = 3,9 omp_high_bw_mem_alloc = 4,10 omp_low_lat_mem_alloc = 5,11 omp_cgroup_mem_alloc = 6,12 omp_pteam_mem_alloc = 7,13 omp_thread_mem_alloc = 8,14 KMP_ALLOCATOR_MAX_HANDLE = __UINTPTR_MAX__15} omp_allocator_handle_t;16 17typedef enum omp_memspace_handle_t {18 omp_default_mem_space = 0,19 omp_large_cap_mem_space = 1,20 omp_const_mem_space = 2,21 omp_high_bw_mem_space = 3,22 omp_low_lat_mem_space = 4,23 llvm_omp_target_host_mem_space = 100,24 llvm_omp_target_shared_mem_space = 101,25 llvm_omp_target_device_mem_space = 102,26 KMP_MEMSPACE_MAX_HANDLE = __UINTPTR_MAX__27} omp_memspace_handle_t;28 29typedef enum {30 omp_atk_sync_hint = 1,31 omp_atk_alignment = 2,32 omp_atk_access = 3,33 omp_atk_pool_size = 4,34 omp_atk_fallback = 5,35 omp_atk_fb_data = 6,36 omp_atk_pinned = 7,37 omp_atk_partition = 838} omp_alloctrait_key_t;39 40typedef __UINTPTR_TYPE__ omp_uintptr_t;41typedef __SIZE_TYPE__ size_t;42 43typedef struct {44 omp_alloctrait_key_t key;45 omp_uintptr_t value;46} omp_alloctrait_t;47 48extern omp_allocator_handle_t49omp_init_allocator(omp_memspace_handle_t memspace, int ntraits,50 const omp_alloctrait_t traits[]);51 52#define N 102453 54void foo() {55 int *x;56 57 omp_memspace_handle_t x_memspace = omp_default_mem_space;58 omp_alloctrait_t x_traits[1] = {omp_atk_alignment, 64};59 omp_allocator_handle_t x_alloc = omp_init_allocator(x_memspace, 1, x_traits);60 61#pragma omp parallel for allocate(x_alloc : x) private(x)62 for (int i = 0; i < N; i++) {63 (void)x;64 }65}66// CHECK-LABEL: define void @foo(67// CHECK-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] {68// CHECK-NEXT: [[ENTRY:.*:]]69// CHECK-NEXT: [[X_TRAITS:%.*]] = alloca [1 x %struct.omp_alloctrait_t], align 1670// CHECK-NEXT: [[X_ALLOC:%.*]] = alloca i64, align 871// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[X_TRAITS]]) #[[ATTR5:[0-9]+]]72// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) [[X_TRAITS]], ptr noundef nonnull align 16 dereferenceable(16) @__const.foo.x_traits, i64 16, i1 false)73// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[X_ALLOC]]) #[[ATTR5]]74// CHECK-NEXT: [[CALL:%.*]] = call i64 @omp_init_allocator(i64 noundef 0, i32 noundef 1, ptr noundef nonnull [[X_TRAITS]]) #[[ATTR5]]75// CHECK-NEXT: store i64 [[CALL]], ptr [[X_ALLOC]], align 8, !tbaa [[LONG_TBAA7:![0-9]+]]76// CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @[[GLOB2:[0-9]+]], i32 1, ptr nonnull @foo.omp_outlined, ptr nonnull [[X_ALLOC]])77// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[X_ALLOC]]) #[[ATTR5]]78// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[X_TRAITS]]) #[[ATTR5]]79// CHECK-NEXT: ret void80//81//82// CHECK-LABEL: define internal void @foo.omp_outlined(83// CHECK-SAME: ptr noalias noundef readonly captures(none) [[DOTGLOBAL_TID_:%.*]], ptr noalias readnone captures(none) [[DOTBOUND_TID_:%.*]], ptr noundef nonnull readonly align 8 captures(none) dereferenceable(8) [[X_ALLOC:%.*]]) #[[ATTR4:[0-9]+]] {84// CHECK-NEXT: [[ENTRY:.*:]]85// CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 486// CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 487// CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 488// CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 489// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[DOTOMP_LB]]) #[[ATTR5]]90// CHECK-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4, !tbaa [[INT_TBAA3:![0-9]+]]91// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[DOTOMP_UB]]) #[[ATTR5]]92// CHECK-NEXT: store i32 1023, ptr [[DOTOMP_UB]], align 4, !tbaa [[INT_TBAA3]]93// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[DOTOMP_STRIDE]]) #[[ATTR5]]94// CHECK-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4, !tbaa [[INT_TBAA3]]95// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[DOTOMP_IS_LAST]]) #[[ATTR5]]96// CHECK-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4, !tbaa [[INT_TBAA3]]97// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4, !tbaa [[INT_TBAA3]]98// CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr [[X_ALLOC]], align 8, !tbaa [[LONG_TBAA7]]99// CHECK-NEXT: [[CONV:%.*]] = inttoptr i64 [[TMP1]] to ptr100// CHECK-NEXT: [[DOTX__VOID_ADDR:%.*]] = tail call ptr @__kmpc_alloc(i32 [[TMP0]], i64 8, ptr [[CONV]])101// CHECK-NEXT: call void @__kmpc_for_static_init_4(ptr nonnull @[[GLOB1:[0-9]+]], i32 [[TMP0]], i32 34, ptr nonnull [[DOTOMP_IS_LAST]], ptr nonnull [[DOTOMP_LB]], ptr nonnull [[DOTOMP_UB]], ptr nonnull [[DOTOMP_STRIDE]], i32 1, i32 1)102// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4, !tbaa [[INT_TBAA3]]103// CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP2]], i32 1023)104// CHECK-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4, !tbaa [[INT_TBAA3]]105// CHECK-NEXT: call void @__kmpc_for_static_fini(ptr nonnull @[[GLOB1]], i32 [[TMP0]])106// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[X_ALLOC]], align 8, !tbaa [[LONG_TBAA7]]107// CHECK-NEXT: [[CONV5:%.*]] = inttoptr i64 [[TMP3]] to ptr108// CHECK-NEXT: call void @__kmpc_free(i32 [[TMP0]], ptr [[DOTX__VOID_ADDR]], ptr [[CONV5]])109// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[DOTOMP_IS_LAST]]) #[[ATTR5]]110// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[DOTOMP_STRIDE]]) #[[ATTR5]]111// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[DOTOMP_UB]]) #[[ATTR5]]112// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[DOTOMP_LB]]) #[[ATTR5]]113// CHECK-NEXT: ret void114//115//.116// CHECK: [[INT_TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0}117// CHECK: [[META4]] = !{!"int", [[META5:![0-9]+]], i64 0}118// CHECK: [[META5]] = !{!"omnipotent char", [[META6:![0-9]+]], i64 0}119// CHECK: [[META6]] = !{!"Simple C/C++ TBAA"}120// CHECK: [[LONG_TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}121// CHECK: [[META8]] = !{!"long", [[META5]], i64 0}122//.123