xref: /llvm-project/clang/test/CodeGen/ms-mixed-ptr-sizes.c (revision 4d6e69143dc449814884ac649583d3b35bc4ae91)
1 // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions -emit-llvm -O2 < %s | FileCheck %s --check-prefixes=X64,ALL
2 // RUN: %clang_cc1 -triple i386-pc-win32 -fms-extensions -emit-llvm -O2 < %s | FileCheck %s --check-prefixes=X86,ALL
3 // RUN: %clang_cc1 -triple aarch64-windows-msvc -fms-extensions -emit-llvm -O2 < %s | FileCheck %s --check-prefixes=AARCH64,ALL
4 
5 struct Foo {
6   int * __ptr32 p32;
7   int * __ptr64 p64;
8 };
9 void use_foo(struct Foo *f);
10 void test_sign_ext(struct Foo *f, int * __ptr32 __sptr i) {
11 // X64-LABEL: define dso_local void @test_sign_ext({{.*}}ptr addrspace(270) noundef %i)
12 // X86-LABEL: define dso_local void @test_sign_ext(ptr noundef initializes((8, 16)) %f, ptr noundef %i)
13 // AARCH64-LABEL: define dso_local void @test_sign_ext({{.*}}ptr addrspace(270) noundef %i) local_unnamed_addr #0
14 // X64: %{{.+}} = addrspacecast ptr addrspace(270) %i to ptr
15 // X86: %{{.+}} = addrspacecast ptr %i to ptr addrspace(272)
16 // AARCH64: %{{.+}} = addrspacecast ptr addrspace(270) %i to ptr
17   f->p64 = i;
18   use_foo(f);
19 }
20 void test_zero_ext(struct Foo *f, int * __ptr32 __uptr i) {
21 // X64-LABEL: define dso_local void @test_zero_ext(ptr noundef initializes((8, 16)) %f, ptr addrspace(271) noundef %i)
22 // X86-LABEL: define dso_local void @test_zero_ext({{.*}}ptr addrspace(271) noundef %i)
23 // AARCH64-LABEL: define dso_local void @test_zero_ext(ptr noundef initializes((8, 16)) %f, ptr addrspace(271) noundef %i) local_unnamed_addr #0
24 // X64: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr
25 // X86: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr addrspace(272)
26 // AARCH64: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr
27   f->p64 = i;
28   use_foo(f);
29 }
30 void test_trunc(struct Foo *f, int * __ptr64 i) {
31 // X64-LABEL: define dso_local void @test_trunc(ptr noundef initializes((0, 4)) %f, ptr noundef %i)
32 // X86-LABEL: define dso_local void @test_trunc({{.*}}ptr addrspace(272) noundef %i)
33 // AARCH64-LABEL: define dso_local void @test_trunc(ptr noundef initializes((0, 4)) %f, ptr noundef %i) local_unnamed_addr #0
34 // X64: %{{.+}} = addrspacecast ptr %i to ptr addrspace(270)
35 // X86: %{{.+}} = addrspacecast ptr addrspace(272) %i to ptr
36 // AARCH64: %{{.+}} = addrspacecast ptr %i to ptr addrspace(270)
37   f->p32 = i;
38   use_foo(f);
39 }
40 void test_noop(struct Foo *f, int * __ptr32 i) {
41 // X64-LABEL: define dso_local void @test_noop({{.*}}ptr addrspace(270) noundef %i)
42 // X86-LABEL: define dso_local void @test_noop({{.*}}ptr noundef %i)
43 // AARCH64-LABEL: define dso_local void @test_noop({{.*}}ptr addrspace(270) noundef %i) local_unnamed_addr #0
44 // X64-NOT: addrspacecast
45 // X86-NOT: addrspacecast
46 // AARCH64-NOT: addrspacecast
47   f->p32 = i;
48   use_foo(f);
49 }
50 
51 void test_other(struct Foo *f, __attribute__((address_space(10))) int *i) {
52 // X64-LABEL: define dso_local void @test_other({{.*}}ptr addrspace(10) noundef %i)
53 // X86-LABEL: define dso_local void @test_other({{.*}}ptr addrspace(10) noundef %i)
54 // AARCH64-LABEL: define dso_local void @test_other({{.*}}ptr addrspace(10) noundef %i) local_unnamed_addr #0
55 // X64: %{{.+}} = addrspacecast ptr addrspace(10) %i to ptr addrspace(270)
56 // X86: %{{.+}} = addrspacecast ptr addrspace(10) %i to ptr
57 // AARCH64: %{{.+}} = addrspacecast ptr addrspace(10) %i to ptr addrspace(270)
58   f->p32 = (int * __ptr32)i;
59   use_foo(f);
60 }
61 
62 int test_compare1(int *__ptr32 __uptr i, int *__ptr64 j) {
63   // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare1
64   // X64: %{{.+}} = addrspacecast ptr %j to ptr addrspace(271)
65   // X64: %cmp = icmp eq ptr addrspace(271) %i, %{{.+}}
66   // X86: %{{.+}} = addrspacecast ptr addrspace(272) %j to ptr addrspace(271)
67   // X86: %cmp = icmp eq ptr addrspace(271) %i, %{{.+}}
68   // AARCH64: %{{.+}} = addrspacecast ptr %j to ptr addrspace(271)
69   // AARCH64: %cmp = icmp eq ptr addrspace(271) %i, %{{.+}}
70   return (i == j);
71 }
72 
73 int test_compare2(int *__ptr32 __sptr i, int *__ptr64 j) {
74   // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare2
75   // X64: %{{.+}} = addrspacecast ptr %j to ptr addrspace(270)
76   // X64: %cmp = icmp eq ptr addrspace(270) %i, %{{.+}}
77   // X86: %{{.+}} = addrspacecast ptr addrspace(272) %j to ptr
78   // X86: %cmp = icmp eq ptr %i, %{{.+}}
79   // AARCH64: %{{.+}} = addrspacecast ptr %j to ptr addrspace(270)
80   // AARCH64: %cmp = icmp eq ptr addrspace(270) %i, %{{.+}}
81   return (i == j);
82 }
83 
84 int test_compare3(int *__ptr32 __uptr i, int *__ptr64 j) {
85   // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare3
86   // X64: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr
87   // X64: %cmp = icmp eq ptr %j, %{{.+}}
88   // X86: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr addrspace(272)
89   // X86: %cmp = icmp eq ptr addrspace(272) %j, %{{.+}}
90   // AARCH64: %{{.+}} = addrspacecast ptr addrspace(271) %i to ptr
91   // AARCH64: %cmp = icmp eq ptr %j, %{{.+}}
92   return (j == i);
93 }
94 
95 int test_compare4(int *__ptr32 __sptr i, int *__ptr64 j) {
96   // ALL-LABEL: define dso_local range(i32 0, 2) i32 @test_compare4
97   // X64: %{{.+}} = addrspacecast ptr addrspace(270) %i to ptr
98   // X64: %cmp = icmp eq ptr %j, %{{.+}}
99   // X86: %{{.+}} = addrspacecast ptr %i to ptr addrspace(272)
100   // X86: %cmp = icmp eq ptr addrspace(272) %j, %{{.+}}
101   // AARCH64: %{{.+}} = addrspacecast ptr addrspace(270) %i to ptr
102   // AARCH64: %cmp = icmp eq ptr %j, %{{.+}}
103   return (j == i);
104 }
105