160 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -O0 -triple amdgcn---amdgiz -emit-llvm %s -o - | FileCheck %s3 4// CHECK-LABEL: @_Z5func1Pi(5// CHECK-NEXT: entry:6// CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)7// CHECK-NEXT: [[X_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[X_ADDR]] to ptr8// CHECK-NEXT: store ptr [[X:%.*]], ptr [[X_ADDR_ASCAST]], align 89// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR_ASCAST]], align 810// CHECK-NEXT: store i32 1, ptr [[TMP0]], align 411// CHECK-NEXT: ret void12//13void func1(int *x) {14 *x = 1;15}16 17// CHECK-LABEL: @_Z5func2v(18// CHECK-NEXT: entry:19// CHECK-NEXT: [[LV1:%.*]] = alloca i32, align 4, addrspace(5)20// CHECK-NEXT: [[LV2:%.*]] = alloca i32, align 4, addrspace(5)21// CHECK-NEXT: [[LA:%.*]] = alloca [100 x i32], align 4, addrspace(5)22// CHECK-NEXT: [[LP1:%.*]] = alloca ptr, align 8, addrspace(5)23// CHECK-NEXT: [[LP2:%.*]] = alloca ptr, align 8, addrspace(5)24// CHECK-NEXT: [[LVC:%.*]] = alloca i32, align 4, addrspace(5)25// CHECK-NEXT: [[LV1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LV1]] to ptr26// CHECK-NEXT: [[LV2_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LV2]] to ptr27// CHECK-NEXT: [[LA_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LA]] to ptr28// CHECK-NEXT: [[LP1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LP1]] to ptr29// CHECK-NEXT: [[LP2_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LP2]] to ptr30// CHECK-NEXT: [[LVC_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LVC]] to ptr31// CHECK-NEXT: store i32 1, ptr [[LV1_ASCAST]], align 432// CHECK-NEXT: store i32 2, ptr [[LV2_ASCAST]], align 433// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr [[LA_ASCAST]], i64 0, i64 034// CHECK-NEXT: store i32 3, ptr [[ARRAYIDX]], align 435// CHECK-NEXT: store ptr [[LV1_ASCAST]], ptr [[LP1_ASCAST]], align 836// CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [100 x i32], ptr [[LA_ASCAST]], i64 0, i64 037// CHECK-NEXT: store ptr [[ARRAYDECAY]], ptr [[LP2_ASCAST]], align 838// CHECK-NEXT: call void @_Z5func1Pi(ptr noundef [[LV1_ASCAST]])39// CHECK-NEXT: store i32 4, ptr [[LVC_ASCAST]], align 440// CHECK-NEXT: store i32 4, ptr [[LV1_ASCAST]], align 441// CHECK-NEXT: ret void42//43void func2(void) {44 45 int lv1;46 lv1 = 1;47 int lv2 = 2;48 49 int la[100];50 la[0] = 3;51 52 int *lp1 = &lv1;53 54 int *lp2 = la;55 56 func1(&lv1);57 58 const int lvc = 4;59 lv1 = lvc;60}61 62void destroy(int x);63 64class A {65int x;66public:67 A():x(0) {}68 ~A() {69 destroy(x);70 }71};72 73// CHECK-LABEL: @_Z5func3v(74// CHECK-NEXT: entry:75// CHECK-NEXT: [[A:%.*]] = alloca [[CLASS_A:%.*]], align 4, addrspace(5)76// CHECK-NEXT: [[A_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A]] to ptr77// CHECK-NEXT: call void @_ZN1AC1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[A_ASCAST]])78// CHECK-NEXT: call void @_ZN1AD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[A_ASCAST]])79// CHECK-NEXT: ret void80//81void func3() {82 A a;83}84 85// CHECK-LABEL: @_Z5func4i(86// CHECK-NEXT: entry:87// CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4, addrspace(5)88// CHECK-NEXT: [[X_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[X_ADDR]] to ptr89// CHECK-NEXT: store i32 [[X:%.*]], ptr [[X_ADDR_ASCAST]], align 490// CHECK-NEXT: call void @_Z5func1Pi(ptr noundef [[X_ADDR_ASCAST]])91// CHECK-NEXT: ret void92//93void func4(int x) {94 func1(&x);95}96 97// CHECK-LABEL: @_Z5func5v(98// CHECK-NEXT: entry:99// CHECK-NEXT: [[X:%.*]] = alloca i32, align 4, addrspace(5)100// CHECK-NEXT: [[X_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[X]] to ptr101// CHECK-NEXT: ret void102//103void func5() {104 return;105 int x = 0;106}107 108// CHECK-LABEL: @_Z5func6v(109// CHECK-NEXT: entry:110// CHECK-NEXT: [[X:%.*]] = alloca i32, align 4, addrspace(5)111// CHECK-NEXT: [[X_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[X]] to ptr112// CHECK-NEXT: ret void113//114void func6() {115 return;116 int x;117}118 119extern void use(int *);120// CHECK-LABEL: @_Z5func7v(121// CHECK-NEXT: entry:122// CHECK-NEXT: [[X:%.*]] = alloca i32, align 4, addrspace(5)123// CHECK-NEXT: [[X_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[X]] to ptr124// CHECK-NEXT: br label [[LATER:%.*]]125// CHECK: later:126// CHECK-NEXT: call void @_Z3usePi(ptr noundef [[X_ASCAST]])127// CHECK-NEXT: ret void128//129void func7() {130 goto later;131 int x;132later:133 use(&x);134}135 136#define __private __attribute__((opencl_private))137 138// CHECK-LABEL: @_Z34explicit_private_address_space_ptrv(139// CHECK-NEXT: entry:140// CHECK-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5)141// CHECK-NEXT: [[ALLOCA_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)142// CHECK-NEXT: [[ALLOCA_ADDR_AS_PRIVATE:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5)143// CHECK-NEXT: [[VAR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VAR]] to ptr144// CHECK-NEXT: [[ALLOCA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR]] to ptr145// CHECK-NEXT: [[ALLOCA_ADDR_AS_PRIVATE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR_AS_PRIVATE]] to ptr146// CHECK-NEXT: store ptr [[VAR_ASCAST]], ptr [[ALLOCA_ADDR_ASCAST]], align 8147// CHECK-NEXT: [[VAR_ASCAST_ASCAST:%.*]] = addrspacecast ptr [[VAR_ASCAST]] to ptr addrspace(5)148// CHECK-NEXT: store ptr addrspace(5) [[VAR_ASCAST_ASCAST]], ptr [[ALLOCA_ADDR_AS_PRIVATE_ASCAST]], align 4149// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr [[ALLOCA_ADDR_AS_PRIVATE_ASCAST]], align 4150// CHECK-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8151// CHECK-NEXT: ret void152//153void explicit_private_address_space_ptr() {154 long var;155 long *alloca_addr = &var;156 157 __private long *alloca_addr_as_private = (__private long *)&var;158 *alloca_addr_as_private = 8;159}160