xref: /llvm-project/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-constants.ll (revision 6c01011db089bae22630922e1ac30e5d49de3137)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s
3; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s
4
5target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8"
6target triple = "amdgcn--"
7
8@buf = external addrspace(8) global i8
9@flat = external global i8
10
11define ptr addrspace(7) @null() {
12; CHECK-LABEL: define { ptr addrspace(8), i32 } @null
13; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
14; CHECK-NEXT:    ret { ptr addrspace(8), i32 } zeroinitializer
15;
16  ret ptr addrspace(7) null
17}
18
19define <2 x ptr addrspace(7)> @null_vector() {
20; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @null_vector
21; CHECK-SAME: () #[[ATTR0]] {
22; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } zeroinitializer
23;
24  ret <2 x ptr addrspace(7)> zeroinitializer
25}
26
27define ptr addrspace(7) @undef() {
28; CHECK-LABEL: define { ptr addrspace(8), i32 } @undef
29; CHECK-SAME: () #[[ATTR0]] {
30; CHECK-NEXT:    ret { ptr addrspace(8), i32 } undef
31;
32  ret ptr addrspace(7) undef
33}
34
35define <2 x ptr addrspace(7)> @undef_vec() {
36; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @undef_vec
37; CHECK-SAME: () #[[ATTR0]] {
38; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } undef
39;
40  ret <2 x ptr addrspace(7)> undef
41}
42
43define ptr addrspace(7) @poison() {
44; CHECK-LABEL: define { ptr addrspace(8), i32 } @poison
45; CHECK-SAME: () #[[ATTR0]] {
46; CHECK-NEXT:    ret { ptr addrspace(8), i32 } poison
47;
48  ret ptr addrspace(7) poison
49}
50
51define <2 x ptr addrspace(7)> @poison_vec() {
52; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @poison_vec
53; CHECK-SAME: () #[[ATTR0]] {
54; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } poison
55;
56  ret <2 x ptr addrspace(7)> poison
57}
58
59define ptr addrspace(7) @cast_global() {
60; CHECK-LABEL: define { ptr addrspace(8), i32 } @cast_global
61; CHECK-SAME: () #[[ATTR0]] {
62; CHECK-NEXT:    ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 0 }
63;
64  ret ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7))
65}
66
67define ptr addrspace(7) @cast_null() {
68; CHECK-LABEL: define { ptr addrspace(8), i32 } @cast_null
69; CHECK-SAME: () #[[ATTR0]] {
70; CHECK-NEXT:    ret { ptr addrspace(8), i32 } zeroinitializer
71;
72  ret ptr addrspace(7) addrspacecast (ptr addrspace(8) null to ptr addrspace(7))
73}
74
75define <2 x ptr addrspace(7)> @cast_vec() {
76; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @cast_vec
77; CHECK-SAME: () #[[ATTR0]] {
78; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } { <2 x ptr addrspace(8)> <ptr addrspace(8) @buf, ptr addrspace(8) null>, <2 x i32> zeroinitializer }
79;
80  ret <2 x ptr addrspace(7)> addrspacecast (
81  <2 x ptr addrspace(8)> <ptr addrspace(8) @buf, ptr addrspace(8) null>
82  to <2 x ptr addrspace(7)>)
83}
84
85define ptr addrspace(7) @gep() {
86; CHECK-LABEL: define { ptr addrspace(8), i32 } @gep
87; CHECK-SAME: () #[[ATTR0]] {
88; CHECK-NEXT:    ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 36 }
89;
90  ret ptr addrspace(7) getelementptr inbounds (
91  [4 x i32],
92  ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)),
93  i64 2, i32 1)
94}
95
96define <2 x ptr addrspace(7)> @gep_vector() {
97; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @gep_vector
98; CHECK-SAME: () #[[ATTR0]] {
99; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } { <2 x ptr addrspace(8)> <ptr addrspace(8) @buf, ptr addrspace(8) null>, <2 x i32> <i32 12, i32 4> }
100;
101  ret <2 x ptr addrspace(7)> getelementptr (
102  i32,
103  <2 x ptr addrspace(7)>
104  <ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)),
105  ptr addrspace(7) null>,
106  <2 x i32> <i32 3, i32 1>)
107}
108
109define ptr @gep_of_p7() {
110; CHECK-LABEL: define ptr @gep_of_p7
111; CHECK-SAME: () #[[ATTR0]] {
112; CHECK-NEXT:    ret ptr getelementptr inbounds (ptr addrspace(7), ptr @flat, i64 2)
113;
114  ret ptr getelementptr inbounds (ptr addrspace(7), ptr @flat, i64 2)
115}
116
117define ptr @gep_of_p7_vector() {
118; CHECK-LABEL: define ptr @gep_of_p7_vector
119; CHECK-SAME: () #[[ATTR0]] {
120; CHECK-NEXT:    ret ptr getelementptr (<2 x ptr addrspace(7)>, ptr @flat, i64 2)
121;
122  ret ptr getelementptr (<2 x ptr addrspace(7)>, ptr @flat, i64 2)
123}
124
125define ptr @gep_of_p7_struct() {
126; CHECK-LABEL: define ptr @gep_of_p7_struct
127; CHECK-SAME: () #[[ATTR0]] {
128; CHECK-NEXT:    ret ptr getelementptr ({ ptr addrspace(7), i32 }, ptr @flat, i64 2)
129;
130  ret ptr getelementptr ({ptr addrspace(7), i32}, ptr @flat, i64 2)
131}
132
133define ptr addrspace(7) @gep_p7_from_p7() {
134; CHECK-LABEL: define { ptr addrspace(8), i32 } @gep_p7_from_p7
135; CHECK-SAME: () #[[ATTR0]] {
136; CHECK-NEXT:    ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 48 }
137;
138  ret ptr addrspace(7) getelementptr (ptr addrspace(7),
139  ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)),
140  i64 2)
141}
142
143define i160 @ptrtoint() {
144; CHECK-LABEL: define i160 @ptrtoint
145; CHECK-SAME: () #[[ATTR0]] {
146; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw i160 ptrtoint (ptr addrspace(8) @buf to i160), 32
147; CHECK-NEXT:    [[TMP2:%.*]] = or i160 [[TMP1]], 12
148; CHECK-NEXT:    ret i160 [[TMP2]]
149;
150  ret i160 ptrtoint(
151  ptr addrspace(7) getelementptr(
152  i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)),
153  i32 3) to i160)
154}
155
156define i256 @ptrtoint_long() {
157; CHECK-LABEL: define i256 @ptrtoint_long
158; CHECK-SAME: () #[[ATTR0]] {
159; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw nsw i256 ptrtoint (ptr addrspace(8) @buf to i256), 32
160; CHECK-NEXT:    [[TMP2:%.*]] = or i256 [[TMP1]], 12
161; CHECK-NEXT:    ret i256 [[TMP2]]
162;
163  ret i256 ptrtoint(
164  ptr addrspace(7) getelementptr(
165  i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)),
166  i32 3) to i256)
167}
168
169define i64 @ptrtoint_short() {
170; CHECK-LABEL: define i64 @ptrtoint_short
171; CHECK-SAME: () #[[ATTR0]] {
172; CHECK-NEXT:    [[TMP1:%.*]] = shl i64 ptrtoint (ptr addrspace(8) @buf to i64), 32
173; CHECK-NEXT:    [[TMP2:%.*]] = or i64 [[TMP1]], 12
174; CHECK-NEXT:    ret i64 [[TMP2]]
175;
176  ret i64 ptrtoint(
177  ptr addrspace(7) getelementptr(
178  i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)),
179  i32 3) to i64)
180}
181
182define i32 @ptrtoint_very_short() {
183; CHECK-LABEL: define i32 @ptrtoint_very_short
184; CHECK-SAME: () #[[ATTR0]] {
185; CHECK-NEXT:    ret i32 12
186;
187  ret i32 ptrtoint(
188  ptr addrspace(7) getelementptr(
189  i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)),
190  i32 3) to i32)
191}
192
193
194define <2 x i160> @ptrtoint_vec() {
195; CHECK-LABEL: define <2 x i160> @ptrtoint_vec
196; CHECK-SAME: () #[[ATTR0]] {
197; CHECK-NEXT:    ret <2 x i160> zeroinitializer
198;
199  ret <2 x i160> ptrtoint (<2 x ptr addrspace(7)> zeroinitializer to <2 x i160>)
200}
201
202define ptr addrspace(7) @inttoptr() {
203; CHECK-LABEL: define { ptr addrspace(8), i32 } @inttoptr
204; CHECK-SAME: () #[[ATTR0]] {
205; CHECK-NEXT:    ret { ptr addrspace(8), i32 } zeroinitializer
206;
207  ret ptr addrspace(7) inttoptr (i160 0 to ptr addrspace(7))
208}
209
210define <2 x ptr addrspace(7)> @inttoptr_vec() {
211; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @inttoptr_vec
212; CHECK-SAME: () #[[ATTR0]] {
213; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } { <2 x ptr addrspace(8)> zeroinitializer, <2 x i32> <i32 1, i32 2> }
214;
215  ret <2 x ptr addrspace(7)> inttoptr (<2 x i160> <i160 1, i160 2> to <2 x ptr addrspace(7)>)
216}
217
218define i32 @fancy_zero() {
219; CHECK-LABEL: define i32 @fancy_zero
220; CHECK-SAME: () #[[ATTR0]] {
221; CHECK-NEXT:    ret i32 0
222;
223  ret i32 ptrtoint (
224  ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7))
225  to i32)
226}
227