299 lines · c
1// RUN: %clang_cc1 -triple s390x-ibm-zos -emit-llvm -O2 < %s | FileCheck %s --check-prefix=X642 3#define PSA_PTR 0x004#define PSAAOLD 0x2245 6struct Foo {7 int * __ptr32 p32;8 int *p64;9 char *cp64;10};11 12void use_foo(struct Foo *f);13 14void ptr32_to_ptr(struct Foo *f, int * __ptr32 i) {15 // X64-LABEL: define void @ptr32_to_ptr(ptr noundef initializes((8, 16)) %f, ptr addrspace(1) noundef %i)16 // X64: %{{.+}} = addrspacecast ptr addrspace(1) %i to ptr17 f->p64= i;18 use_foo(f);19}20 21void ptr_to_ptr32(struct Foo *f, int *i) {22 // X64-LABEL: define void @ptr_to_ptr32(ptr noundef initializes((0, 4)) %f, ptr noundef %i)23 // X64: %{{.+}} = addrspacecast ptr %i to ptr addrspace(1)24 f->p32 = i;25 use_foo(f);26}27 28void ptr32_to_ptr32(struct Foo *f, int * __ptr32 i) {29 // X64-LABEL: define void @ptr32_to_ptr32(ptr noundef initializes((0, 4)) %f, ptr addrspace(1) noundef %i)30 // X64-NOT: addrspacecast31 f->p32 = i;32 use_foo(f);33}34 35void ptr_to_ptr32_explicit_cast(struct Foo *f, int *i) {36 // X64-LABEL: define void @ptr_to_ptr32_explicit_cast(ptr noundef initializes((0, 4)) %f, ptr noundef %i)37 // X64: %{{.+}} = addrspacecast ptr %i to ptr addrspace(1)38 f->p32 = (int * __ptr32)i;39 use_foo(f);40}41 42void test_indexing(struct Foo *f) {43 // X64-LABEL: define void @test_indexing(ptr noundef initializes((16, 24)) %f)44 // X64: addrspacecast ptr addrspace(1) {{%[0-9]}} to ptr45 f->cp64 = ((char * __ptr32 *)1028)[1];46 use_foo(f);47}48 49void test_indexing_2(struct Foo *f) {50 // X64-LABEL: define void @test_indexing_2(ptr noundef initializes((16, 24)) %f)51 // X64: getelementptr inbounds nuw i8, ptr addrspace(1) {{%[0-9]}}, i32 1652 // X64: getelementptr inbounds nuw i8, ptr {{%[0-9]}}, i64 2453 f->cp64 = ((char *** __ptr32 *)1028)[1][2][3];54 use_foo(f);55}56 57unsigned long* test_misc() {58 // X64-LABEL: define ptr @test_misc()59 // X64: %arrayidx = getelementptr inbounds nuw i8, ptr addrspace(1) %0, i32 8860 // X64-NEXT: %1 = load ptr, ptr addrspace(1) %arrayidx61 // X64-NEXT: %arrayidx1 = getelementptr inbounds nuw i8, ptr %1, i64 862 // X64-NEXT: %2 = load ptr, ptr %arrayidx163 // X64-NEXT: %arrayidx2 = getelementptr inbounds nuw i8, ptr %2, i64 90464 // X64-NEXT: %3 = load ptr, ptr %arrayidx265 // X64-NEXT: %arrayidx3 = getelementptr inbounds nuw i8, ptr %3, i64 119266 unsigned long* x = (unsigned long*)((char***** __ptr32*)1208)[0][11][1][113][149];67 return x;68}69 70char* __ptr32* __ptr32 test_misc_2() {71 // X64-LABEL: define ptr addrspace(1) @test_misc_2()72 // X64: br i1 %cmp, label %if.then, label %if.end73 // X64: %1 = load ptr addrspace(1), ptr inttoptr (i64 16 to ptr)74 // X64-NEXT: %arrayidx = getelementptr inbounds nuw i8, ptr addrspace(1) %1, i32 54475 // X64-NEXT: %2 = load ptr addrspace(1), ptr addrspace(1) %arrayidx76 // X64-NEXT: %arrayidx1 = getelementptr inbounds nuw i8, ptr addrspace(1) %2, i32 2477 // X64-NEXT: %3 = load ptr addrspace(1), ptr addrspace(1) %arrayidx178 // X64-NEXT: store ptr addrspace(1) %3, ptr @test_misc_2.res79 // X64: ret ptr addrspace(1)80 static char* __ptr32* __ptr32 res = 0;81 if (res == 0) {82 res = ((char* __ptr32* __ptr32* __ptr32* __ptr32*)0)[4][136][6];83 }84 return res;85}86 87unsigned short test_misc_3() {88 // X64-LABEL: define zeroext i16 @test_misc_3()89 // X64: %0 = load ptr addrspace(1), ptr inttoptr (i64 548 to ptr)90 // X64-NEXT: %1 = addrspacecast ptr addrspace(1) %0 to ptr91 // X64-NEXT: %arrayidx = getelementptr inbounds nuw i8, ptr %1, i64 3692 // X64-NEXT: %2 = load i16, ptr %arrayidx, align 293 // X64-NEXT: ret i16 %294 unsigned short this_asid = ((unsigned short*)(*(char* __ptr32*)(0x224)))[18];95 return this_asid;96}97 98int test_misc_4() {99 // X64-LABEL: define signext range(i32 0, 2) i32 @test_misc_4()100 // X64: getelementptr inbounds nuw i8, ptr addrspace(1) {{%[0-9]}}, i32 88101 // X64: getelementptr inbounds nuw i8, ptr {{%[0-9]}}, i64 8102 // X64: getelementptr inbounds nuw i8, ptr {{%[0-9]}}, i64 984103 // X64: getelementptr inbounds nuw i8, ptr %3, i64 80104 // X64: icmp sgt i32 {{.*[0-9]}}, 67240703105 // X64: ret i32106 int a = (*(int*)(80 + ((char**** __ptr32*)1208)[0][11][1][123]) > 0x040202FF);107 return a;108}109 110void test_misc_5(struct Foo *f) {111 // X64-LABEL: define void @test_misc_5(ptr noundef initializes((16, 24)) %f)112 // X64: addrspacecast ptr addrspace(1) %0 to ptr113 f->cp64 = *(char* __ptr32 *)(PSA_PTR + PSAAOLD);114 use_foo(f);115}116 117int test_misc_6() {118 // X64-LABEL: define {{.*}} i32 @test_misc_6()119 // X64: ret i32 8120 int * __ptr32 ip32;121 int *ip64;122 ip64 = ip32;123 return sizeof(ip64);124}125 126int test_misc_7() {127 // X64-LABEL: define {{.*}} i32 @test_misc_7()128 // X64: ret i32 12129 int foo = 12;130 131 int *ip64;132 int * __ptr32 ip32;133 134 ip64 = &foo;135 ip32 = (int * __ptr32) ip64;136 137 return *ip32;138}139 140int test_misc_8() {141 // X64-LABEL: define {{.*}} i32 @test_misc_8()142 // X64: ret i32 97143 char foo = 'a';144 145 char *cp64;146 char * __ptr32 cp32;147 148 cp64 = &foo;149 cp32 = (char * __ptr32) cp64;150 151 return *cp32;152}153 154int test_misc_9() {155 // X64-LABEL: define {{.*}} i32 @test_misc_9()156 // X64: ret i32 15157 int foo = 15;158 159 int *ip64;160 int * __ptr32 ip32;161 162 ip32 = &foo;163 ip64 = (int *)ip32;164 165 return *ip64;166}167 168int test_misc_10() {169 // X64-LABEL: define {{.*}} i32 @test_misc_10()170 // X64: ret i32 97171 char foo = 'a';172 173 char *cp64;174 char * __ptr32 cp32;175 176 cp32 = &foo;177 cp64= (char *)cp32;178 179 return *cp64;180}181 182int test_function_ptr32_is_32bit() {183 // X64-LABEL: define {{.*}} i32 @test_function_ptr32_is_32bit()184 // X64: ret i32 4185 int (* __ptr32 a)(int a);186 return sizeof(a);187}188 189int get_processor_count() {190 // X64-LABEL: define signext range(i32 -128, 128) i32 @get_processor_count()191 // X64: load ptr addrspace(1), ptr inttoptr (i64 16 to ptr)192 // X64-NEXT: [[ARR_IDX1:%[a-z].*]] = getelementptr inbounds nuw i8, ptr addrspace(1) %0, i32 660193 // X64: load ptr addrspace(1), ptr addrspace(1) [[ARR_IDX1]]194 // X64: load i8, ptr addrspace(1) {{%[a-z].*}}195 // X64: sext i8 {{%[0-9]}} to i32196 // X64-NEXT: ret i32197 return ((char * __ptr32 * __ptr32 *)0)[4][165][53];198}199 200int get_sizes_ptr32() {201 // X64-LABEL: define {{.*}} i32 @get_sizes_ptr32()202 // X64: ret i32 72203 char * __ptr32 a;204 signed char * __ptr32 b;205 unsigned char *__ptr32 c;206 int * __ptr32 d;207 signed int * __ptr32 e;208 unsigned int *__ptr32 f;209 short * __ptr32 g;210 signed short * __ptr32 h;211 unsigned short * __ptr32 i;212 long * __ptr32 j;213 signed * __ptr32 k;214 unsigned * __ptr32 l;215 long long * __ptr32 m;216 signed long long * __ptr32 n;217 unsigned long long * __ptr32 o;218 float * __ptr32 p;219 double * __ptr32 q;220 long double * __ptr32 r;221 222 int sum = 0;223 sum += sizeof(a);224 sum += sizeof(b);225 sum += sizeof(c);226 sum += sizeof(d);227 sum += sizeof(e);228 sum += sizeof(f);229 sum += sizeof(g);230 sum += sizeof(h);231 sum += sizeof(i);232 sum += sizeof(j);233 sum += sizeof(k);234 sum += sizeof(l);235 sum += sizeof(m);236 sum += sizeof(n);237 sum += sizeof(o);238 sum += sizeof(p);239 sum += sizeof(q);240 sum += sizeof(r);241 242 return sum;243}244 245int get_sizes_p64() {246 // X64-LABEL: define {{.*}} i32 @get_sizes_p64()247 // X64: ret i32 144248 char *a;249 signed char *b;250 unsigned char *c;251 int *d;252 signed int *e;253 unsigned int *f;254 short *g;255 signed short *h;256 unsigned short *i;257 long *j;258 signed *k;259 unsigned *l;260 long long *m;261 signed long long *n;262 unsigned long long *o;263 float *p;264 double *q;265 long double *r;266 267 int sum = 0;268 sum += sizeof(a);269 sum += sizeof(b);270 sum += sizeof(c);271 sum += sizeof(d);272 sum += sizeof(e);273 sum += sizeof(f);274 sum += sizeof(g);275 sum += sizeof(h);276 sum += sizeof(i);277 sum += sizeof(j);278 sum += sizeof(k);279 sum += sizeof(l);280 sum += sizeof(m);281 sum += sizeof(n);282 sum += sizeof(o);283 sum += sizeof(p);284 sum += sizeof(q);285 sum += sizeof(r);286 287 return sum;288 289}290 291int host_cpu() {292 char *__ptr32 CVT = *(char * __ptr32 *__ptr32) 16;293 unsigned short Id = *(unsigned short *)&CVT[-6];294 Id = ((((Id >> 12) & 0x0f) * 10 + ((Id >> 8) & 0x0f)) * 10 + ((Id >> 4) & 0x0f)) * 10 + (Id & 0x0f);295 int HaveVectorSupport = CVT[244] & 0x80;296 int z13 = (Id >= 2964 && HaveVectorSupport);297 return z13;298}299