736 lines · plain
1// RUN: %clang_cc1 -no-enable-noundef-analysis %s -cl-std=CL2.0 -include opencl-c.h -triple spir64 -emit-llvm -o - -Wno-void-pointer-to-int-cast -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast | FileCheck %s --check-prefixes=CHECK,SPIR642// RUN: %clang_cc1 -no-enable-noundef-analysis %s -O0 -cl-std=CL2.0 -include opencl-c.h -triple spir64 -emit-llvm -o - -Wno-void-pointer-to-int-cast -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast | FileCheck --check-prefixes=CHECK-NOOPT,SPIR64-NOOPT %s3// RUN: %clang_cc1 -no-enable-noundef-analysis %s -cl-std=CL2.0 -include opencl-c.h -triple amdgcn -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,AMDGCN4// RUN: %clang_cc1 -no-enable-noundef-analysis %s -O0 -cl-std=CL2.0 -include opencl-c.h -triple amdgcn -emit-llvm -o - | FileCheck --check-prefixes=CHECK-NOOPT,AMDGCN-NOOPT %s5// RUN: %clang_cc1 -no-enable-noundef-analysis %s -cl-std=CL2.0 -include opencl-c.h -triple amdgcn---opencl -emit-llvm -o - | FileCheck %s --check-prefix=AMDGCN6// RUN: %clang_cc1 -no-enable-noundef-analysis %s -cl-std=CL2.0 -include opencl-c.h -triple amdgcn -fcommon -emit-llvm -o - | FileCheck %s --check-prefix=AMDGCN-COMMON7 8typedef struct {9 private char *p1;10 local char *p2;11 constant char *p3;12 global char *p4;13 generic char *p5;14} StructTy1;15 16typedef struct {17 constant char *p3;18 global char *p4;19 generic char *p5;20} StructTy2;21 22// Test 0 as initializer.23 24// SPIR64: @private_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 825// AMDGCN: @private_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 426private char *private_p = 0;27 28// SPIR64: @local_p = local_unnamed_addr addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 829// AMDGCN: @local_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 430local char *local_p = 0;31 32// SPIR64: @global_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), align 833// AMDGCN: @global_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(1) null, align 834global char *global_p = 0;35 36// SPIR64: @constant_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(2) null, align 837// AMDGCN: @constant_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 838constant char *constant_p = 0;39 40// SPIR64: @generic_p ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 841// AMDGCN: @generic_p ={{.*}} local_unnamed_addr addrspace(1) global ptr null, align 842generic char *generic_p = 0;43 44// Test NULL as initializer.45 46// SPIR64: @private_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 847// AMDGCN: @private_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 448private char *private_p_NULL = NULL;49 50// SPIR64: @local_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 851// AMDGCN: @local_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 452local char *local_p_NULL = NULL;53 54// SPIR64: @global_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), align 855// AMDGCN: @global_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(1) null, align 856global char *global_p_NULL = NULL;57 58// SPIR64: @constant_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(2) null, align 859// AMDGCN: @constant_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 860constant char *constant_p_NULL = NULL;61 62// SPIR64: @generic_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 863// AMDGCN: @generic_p_NULL ={{.*}} local_unnamed_addr addrspace(1) global ptr null, align 864generic char *generic_p_NULL = NULL;65 66// Test constant folding of null pointer.67// A null pointer should be folded to a null pointer in the target address space.68 69// SPIR64: @fold_generic ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 870// AMDGCN: @fold_generic ={{.*}} local_unnamed_addr addrspace(1) global ptr null, align 871generic int *fold_generic = (global int*)(generic float*)(private char*)0;72 73// SPIR64: @fold_priv ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 874// AMDGCN: @fold_priv ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(5) addrspacecast (ptr addrspace(1) null to ptr addrspace(5)), align 475private short *fold_priv = (private short*)(generic int*)(global void*)0;76 77// SPIR64: @fold_priv_arith ={{.*}} local_unnamed_addr addrspace(1) global ptr inttoptr (i64 10 to ptr), align 878// AMDGCN: @fold_priv_arith ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(5) inttoptr (i32 9 to ptr addrspace(5)), align 479private char *fold_priv_arith = (private char*)0 + 10;80 81// SPIR64: @fold_local_arith ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(3) inttoptr (i64 10 to ptr addrspace(3)), align 882// AMDGCN: @fold_local_arith ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(3) inttoptr (i32 9 to ptr addrspace(3)), align 483local char *fold_local_arith = (local char*)0 + 10;84 85// SPIR64: @fold_int ={{.*}} local_unnamed_addr addrspace(1) global i32 14, align 486// AMDGCN: @fold_int ={{.*}} local_unnamed_addr addrspace(1) global i32 13, align 487int fold_int = (int)(private void*)(generic char*)(global int*)0 + 14;88 89// SPIR64: @fold_int2 ={{.*}} local_unnamed_addr addrspace(1) global i32 13, align 490// AMDGCN: @fold_int2 ={{.*}} local_unnamed_addr addrspace(1) global i32 12, align 491int fold_int2 = (int) ((private void*)0 + 13);92 93// SPIR64: @fold_int3 ={{.*}} local_unnamed_addr addrspace(1) global i32 0, align 494// AMDGCN: @fold_int3 ={{.*}} local_unnamed_addr addrspace(1) global i32 -1, align 495int fold_int3 = (int) ((private int*)0);96 97// SPIR64: @fold_int4 ={{.*}} local_unnamed_addr addrspace(1) global i32 8, align 498// AMDGCN: @fold_int4 ={{.*}} local_unnamed_addr addrspace(1) global i32 7, align 499int fold_int4 = (int) &((private int*)0)[2];100 101// SPIR64: @fold_int5 ={{.*}} local_unnamed_addr addrspace(1) global i32 8, align 4102// AMDGCN: @fold_int5 ={{.*}} local_unnamed_addr addrspace(1) global i32 3, align 4103int fold_int5 = (int) &((private StructTy1*)0)->p2;104 105// SPIR64: @fold_int_local ={{.*}} local_unnamed_addr addrspace(1) global i32 14, align 4106// AMDGCN: @fold_int_local = local_unnamed_addr addrspace(1) global i32 13, align 4107int fold_int_local = (int)(local void*)(generic char*)(global int*)0 + 14;108 109// SPIR64: @fold_int2_local ={{.*}} local_unnamed_addr addrspace(1) global i32 13, align 4110// AMDGCN: @fold_int2_local ={{.*}} local_unnamed_addr addrspace(1) global i32 12, align 4111int fold_int2_local = (int) ((local void*)0 + 13);112 113// SPIR64: @fold_int3_local ={{.*}} local_unnamed_addr addrspace(1) global i32 0, align 4114// AMDGCN: @fold_int3_local ={{.*}} local_unnamed_addr addrspace(1) global i32 -1, align 4115int fold_int3_local = (int) ((local int*)0);116 117// SPIR64: @fold_int4_local ={{.*}} local_unnamed_addr addrspace(1) global i32 8, align 4118// AMDGCN: @fold_int4_local ={{.*}} local_unnamed_addr addrspace(1) global i32 7, align 4119int fold_int4_local = (int) &((local int*)0)[2];120 121// SPIR64: @fold_int5_local ={{.*}} local_unnamed_addr addrspace(1) global i32 8, align 4122// AMDGCN: @fold_int5_local ={{.*}} local_unnamed_addr addrspace(1) global i32 3, align 4123int fold_int5_local = (int) &((local StructTy1*)0)->p2;124 125 126// Test static variable initialization.127 128// SPIR64-NOOPT: @test_static_var_private.sp1 = internal addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 8129// SPIR64-NOOPT: @test_static_var_private.sp2 = internal addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 8130// SPIR64-NOOPT: @test_static_var_private.sp3 = internal addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 8131// SPIR64-NOOPT: @test_static_var_private.sp4 = internal addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 8132// SPIR64-NOOPT: @test_static_var_private.sp5 = internal addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 8133// SPIR64-NOOPT: @test_static_var_private.SS1 = internal addrspace(1) global %struct.StructTy1 zeroinitializer, align 8134// AMDGCN-NOOPT: @test_static_var_private.sp1 = internal addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 4135// AMDGCN-NOOPT: @test_static_var_private.sp2 = internal addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 4136// AMDGCN-NOOPT: @test_static_var_private.sp3 = internal addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 4137// AMDGCN-NOOPT: @test_static_var_private.sp4 = internal addrspace(1) global ptr addrspace(5) null, align 4138// AMDGCN-NOOPT: @test_static_var_private.sp5 = internal addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 4139// AMDGCN-NOOPT: @test_static_var_private.SS1 = internal addrspace(1) global %struct.StructTy1 { ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(4) null, ptr addrspace(1) null, ptr null }, align 8140// CHECK-NOOPT: @test_static_var_private.SS2 = internal addrspace(1) global %struct.StructTy2 zeroinitializer, align 8141 142void test_static_var_private(void) {143 static private char *sp1 = 0;144 static private char *sp2 = NULL;145 static private char *sp3;146 static private char *sp4 = (private char*)((void)0, 0);147 const int x = 0;148 static private char *sp5 = (private char*)x;149 static StructTy1 SS1;150 static StructTy2 SS2;151}152 153// SPIR64-NOOPT: @test_static_var_local.sp1 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 8154// SPIR64-NOOPT: @test_static_var_local.sp2 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 8155// SPIR64-NOOPT: @test_static_var_local.sp3 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 8156// SPIR64-NOOPT: @test_static_var_local.sp4 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 8157// SPIR64-NOOPT: @test_static_var_local.sp5 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 8158// SPIR64-NOOPT: @test_static_var_local.SS1 = internal addrspace(1) global %struct.StructTy1 zeroinitializer, align 8159// AMDGCN-NOOPT: @test_static_var_local.sp1 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 4160// AMDGCN-NOOPT: @test_static_var_local.sp2 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 4161// AMDGCN-NOOPT: @test_static_var_local.sp3 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 4162// AMDGCN-NOOPT: @test_static_var_local.sp4 = internal addrspace(1) global ptr addrspace(3) null, align 4163// AMDGCN-NOOPT: @test_static_var_local.sp5 = internal addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 4164// AMDGCN-NOOPT: @test_static_var_local.SS1 = internal addrspace(1) global %struct.StructTy1 { ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(4) null, ptr addrspace(1) null, ptr null }, align 8165// CHECK-NOOPT: @test_static_var_local.SS2 = internal addrspace(1) global %struct.StructTy2 zeroinitializer, align 8166void test_static_var_local(void) {167 static local char *sp1 = 0;168 static local char *sp2 = NULL;169 static local char *sp3;170 static local char *sp4 = (local char*)((void)0, 0);171 const int x = 0;172 static local char *sp5 = (local char*)x;173 static StructTy1 SS1;174 static StructTy2 SS2;175}176 177// Test function-scope variable initialization.178// CHECK-NOOPT-LABEL: @test_func_scope_var_private(179// SPIR64-NOOPT: store ptr addrspacecast (ptr addrspace(4) null to ptr), ptr %sp1{{.*}}, align 8180// SPIR64-NOOPT: store ptr addrspacecast (ptr addrspace(4) null to ptr), ptr %sp2{{.*}}, align 8181// SPIR64-NOOPT: store ptr null, ptr %sp3{{.*}}, align 8182// SPIR64-NOOPT: store ptr addrspacecast (ptr addrspace(4) null to ptr), ptr %sp4{{.*}}, align 8183// SPIR64-NOOPT: call void @llvm.memset.p0.i64(ptr align 8 %SS1{{.*}}, i8 0, i64 40, i1 false)184// SPIR64-NOOPT: call void @llvm.memcpy.p0.p2.i64(ptr align 8 %SS2{{.*}}, ptr addrspace(2) align 8 @__const.test_func_scope_var_private.SS2, i64 24, i1 false)185// AMDGCN-NOOPT: store ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(5) %sp1{{.*}}, align 4186// AMDGCN-NOOPT: store ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(5) %sp2{{.*}}, align 4187// AMDGCN-NOOPT: store ptr addrspace(5) null, ptr addrspace(5) %sp3{{.*}}, align 4188// AMDGCN-NOOPT: store ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(5) %sp4{{.*}}, align 4189// AMDGCN-NOOPT: call void @llvm.memcpy.p5.p4.i64(ptr addrspace(5) align 8 %SS1{{.*}}, ptr addrspace(4) align 8 @__const.test_func_scope_var_private.SS1, i64 32, i1 false)190// AMDGCN-NOOPT: call void @llvm.memset.p5.i64(ptr addrspace(5) align 8 %SS2{{.*}}, i8 0, i64 24, i1 false)191void test_func_scope_var_private(void) {192 private char *sp1 = 0;193 private char *sp2 = NULL;194 private char *sp3 = (private char*)((void)0, 0);195 const int x = 0;196 private char *sp4 = (private char*)x;197 StructTy1 SS1 = {0, 0, 0, 0, 0};198 StructTy2 SS2 = {0, 0, 0};199}200 201// Test function-scope variable initialization.202// CHECK-NOOPT-LABEL: @test_func_scope_var_local(203// SPIR64-NOOPT: store ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), ptr %sp1{{.*}}, align 8204// SPIR64-NOOPT: store ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), ptr %sp2{{.*}}, align 8205// SPIR64-NOOPT: store ptr addrspace(3) null, ptr %sp3{{.*}}, align 8206// SPIR64-NOOPT: store ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), ptr %sp4{{.*}}, align 8207// SPIR64-NOOPT: call void @llvm.memset.p0.i64(ptr align 8 %SS1{{.*}}, i8 0, i64 40, i1 false)208// SPIR64-NOOPT: call void @llvm.memcpy.p0.p2.i64(ptr align 8 %SS2{{.*}}, ptr addrspace(2) align 8 @__const.test_func_scope_var_local.SS2, i64 24, i1 false)209// AMDGCN-NOOPT: store ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(5) %sp1{{.*}}, align 4210// AMDGCN-NOOPT: store ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(5) %sp2{{.*}}, align 4211// AMDGCN-NOOPT: store ptr addrspace(3) null, ptr addrspace(5) %sp3{{.*}}, align 4212// AMDGCN-NOOPT: store ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(5) %sp4{{.*}}, align 4213// AMDGCN-NOOPT: call void @llvm.memcpy.p5.p4.i64(ptr addrspace(5) align 8 %SS1{{.*}}, ptr addrspace(4) align 8 @__const.test_func_scope_var_local.SS1, i64 32, i1 false)214// AMDGCN-NOOPT: call void @llvm.memset.p5.i64(ptr addrspace(5) align 8 %SS2{{.*}}, i8 0, i64 24, i1 false)215void test_func_scope_var_local(void) {216 local char *sp1 = 0;217 local char *sp2 = NULL;218 local char *sp3 = (local char*)((void)0, 0);219 const int x = 0;220 local char *sp4 = (local char*)x;221 StructTy1 SS1 = {0, 0, 0, 0, 0};222 StructTy2 SS2 = {0, 0, 0};223}224 225 226// Test default initialization of pointers.227 228// Tentative definition of global variables with non-zero initializer229// cannot have common linkage since common linkage requires zero initialization230// and does not have explicit section.231 232// SPIR64: @p1 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspacecast (ptr addrspace(4) null to ptr), align 8233// AMDGCN: @p1 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 4234// AMDGCN-COMMON: @p1 = weak local_unnamed_addr addrspace(1) global ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), align 4235private char *p1;236 237// SPIR64: @p2 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), align 8238// AMDGCN: @p2 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 4239// AMDGCN-COMMON: @p2 = weak local_unnamed_addr addrspace(1) global ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), align 4240local char *p2;241 242// SPIR64: @p3 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(2) null, align 8243// AMDGCN: @p3 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 8244// AMDGCN-COMMON: @p3 = common local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 8245constant char *p3;246 247// SPIR64: @p4 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), align 8248// AMDGCN: @p4 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(1) null, align 8249// AMDGCN-COMMON: @p4 = common local_unnamed_addr addrspace(1) global ptr addrspace(1) null, align 8250global char *p4;251 252// SPIR64: @p5 ={{.*}} local_unnamed_addr addrspace(1) global ptr addrspace(4) null, align 8253// AMDGCN: @p5 ={{.*}} local_unnamed_addr addrspace(1) global ptr null, align 8254// AMDGCN-COMMON: @p5 = common local_unnamed_addr addrspace(1) global ptr null, align 8255generic char *p5;256 257// Test default initialization of structure.258 259// SPIR64: @S1 ={{.*}} local_unnamed_addr addrspace(1) global %struct.StructTy1 zeroinitializer, align 8260// AMDGCN: @S1 ={{.*}} local_unnamed_addr addrspace(1) global %struct.StructTy1 { ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(4) null, ptr addrspace(1) null, ptr null }, align 8261StructTy1 S1;262 263// CHECK: @S2 ={{.*}} local_unnamed_addr addrspace(1) global %struct.StructTy2 zeroinitializer, align 8264StructTy2 S2;265 266// Test default initialization of array.267// SPIR64: @A1 ={{.*}} local_unnamed_addr addrspace(1) global [2 x %struct.StructTy1] zeroinitializer, align 8268// AMDGCN: @A1 ={{.*}} local_unnamed_addr addrspace(1) global [2 x %struct.StructTy1] [%struct.StructTy1 { ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(4) null, ptr addrspace(1) null, ptr null }, %struct.StructTy1 { ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(4) null, ptr addrspace(1) null, ptr null }], align 8269StructTy1 A1[2];270 271// CHECK: @A2 ={{.*}} local_unnamed_addr addrspace(1) global [2 x %struct.StructTy2] zeroinitializer, align 8272StructTy2 A2[2];273 274// Test comparison with 0.275 276// CHECK-LABEL: cmp_private277// SPIR64: icmp eq ptr %p, addrspacecast (ptr addrspace(4) null to ptr)278// AMDGCN: icmp eq ptr addrspace(5) %p, addrspacecast (ptr null to ptr addrspace(5))279void cmp_private(private char* p) {280 if (p != 0)281 *p = 0;282}283 284// CHECK-LABEL: cmp_local285// SPIR64: icmp eq ptr addrspace(3) %p, addrspacecast (ptr addrspace(4) null to ptr addrspace(3))286// AMDGCN: icmp eq ptr addrspace(3) %p, addrspacecast (ptr null to ptr addrspace(3))287void cmp_local(local char* p) {288 if (p != 0)289 *p = 0;290}291 292// CHECK-LABEL: cmp_global293// SPIR64: icmp eq ptr addrspace(1) %p, addrspacecast (ptr addrspace(4) null to ptr addrspace(1))294// AMDGCN: icmp eq ptr addrspace(1) %p, null295void cmp_global(global char* p) {296 if (p != 0)297 *p = 0;298}299 300// CHECK-LABEL: cmp_constant301// SPIR64: icmp eq ptr addrspace(2) %p, null302// AMDGCN: icmp eq ptr addrspace(4) %p, null303char cmp_constant(constant char* p) {304 if (p != 0)305 return *p;306 else307 return 0;308}309 310// CHECK-LABEL: cmp_generic311// SPIR64: icmp eq ptr addrspace(4) %p, null312// AMDGCN: icmp eq ptr %p, null313void cmp_generic(generic char* p) {314 if (p != 0)315 *p = 0;316}317 318// Test comparison with NULL.319 320// CHECK-LABEL: cmp_NULL_private321// SPIR64: icmp eq ptr %p, addrspacecast (ptr addrspace(4) null to ptr)322// AMDGCN: icmp eq ptr addrspace(5) %p, addrspacecast (ptr null to ptr addrspace(5))323void cmp_NULL_private(private char* p) {324 if (p != NULL)325 *p = 0;326}327 328// CHECK-LABEL: cmp_NULL_local329// SPIR64: icmp eq ptr addrspace(3) %p, addrspacecast (ptr addrspace(4) null to ptr addrspace(3))330// AMDGCN: icmp eq ptr addrspace(3) %p, addrspacecast (ptr null to ptr addrspace(3))331void cmp_NULL_local(local char* p) {332 if (p != NULL)333 *p = 0;334}335 336// CHECK-LABEL: cmp_NULL_global337// SPIR64: icmp eq ptr addrspace(1) %p, addrspacecast (ptr addrspace(4) null to ptr addrspace(1))338// AMDGCN: icmp eq ptr addrspace(1) %p, null339void cmp_NULL_global(global char* p) {340 if (p != NULL)341 *p = 0;342}343 344// CHECK-LABEL: cmp_NULL_constant345// SPIR64: icmp eq ptr addrspace(2) %p, null346// AMDGCN: icmp eq ptr addrspace(4) %p, null347char cmp_NULL_constant(constant char* p) {348 if (p != NULL)349 return *p;350 else351 return 0;352}353 354// CHECK-LABEL: cmp_NULL_generic355// SPIR64: icmp eq ptr addrspace(4) %p, null356// AMDGCN: icmp eq ptr %p, null357void cmp_NULL_generic(generic char* p) {358 if (p != NULL)359 *p = 0;360}361 362// Test storage 0 as null pointer.363// CHECK-LABEL: test_storage_null_pointer364// SPIR64: store ptr addrspacecast (ptr addrspace(4) null to ptr), ptr addrspace(4) %arg_private365// SPIR64: store ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), ptr addrspace(4) %arg_local366// SPIR64: store ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), ptr addrspace(4) %arg_global367// SPIR64: store ptr addrspace(2) null, ptr addrspace(4) %arg_constant368// SPIR64: store ptr addrspace(4) null, ptr addrspace(4) %arg_generic369// AMDGCN: store ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr %arg_private370// AMDGCN: store ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr %arg_local371// AMDGCN: store ptr addrspace(1) null, ptr %arg_global372// AMDGCN: store ptr addrspace(4) null, ptr %arg_constant373// AMDGCN: store ptr null, ptr %arg_generic374void test_storage_null_pointer(private char** arg_private,375 local char** arg_local,376 global char** arg_global,377 constant char** arg_constant,378 generic char** arg_generic) {379 *arg_private = 0;380 *arg_local = 0;381 *arg_global = 0;382 *arg_constant = 0;383 *arg_generic = 0;384}385 386// Test storage NULL as null pointer.387// CHECK-LABEL: test_storage_null_pointer_NULL388// SPIR64: store ptr addrspacecast (ptr addrspace(4) null to ptr), ptr addrspace(4) %arg_private389// SPIR64: store ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), ptr addrspace(4) %arg_local390// SPIR64: store ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), ptr addrspace(4) %arg_global391// SPIR64: store ptr addrspace(2) null, ptr addrspace(4) %arg_constant392// SPIR64: store ptr addrspace(4) null, ptr addrspace(4) %arg_generic393// AMDGCN: store ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr %arg_private394// AMDGCN: store ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr %arg_local395// AMDGCN: store ptr addrspace(1) null, ptr %arg_global396// AMDGCN: store ptr addrspace(4) null, ptr %arg_constant397// AMDGCN: store ptr null, ptr %arg_generic398void test_storage_null_pointer_NULL(private char** arg_private,399 local char** arg_local,400 global char** arg_global,401 constant char** arg_constant,402 generic char** arg_generic) {403 *arg_private = NULL;404 *arg_local = NULL;405 *arg_global = NULL;406 *arg_constant = NULL;407 *arg_generic = NULL;408}409 410// Test pass null pointer to function as argument.411void test_pass_null_pointer_arg_calee(private char* arg_private,412 local char* arg_local,413 global char* arg_global,414 constant char* arg_constant,415 generic char* arg_generic);416 417// CHECK-LABEL: test_pass_null_pointer_arg418// SPIR64: call spir_func void @test_pass_null_pointer_arg_calee(ptr addrspacecast (ptr addrspace(4) null to ptr), ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), ptr addrspace(2) null, ptr addrspace(4) null)419// SPIR64: call spir_func void @test_pass_null_pointer_arg_calee(ptr addrspacecast (ptr addrspace(4) null to ptr), ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)), ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), ptr addrspace(2) null, ptr addrspace(4) null)420// AMDGCN: call void @test_pass_null_pointer_arg_calee(ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(1) null, ptr addrspace(4) null, ptr null)421// AMDGCN: call void @test_pass_null_pointer_arg_calee(ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr addrspace(1) null, ptr addrspace(4) null, ptr null)422void test_pass_null_pointer_arg(void) {423 test_pass_null_pointer_arg_calee(0, 0, 0, 0, 0);424 test_pass_null_pointer_arg_calee(NULL, NULL, NULL, NULL, NULL);425}426 427// Test cast null pointer to size_t.428void test_cast_null_pointer_to_sizet_calee(size_t arg_private,429 size_t arg_local,430 size_t arg_global,431 size_t arg_constant,432 size_t arg_generic);433 434// CHECK-LABEL: test_cast_null_pointer_to_sizet435// SPIR64: call spir_func void @test_cast_null_pointer_to_sizet_calee(i64 ptrtoint (ptr addrspacecast (ptr addrspace(4) null to ptr) to i64), i64 ptrtoint (ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)) to i64), i64 ptrtoint (ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)) to i64), i64 0, i64 0)436// SPIR64: call spir_func void @test_cast_null_pointer_to_sizet_calee(i64 ptrtoint (ptr addrspacecast (ptr addrspace(4) null to ptr) to i64), i64 ptrtoint (ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)) to i64), i64 ptrtoint (ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)) to i64), i64 0, i64 0)437// AMDGCN: call void @test_cast_null_pointer_to_sizet_calee(i64 ptrtoint (ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)) to i64), i64 ptrtoint (ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)) to i64), i64 0, i64 0, i64 0)438// AMDGCN: call void @test_cast_null_pointer_to_sizet_calee(i64 ptrtoint (ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)) to i64), i64 ptrtoint (ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)) to i64), i64 0, i64 0, i64 0)439void test_cast_null_pointer_to_sizet(void) {440 test_cast_null_pointer_to_sizet_calee((size_t)((private char*)0),441 (size_t)((local char*)0),442 (size_t)((global char*)0),443 (size_t)((constant char*)0),444 (size_t)((generic char*)0));445 test_cast_null_pointer_to_sizet_calee((size_t)((private char*)NULL),446 (size_t)((local char*)NULL),447 (size_t)((global char*)NULL),448 (size_t)((constant char*)0), // NULL cannot be casted to constant pointer since it is defined as a generic pointer449 (size_t)((generic char*)NULL));450}451 452// Test comparison between null pointers.453#define TEST_EQ00(addr1, addr2) int test_eq00_##addr1##_##addr2(void) { return (addr1 char*)0 == (addr2 char*)0; }454#define TEST_EQ0N(addr1, addr2) int test_eq0N_##addr1##_##addr2(void) { return (addr1 char*)0 == (addr2 char*)NULL; }455#define TEST_EQN0(addr1, addr2) int test_eqN0_##addr1##_##addr2(void) { return (addr1 char*)NULL == (addr2 char*)0; }456#define TEST_EQNN(addr1, addr2) int test_eqNN_##addr1##_##addr2(void) { return (addr1 char*)0 == (addr2 char*)NULL; }457#define TEST_NE00(addr1, addr2) int test_ne00_##addr1##_##addr2(void) { return (addr1 char*)0 != (addr2 char*)0; }458#define TEST_NE0N(addr1, addr2) int test_ne0N_##addr1##_##addr2(void) { return (addr1 char*)0 != (addr2 char*)NULL; }459#define TEST_NEN0(addr1, addr2) int test_neN0_##addr1##_##addr2(void) { return (addr1 char*)NULL != (addr2 char*)0; }460#define TEST_NENN(addr1, addr2) int test_neNN_##addr1##_##addr2(void) { return (addr1 char*)0 != (addr2 char*)NULL; }461#define TEST(addr1, addr2) \462 TEST_EQ00(addr1, addr2) \463 TEST_EQ0N(addr1, addr2) \464 TEST_EQN0(addr1, addr2) \465 TEST_EQNN(addr1, addr2) \466 TEST_NE00(addr1, addr2) \467 TEST_NE0N(addr1, addr2) \468 TEST_NEN0(addr1, addr2) \469 TEST_NENN(addr1, addr2)470 471// CHECK-LABEL: test_eq00_generic_private472// CHECK: ret i32 1473// CHECK-LABEL: test_eq0N_generic_private474// CHECK: ret i32 1475// CHECK-LABEL: test_eqN0_generic_private476// CHECK: ret i32 1477// CHECK-LABEL: test_eqNN_generic_private478// CHECK: ret i32 1479// CHECK-LABEL: test_ne00_generic_private480// CHECK: ret i32 0481// CHECK-LABEL: test_ne0N_generic_private482// CHECK: ret i32 0483// CHECK-LABEL: test_neN0_generic_private484// CHECK: ret i32 0485// CHECK-LABEL: test_neNN_generic_private486// CHECK: ret i32 0487TEST(generic, private)488 489// CHECK-LABEL: test_eq00_generic_local490// CHECK: ret i32 1491// CHECK-LABEL: test_eq0N_generic_local492// CHECK: ret i32 1493// CHECK-LABEL: test_eqN0_generic_local494// CHECK: ret i32 1495// CHECK-LABEL: test_eqNN_generic_local496// CHECK: ret i32 1497// CHECK-LABEL: test_ne00_generic_local498// CHECK: ret i32 0499// CHECK-LABEL: test_ne0N_generic_local500// CHECK: ret i32 0501// CHECK-LABEL: test_neN0_generic_local502// CHECK: ret i32 0503// CHECK-LABEL: test_neNN_generic_local504// CHECK: ret i32 0505TEST(generic, local)506 507// CHECK-LABEL: test_eq00_generic_global508// CHECK: ret i32 1509// CHECK-LABEL: test_eq0N_generic_global510// CHECK: ret i32 1511// CHECK-LABEL: test_eqN0_generic_global512// CHECK: ret i32 1513// CHECK-LABEL: test_eqNN_generic_global514// CHECK: ret i32 1515// CHECK-LABEL: test_ne00_generic_global516// CHECK: ret i32 0517// CHECK-LABEL: test_ne0N_generic_global518// CHECK: ret i32 0519// CHECK-LABEL: test_neN0_generic_global520// CHECK: ret i32 0521// CHECK-LABEL: test_neNN_generic_global522// CHECK: ret i32 0523TEST(generic, global)524 525// CHECK-LABEL: test_eq00_generic_generic526// CHECK: ret i32 1527// CHECK-LABEL: test_eq0N_generic_generic528// CHECK: ret i32 1529// CHECK-LABEL: test_eqN0_generic_generic530// CHECK: ret i32 1531// CHECK-LABEL: test_eqNN_generic_generic532// CHECK: ret i32 1533// CHECK-LABEL: test_ne00_generic_generic534// CHECK: ret i32 0535// CHECK-LABEL: test_ne0N_generic_generic536// CHECK: ret i32 0537// CHECK-LABEL: test_neN0_generic_generic538// CHECK: ret i32 0539// CHECK-LABEL: test_neNN_generic_generic540// CHECK: ret i32 0541TEST(generic, generic)542 543// CHECK-LABEL: test_eq00_constant_constant544// CHECK: ret i32 1545TEST_EQ00(constant, constant)546 547// Test cast to bool.548 549// CHECK-LABEL: cast_bool_private550// SPIR64: icmp eq ptr %p, addrspacecast (ptr addrspace(4) null to ptr)551// AMDGCN: icmp eq ptr addrspace(5) %p, addrspacecast (ptr null to ptr addrspace(5))552void cast_bool_private(private char* p) {553 if (p)554 *p = 0;555}556 557// CHECK-LABEL: cast_bool_local558// SPIR64: icmp eq ptr addrspace(3) %p, addrspacecast (ptr addrspace(4) null to ptr addrspace(3))559// AMDGCN: icmp eq ptr addrspace(3) %p, addrspacecast (ptr null to ptr addrspace(3))560void cast_bool_local(local char* p) {561 if (p)562 *p = 0;563}564 565// CHECK-LABEL: cast_bool_global566// SPIR64: icmp eq ptr addrspace(1) %p, addrspacecast (ptr addrspace(4) null to ptr addrspace(1))567// AMDGCN: icmp eq ptr addrspace(1) %p, null568void cast_bool_global(global char* p) {569 if (p)570 *p = 0;571}572 573// CHECK-LABEL: cast_bool_constant574// SPIR64: icmp eq ptr addrspace(2) %p, null575// AMDGCN: icmp eq ptr addrspace(4) %p, null576char cast_bool_constant(constant char* p) {577 if (p)578 return *p;579 else580 return 0;581}582 583// CHECK-LABEL: cast_bool_generic584// SPIR64: icmp eq ptr addrspace(4) %p, null585// AMDGCN: icmp eq ptr %p, null586void cast_bool_generic(generic char* p) {587 if (p)588 *p = 0;589}590 591// Test initialize a struct using memset.592// For large structures which is mostly zero, clang generats llvm.memset for593// the zero part and store for non-zero members.594typedef struct {595 long a, b, c, d;596 private char *p;597} StructTy3;598 599// CHECK-LABEL: test_memset_private600// SPIR64: call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(32) %ptr, i8 0, i64 32, i1 false)601// SPIR64: [[GEP:%.*]] = getelementptr inbounds nuw i8, ptr %ptr, i64 32602// SPIR64: store ptr addrspacecast (ptr addrspace(4) null to ptr), ptr [[GEP]], align 8603// AMDGCN: call void @llvm.memset.p5.i64(ptr addrspace(5) noundef align 8 {{.*}}, i8 0, i64 32, i1 false)604// AMDGCN: [[GEP:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(5) %ptr, i32 32605// AMDGCN: store ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)), ptr addrspace(5) [[GEP]]606// AMDGCN: [[GEP1:%.*]] = getelementptr inbounds nuw i8, ptr addrspace(5) {{.*}}, i32 36607// AMDGCN: store i32 0, ptr addrspace(5) [[GEP1]], align 4608void test_memset_private(private StructTy3 *ptr) {609 StructTy3 S3 = {0, 0, 0, 0, 0};610 *ptr = S3;611}612 613// Test casting literal 0 to pointer.614// A 0 literal casted to pointer should become a null pointer.615 616// CHECK-LABEL: test_cast_0_to_local_ptr617// SPIR64: ret ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3))618// AMDGCN: ret ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3))619local int* test_cast_0_to_local_ptr(void) {620 return (local int*)0;621}622 623// CHECK-LABEL: test_cast_0_to_private_ptr624// SPIR64: ptr addrspacecast (ptr addrspace(4) null to ptr)625// AMDGCN: ret ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5))626private int* test_cast_0_to_private_ptr(void) {627 return (private int*)0;628}629 630// Test casting non-literal integer with 0 value to pointer.631// A non-literal integer expression with 0 value is casted to a pointer with632// zero value.633 634// CHECK-LABEL: test_cast_int_to_ptr1_private635// SPIR64: ret ptr null636// AMDGCN: ret ptr addrspace(5) null637private int* test_cast_int_to_ptr1_private(void) {638 return (private int*)((void)0, 0);639}640 641// CHECK-LABEL: test_cast_int_to_ptr1_local642// CHECK: ret ptr addrspace(3) null643local int* test_cast_int_to_ptr1_local(void) {644 return (local int*)((void)0, 0);645}646 647// CHECK-LABEL: test_cast_int_to_ptr2648// SPIR64: ret ptr null649// AMDGCN: ret ptr addrspace(5) null650private int* test_cast_int_to_ptr2(void) {651 int x = 0;652 return (private int*)x;653}654 655// Test logical operations.656// CHECK-LABEL: test_not_nullptr657// CHECK: ret i32 1658int test_not_nullptr(void) {659 return !(private char*)NULL;660}661 662// CHECK-LABEL: test_and_nullptr663// CHECK: ret i32 0664int test_and_nullptr(int a) {665 return a && ((private char*)NULL);666}667 668// CHECK-LABEL: test_not_private_ptr669// SPIR64: %[[lnot:.*]] = icmp eq ptr %p, addrspacecast (ptr addrspace(4) null to ptr)670// AMDGCN: %[[lnot:.*]] = icmp eq ptr addrspace(5) %p, addrspacecast (ptr null to ptr addrspace(5))671// CHECK: %[[lnot_ext:.*]] = zext i1 %[[lnot]] to i32672// CHECK: ret i32 %[[lnot_ext]]673int test_not_private_ptr(private char* p) {674 return !p;675}676 677// CHECK-LABEL: test_not_local_ptr678// SPIR64: %[[lnot:.*]] = icmp eq ptr addrspace(3) %p, addrspacecast (ptr addrspace(4) null to ptr addrspace(3))679// AMDGCN: %[[lnot:.*]] = icmp eq ptr addrspace(3) %p, addrspacecast (ptr null to ptr addrspace(3))680// CHECK: %[[lnot_ext:.*]] = zext i1 %[[lnot]] to i32681// CHECK: ret i32 %[[lnot_ext]]682int test_not_local_ptr(local char* p) {683 return !p;684}685 686 687// CHECK-LABEL: test_and_ptr688// SPIR64: %[[tobool:.*]] = icmp ne ptr %p1, addrspacecast (ptr addrspace(4) null to ptr)689// SPIR64: %[[tobool1:.*]] = icmp ne ptr addrspace(3) %p2, addrspacecast (ptr addrspace(4) null to ptr addrspace(3))690// AMDGCN: %[[tobool:.*]] = icmp ne ptr addrspace(5) %p1, addrspacecast (ptr null to ptr addrspace(5))691// AMDGCN: %[[tobool1:.*]] = icmp ne ptr addrspace(3) %p2, addrspacecast (ptr null to ptr addrspace(3))692// CHECK: %[[res:.*]] = select i1 %[[tobool]], i1 %[[tobool1]], i1 false693// CHECK: %[[land_ext:.*]] = zext i1 %[[res]] to i32694// CHECK: ret i32 %[[land_ext]]695int test_and_ptr(private char* p1, local char* p2) {696 return p1 && p2;697}698 699// Test folding of null pointer in function scope.700// CHECK-NOOPT-LABEL: test_fold_private701// SPIR64-NOOPT: call{{.*}} void @test_fold_callee702// SPIR64-NOOPT: store ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), ptr %glob{{.*}}, align 8703// SPIR64-NOOPT: %{{.*}} = sub i64 %{{.*}}, ptrtoint (ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)) to i64)704// AMDGCN-NOOPT: store ptr addrspace(1) null, ptr addrspace(5) %glob{{.*}}, align 8705// AMDGCN-NOOPT: %{{.*}} = sub i64 %{{.*}}, 0706// SPIR64-NOOPT: call{{.*}} void @test_fold_callee707// SPIR64-NOOPT: %[[SEXT:.*]] = sext i32 ptrtoint (ptr addrspacecast (ptr addrspace(4) null to ptr) to i32) to i64708// AMDGCN-NOOPT: %[[SEXT:.*]] = sext i32 ptrtoint (ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5)) to i32) to i64709// CHECK-NOOPT: %{{.*}} = add nsw i64 %{{.*}}, %[[SEXT]]710// CHECK-NOOPT: %{{.*}} = sub nsw i64 %{{.*}}, 1711void test_fold_callee(void);712void test_fold_private(void) {713 global int* glob = (test_fold_callee(), (global int*)(generic char*)0);714 long x = glob - (global int*)(generic char*)0;715 x = x + (int)(test_fold_callee(), (private int*)(generic char*)(global short*)0);716 x = x - (int)((private int*)0 == (private int*)(generic char*)0);717}718 719// CHECK-NOOPT-LABEL: test_fold_local720// CHECK-NOOPT: call{{.*}} void @test_fold_callee721// SPIR64-NOOPT: store ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)), ptr %glob{{.*}}, align 8722// SPIR64-NOOPT: %{{.*}} = sub i64 %{{.*}}, ptrtoint (ptr addrspace(1) addrspacecast (ptr addrspace(4) null to ptr addrspace(1)) to i64)723// AMDGCN-NOOPT: store ptr addrspace(1) null, ptr addrspace(5) %glob{{.*}}, align 8724// AMDGCN-NOOPT: %{{.*}} = sub i64 %{{.*}}, 0725// CHECK-NOOPT: call{{.*}} void @test_fold_callee726// SPIR64-NOOPT: %[[SEXT:.*]] = sext i32 ptrtoint (ptr addrspace(3) addrspacecast (ptr addrspace(4) null to ptr addrspace(3)) to i32) to i64727// AMDGCN-NOOPT: %[[SEXT:.*]] = sext i32 ptrtoint (ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)) to i32) to i64728// CHECK-NOOPT: %{{.*}} = add nsw i64 %{{.*}}, %[[SEXT]]729// CHECK-NOOPT: %{{.*}} = sub nsw i64 %{{.*}}, 1730void test_fold_local(void) {731 global int* glob = (test_fold_callee(), (global int*)(generic char*)0);732 long x = glob - (global int*)(generic char*)0;733 x = x + (int)(test_fold_callee(), (local int*)(generic char*)(global short*)0);734 x = x - (int)((local int*)0 == (local int*)(generic char*)0);735}736