xref: /llvm-project/clang/test/CodeGen/target-addrspace.cpp (revision b9d678d22f74ebd6e34f0a3501fb01d3d80984e7)
1*b9d678d2SJoseph Huber // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2*b9d678d2SJoseph Huber // RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -emit-llvm \
3*b9d678d2SJoseph Huber // RUN:   -fvisibility=hidden -o - %s | FileCheck %s --check-prefix=NVPTX
4*b9d678d2SJoseph Huber // RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -emit-llvm \
5*b9d678d2SJoseph Huber // RUN:   -fvisibility=hidden -o - %s | FileCheck %s --check-prefix=AMDGPU
6*b9d678d2SJoseph Huber 
7*b9d678d2SJoseph Huber // NVPTX-LABEL: define hidden void @_Z1fPv(
8*b9d678d2SJoseph Huber // NVPTX-SAME: ptr noundef [[P:%.*]]) #[[ATTR0:[0-9]+]] {
9*b9d678d2SJoseph Huber // NVPTX-NEXT:  [[ENTRY:.*:]]
10*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
11*b9d678d2SJoseph Huber // NVPTX-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
12*b9d678d2SJoseph Huber // NVPTX-NEXT:    ret void
13*b9d678d2SJoseph Huber //
14*b9d678d2SJoseph Huber // AMDGPU-LABEL: define hidden void @_Z1fPv(
15*b9d678d2SJoseph Huber // AMDGPU-SAME: ptr noundef [[P:%.*]]) #[[ATTR0:[0-9]+]] {
16*b9d678d2SJoseph Huber // AMDGPU-NEXT:  [[ENTRY:.*:]]
17*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
18*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[P_ADDR]] to ptr
19*b9d678d2SJoseph Huber // AMDGPU-NEXT:    store ptr [[P]], ptr [[P_ADDR_ASCAST]], align 8
20*b9d678d2SJoseph Huber // AMDGPU-NEXT:    ret void
21*b9d678d2SJoseph Huber //
22*b9d678d2SJoseph Huber void f(void *p) {}
23*b9d678d2SJoseph Huber 
24*b9d678d2SJoseph Huber // NVPTX-LABEL: define hidden void @_Z2p1Pv(
25*b9d678d2SJoseph Huber // NVPTX-SAME: ptr noundef [[P:%.*]]) #[[ATTR0]] {
26*b9d678d2SJoseph Huber // NVPTX-NEXT:  [[ENTRY:.*:]]
27*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
28*b9d678d2SJoseph Huber // NVPTX-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
29*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
30*b9d678d2SJoseph Huber // NVPTX-NEXT:    call void @_Z1fPv(ptr noundef [[TMP0]]) #[[ATTR1:[0-9]+]]
31*b9d678d2SJoseph Huber // NVPTX-NEXT:    ret void
32*b9d678d2SJoseph Huber //
33*b9d678d2SJoseph Huber // AMDGPU-LABEL: define hidden void @_Z2p1Pv(
34*b9d678d2SJoseph Huber // AMDGPU-SAME: ptr noundef [[P:%.*]]) #[[ATTR0]] {
35*b9d678d2SJoseph Huber // AMDGPU-NEXT:  [[ENTRY:.*:]]
36*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
37*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[P_ADDR]] to ptr
38*b9d678d2SJoseph Huber // AMDGPU-NEXT:    store ptr [[P]], ptr [[P_ADDR_ASCAST]], align 8
39*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR_ASCAST]], align 8
40*b9d678d2SJoseph Huber // AMDGPU-NEXT:    call void @_Z1fPv(ptr noundef [[TMP0]]) #[[ATTR1:[0-9]+]]
41*b9d678d2SJoseph Huber // AMDGPU-NEXT:    ret void
42*b9d678d2SJoseph Huber //
43*b9d678d2SJoseph Huber void p1(void [[clang::address_space(0)]] * p) { f(p); }
44*b9d678d2SJoseph Huber // NVPTX-LABEL: define hidden noundef ptr @_Z2p2PU3AS3v(
45*b9d678d2SJoseph Huber // NVPTX-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
46*b9d678d2SJoseph Huber // NVPTX-NEXT:  [[ENTRY:.*:]]
47*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[P_ADDR:%.*]] = alloca ptr addrspace(3), align 8
48*b9d678d2SJoseph Huber // NVPTX-NEXT:    store ptr addrspace(3) [[P]], ptr [[P_ADDR]], align 8
49*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[TMP0:%.*]] = load ptr addrspace(3), ptr [[P_ADDR]], align 8
50*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[TMP1:%.*]] = addrspacecast ptr addrspace(3) [[TMP0]] to ptr
51*b9d678d2SJoseph Huber // NVPTX-NEXT:    ret ptr [[TMP1]]
52*b9d678d2SJoseph Huber //
53*b9d678d2SJoseph Huber // AMDGPU-LABEL: define hidden noundef ptr @_Z2p2PU3AS3v(
54*b9d678d2SJoseph Huber // AMDGPU-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
55*b9d678d2SJoseph Huber // AMDGPU-NEXT:  [[ENTRY:.*:]]
56*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[RETVAL:%.*]] = alloca ptr, align 8, addrspace(5)
57*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR:%.*]] = alloca ptr addrspace(3), align 4, addrspace(5)
58*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
59*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[P_ADDR]] to ptr
60*b9d678d2SJoseph Huber // AMDGPU-NEXT:    store ptr addrspace(3) [[P]], ptr [[P_ADDR_ASCAST]], align 4
61*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[TMP0:%.*]] = load ptr addrspace(3), ptr [[P_ADDR_ASCAST]], align 4
62*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[TMP1:%.*]] = addrspacecast ptr addrspace(3) [[TMP0]] to ptr
63*b9d678d2SJoseph Huber // AMDGPU-NEXT:    ret ptr [[TMP1]]
64*b9d678d2SJoseph Huber //
65*b9d678d2SJoseph Huber void *p2(void [[clang::address_space(3)]] * p) { return p; }
66*b9d678d2SJoseph Huber // NVPTX-LABEL: define hidden noundef ptr @_Z2p3PU3AS3v(
67*b9d678d2SJoseph Huber // NVPTX-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
68*b9d678d2SJoseph Huber // NVPTX-NEXT:  [[ENTRY:.*:]]
69*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[P_ADDR:%.*]] = alloca ptr addrspace(3), align 8
70*b9d678d2SJoseph Huber // NVPTX-NEXT:    store ptr addrspace(3) [[P]], ptr [[P_ADDR]], align 8
71*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[TMP0:%.*]] = load ptr addrspace(3), ptr [[P_ADDR]], align 8
72*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[TMP1:%.*]] = addrspacecast ptr addrspace(3) [[TMP0]] to ptr
73*b9d678d2SJoseph Huber // NVPTX-NEXT:    ret ptr [[TMP1]]
74*b9d678d2SJoseph Huber //
75*b9d678d2SJoseph Huber // AMDGPU-LABEL: define hidden noundef ptr @_Z2p3PU3AS3v(
76*b9d678d2SJoseph Huber // AMDGPU-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
77*b9d678d2SJoseph Huber // AMDGPU-NEXT:  [[ENTRY:.*:]]
78*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[RETVAL:%.*]] = alloca ptr, align 8, addrspace(5)
79*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR:%.*]] = alloca ptr addrspace(3), align 4, addrspace(5)
80*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
81*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[P_ADDR]] to ptr
82*b9d678d2SJoseph Huber // AMDGPU-NEXT:    store ptr addrspace(3) [[P]], ptr [[P_ADDR_ASCAST]], align 4
83*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[TMP0:%.*]] = load ptr addrspace(3), ptr [[P_ADDR_ASCAST]], align 4
84*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[TMP1:%.*]] = addrspacecast ptr addrspace(3) [[TMP0]] to ptr
85*b9d678d2SJoseph Huber // AMDGPU-NEXT:    ret ptr [[TMP1]]
86*b9d678d2SJoseph Huber //
87*b9d678d2SJoseph Huber void *p3(void [[clang::address_space(3)]] * p) { return p; }
88*b9d678d2SJoseph Huber 
89*b9d678d2SJoseph Huber struct S {
90*b9d678d2SJoseph Huber   S() = default;
91*b9d678d2SJoseph Huber   ~S() = default;
92*b9d678d2SJoseph Huber   void foo() {}
93*b9d678d2SJoseph Huber };
94*b9d678d2SJoseph Huber 
95*b9d678d2SJoseph Huber S s1;
96*b9d678d2SJoseph Huber S [[clang::address_space(1)]] s2;
97*b9d678d2SJoseph Huber S [[clang::address_space(3)]] s3;
98*b9d678d2SJoseph Huber 
99*b9d678d2SJoseph Huber template <typename Ty> void foo(Ty *) {}
100*b9d678d2SJoseph Huber 
101*b9d678d2SJoseph Huber // NVPTX-LABEL: define hidden void @_Z2t1Pv(
102*b9d678d2SJoseph Huber // NVPTX-SAME: ptr noundef [[P:%.*]]) #[[ATTR0]] {
103*b9d678d2SJoseph Huber // NVPTX-NEXT:  [[ENTRY:.*:]]
104*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
105*b9d678d2SJoseph Huber // NVPTX-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
106*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
107*b9d678d2SJoseph Huber // NVPTX-NEXT:    call void @_Z3fooIvEvPT_(ptr noundef [[TMP0]]) #[[ATTR1]]
108*b9d678d2SJoseph Huber // NVPTX-NEXT:    ret void
109*b9d678d2SJoseph Huber //
110*b9d678d2SJoseph Huber // AMDGPU-LABEL: define hidden void @_Z2t1Pv(
111*b9d678d2SJoseph Huber // AMDGPU-SAME: ptr noundef [[P:%.*]]) #[[ATTR0]] {
112*b9d678d2SJoseph Huber // AMDGPU-NEXT:  [[ENTRY:.*:]]
113*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
114*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[P_ADDR]] to ptr
115*b9d678d2SJoseph Huber // AMDGPU-NEXT:    store ptr [[P]], ptr [[P_ADDR_ASCAST]], align 8
116*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR_ASCAST]], align 8
117*b9d678d2SJoseph Huber // AMDGPU-NEXT:    call void @_Z3fooIvEvPT_(ptr noundef [[TMP0]]) #[[ATTR1]]
118*b9d678d2SJoseph Huber // AMDGPU-NEXT:    ret void
119*b9d678d2SJoseph Huber //
120*b9d678d2SJoseph Huber void t1(void *p) { foo(p); }
121*b9d678d2SJoseph Huber // NVPTX-LABEL: define hidden void @_Z2t3PU3AS3v(
122*b9d678d2SJoseph Huber // NVPTX-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
123*b9d678d2SJoseph Huber // NVPTX-NEXT:  [[ENTRY:.*:]]
124*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[P_ADDR:%.*]] = alloca ptr addrspace(3), align 8
125*b9d678d2SJoseph Huber // NVPTX-NEXT:    store ptr addrspace(3) [[P]], ptr [[P_ADDR]], align 8
126*b9d678d2SJoseph Huber // NVPTX-NEXT:    [[TMP0:%.*]] = load ptr addrspace(3), ptr [[P_ADDR]], align 8
127*b9d678d2SJoseph Huber // NVPTX-NEXT:    call void @_Z3fooIU3AS3vEvPT_(ptr addrspace(3) noundef [[TMP0]]) #[[ATTR1]]
128*b9d678d2SJoseph Huber // NVPTX-NEXT:    ret void
129*b9d678d2SJoseph Huber //
130*b9d678d2SJoseph Huber // AMDGPU-LABEL: define hidden void @_Z2t3PU3AS3v(
131*b9d678d2SJoseph Huber // AMDGPU-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
132*b9d678d2SJoseph Huber // AMDGPU-NEXT:  [[ENTRY:.*:]]
133*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR:%.*]] = alloca ptr addrspace(3), align 4, addrspace(5)
134*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[P_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[P_ADDR]] to ptr
135*b9d678d2SJoseph Huber // AMDGPU-NEXT:    store ptr addrspace(3) [[P]], ptr [[P_ADDR_ASCAST]], align 4
136*b9d678d2SJoseph Huber // AMDGPU-NEXT:    [[TMP0:%.*]] = load ptr addrspace(3), ptr [[P_ADDR_ASCAST]], align 4
137*b9d678d2SJoseph Huber // AMDGPU-NEXT:    call void @_Z3fooIU3AS3vEvPT_(ptr addrspace(3) noundef [[TMP0]]) #[[ATTR1]]
138*b9d678d2SJoseph Huber // AMDGPU-NEXT:    ret void
139*b9d678d2SJoseph Huber //
140*b9d678d2SJoseph Huber void t3(void [[clang::address_space(3)]] *p) { foo(p); }
141