11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
22; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -S -passes=separate-const-offset-from-gep < %s | FileCheck %s
33
4- define void @inboundsPossiblyNegative (ptr %in.ptr , i32 %in.idx1 ) {
4+ define void @inboundsPossiblyNegative (ptr %in.ptr , i64 %in.idx1 ) {
55; CHECK-LABEL: define void @inboundsPossiblyNegative(
6- ; CHECK-SAME: ptr [[IN_PTR:%.*]], i32 [[IN_IDX1:%.*]]) #[[ATTR0:[0-9]+]] {
6+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0:[0-9]+]] {
77; CHECK-NEXT: entry:
8- ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[IN_IDX1]] to i64
9- ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <2 x i8>, ptr [[IN_PTR]], i64 [[IDXPROM]]
8+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <2 x i8>, ptr [[IN_PTR]], i64 [[IN_IDX1]]
109; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <2 x i8>, ptr [[TMP0]], i32 1
1110; CHECK-NEXT: ret void
1211;
1312entry:
14- %const1 = getelementptr inbounds <2 x i8 >, ptr %in.ptr , i32 1
15- %idx1 = getelementptr inbounds <2 x i8 >, ptr %const1 , i32 %in.idx1
13+ %const1 = getelementptr inbounds <2 x i8 >, ptr %in.ptr , i64 1
14+ %idx1 = getelementptr inbounds <2 x i8 >, ptr %const1 , i64 %in.idx1
1615 ret void
1716}
1817
19- define void @inboundsNonNegative (ptr %in.ptr , i32 %in.idx1 ) {
20- ; CHECK-LABEL: define void @inboundsNonNegative (
18+ define void @inboundsNonNegative_nonCanonical (ptr %in.ptr , i32 %in.idx1 ) {
19+ ; CHECK-LABEL: define void @inboundsNonNegative_nonCanonical (
2120; CHECK-SAME: ptr [[IN_PTR:%.*]], i32 [[IN_IDX1:%.*]]) #[[ATTR0]] {
2221; CHECK-NEXT: entry:
23- ; CHECK-NEXT: [[IN_IDX1_NNEG :%.*]] = and i32 [[IN_IDX1]], 2147483647
24- ; CHECK-NEXT: [[IDXPROM :%.*]] = sext i32 [[IN_IDX1_NNEG ]] to i64
25- ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <2 x i8>, ptr [[IN_PTR]], i64 [[IDXPROM ]]
22+ ; CHECK-NEXT: [[IN_IDX1_NNEG1 :%.*]] = and i32 [[IN_IDX1]], 2147483647
23+ ; CHECK-NEXT: [[IN_IDX1_NNEG :%.*]] = sext i32 [[IN_IDX1_NNEG1 ]] to i64
24+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <2 x i8>, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG ]]
2625; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <2 x i8>, ptr [[TMP0]], i32 1
2726; CHECK-NEXT: ret void
2827;
@@ -33,53 +32,196 @@ entry:
3332 ret void
3433}
3534
36- define void @inboundsNonchained (ptr %in.ptr , i32 %in.idx1 ) {
35+ define void @inboundsNonNegative (ptr %in.ptr , i64 %in.idx1 ) {
36+ ; CHECK-LABEL: define void @inboundsNonNegative(
37+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
38+ ; CHECK-NEXT: entry:
39+ ; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
40+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <2 x i8>, ptr [[IN_PTR]], i64 [[IDXPROM]]
41+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <2 x i8>, ptr [[TMP0]], i64 1
42+ ; CHECK-NEXT: ret void
43+ ;
44+ entry:
45+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
46+ %const1 = getelementptr inbounds <2 x i8 >, ptr %in.ptr , i64 1
47+ %idx1 = getelementptr inbounds <2 x i8 >, ptr %const1 , i64 %in.idx1.nneg
48+ ret void
49+ }
50+
51+ define void @inboundsNonchained (ptr %in.ptr , i64 %in.idx1 ) {
3752; CHECK-LABEL: define void @inboundsNonchained(
38- ; CHECK-SAME: ptr [[IN_PTR:%.*]], i32 [[IN_IDX1:%.*]]) #[[ATTR0]] {
53+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
3954; CHECK-NEXT: entry:
40- ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i32 [[IN_IDX1]], 2147483647
41- ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[IN_IDX1_NNEG]] to i64
55+ ; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
4256; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <2 x i8>, ptr [[IN_PTR]], i64 [[IDXPROM]]
43- ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <2 x i8>, ptr [[TMP0]], i32 1
57+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <2 x i8>, ptr [[TMP0]], i64 1
4458; CHECK-NEXT: ret void
4559;
4660entry:
47- %in.idx1.nneg = and i32 %in.idx1 , 2147483647
48- %const1 = getelementptr inbounds <2 x i8 >, ptr %in.ptr , i32 1
49- %idx1 = getelementptr <2 x i8 >, ptr %const1 , i32 %in.idx1.nneg
61+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
62+ %const1 = getelementptr inbounds <2 x i8 >, ptr %in.ptr , i64 1
63+ %idx1 = getelementptr <2 x i8 >, ptr %const1 , i64 %in.idx1.nneg
5064 ret void
5165}
5266
53- define void @inboundsNonNegativeType_i16i8 (ptr %in.ptr , i32 %in.idx1 ) {
67+ define void @inboundsNonNegativeType_i16i8 (ptr %in.ptr , i64 %in.idx1 ) {
5468; CHECK-LABEL: define void @inboundsNonNegativeType_i16i8(
55- ; CHECK-SAME: ptr [[IN_PTR:%.*]], i32 [[IN_IDX1:%.*]]) #[[ATTR0]] {
69+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
5670; CHECK-NEXT: entry:
57- ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i32 [[IN_IDX1]], 2147483647
58- ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[IN_IDX1_NNEG]] to i64
71+ ; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
5972; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[IN_PTR]], i64 [[IDXPROM]]
60- ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[TMP0]], i32 1024
73+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[TMP0]], i64 1024
6174; CHECK-NEXT: ret void
6275;
6376entry:
64- %in.idx1.nneg = and i32 %in.idx1 , 2147483647
65- %const1 = getelementptr inbounds i16 , ptr %in.ptr , i32 1024
66- %idx1 = getelementptr inbounds i8 , ptr %const1 , i32 %in.idx1.nneg
77+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
78+ %const1 = getelementptr inbounds i16 , ptr %in.ptr , i64 1024
79+ %idx1 = getelementptr inbounds i8 , ptr %const1 , i64 %in.idx1.nneg
6780 ret void
6881}
6982
70- define void @inboundsNonNegative_i8i16 (ptr %in.ptr , i32 %in.idx1 ) {
83+ define void @inboundsNonNegative_i8i16 (ptr %in.ptr , i64 %in.idx1 ) {
7184; CHECK-LABEL: define void @inboundsNonNegative_i8i16(
72- ; CHECK-SAME: ptr [[IN_PTR:%.*]], i32 [[IN_IDX1:%.*]]) #[[ATTR0]] {
85+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
7386; CHECK-NEXT: entry:
74- ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i32 [[IN_IDX1]], 2147483647
75- ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[IN_IDX1_NNEG]] to i64
87+ ; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
7688; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i16, ptr [[IN_PTR]], i64 [[IDXPROM]]
77- ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i32 1024
89+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 1024
7890; CHECK-NEXT: ret void
7991;
8092entry:
81- %in.idx1.nneg = and i32 %in.idx1 , 2147483647
82- %const1 = getelementptr inbounds i8 , ptr %in.ptr , i32 1024
83- %idx1 = getelementptr inbounds i16 , ptr %const1 , i32 %in.idx1.nneg
93+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
94+ %const1 = getelementptr inbounds i8 , ptr %in.ptr , i64 1024
95+ %idx1 = getelementptr inbounds i16 , ptr %const1 , i64 %in.idx1.nneg
96+ ret void
97+ }
98+
99+ define void @inboundsNonchained_first (ptr %in.ptr , i64 %in.idx1 ) {
100+ ; CHECK-LABEL: define void @inboundsNonchained_first(
101+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
102+ ; CHECK-NEXT: entry:
103+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
104+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]
105+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i64 1024
106+ ; CHECK-NEXT: ret void
107+ ;
108+ entry:
109+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
110+ %const1 = getelementptr inbounds i8 , ptr %in.ptr , i64 1024
111+ %idx1 = getelementptr i32 , ptr %const1 , i64 %in.idx1.nneg
112+ ret void
113+ }
114+
115+ define void @inboundsNonchained_second (ptr %in.ptr , i64 %in.idx1 ) {
116+ ; CHECK-LABEL: define void @inboundsNonchained_second(
117+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
118+ ; CHECK-NEXT: entry:
119+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
120+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i64, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]
121+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i64 1024
122+ ; CHECK-NEXT: ret void
123+ ;
124+ entry:
125+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
126+ %const1 = getelementptr i8 , ptr %in.ptr , i64 1024
127+ %idx1 = getelementptr inbounds i64 , ptr %const1 , i64 %in.idx1.nneg
128+ ret void
129+ }
130+
131+ define void @notInbounds (ptr %in.ptr , i64 %in.idx1 ) {
132+ ; CHECK-LABEL: define void @notInbounds(
133+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
134+ ; CHECK-NEXT: entry:
135+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
136+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i128, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]
137+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i64 1024
138+ ; CHECK-NEXT: ret void
139+ ;
140+ entry:
141+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
142+ %const1 = getelementptr i8 , ptr %in.ptr , i64 1024
143+ %idx1 = getelementptr i128 , ptr %const1 , i64 %in.idx1.nneg
144+ ret void
145+ }
146+
147+ define void @vectorType1 (ptr %in.ptr , i64 %in.idx1 ) {
148+ ; CHECK-LABEL: define void @badVectorType(
149+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
150+ ; CHECK-NEXT: entry:
151+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647
152+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <2 x i8>, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]
153+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <4 x i8>, ptr [[TMP0]], i32 3
154+ ; CHECK-NEXT: ret void
155+ ;
156+ entry:
157+ %in.idx1.nneg = and i64 %in.idx1 , 2147483647
158+ %const1 = getelementptr inbounds <4 x i8 >, ptr %in.ptr , i32 3
159+ %idx1 = getelementptr inbounds <2 x i8 >, ptr %const1 , i64 %in.idx1.nneg
160+ ret void
161+ }
162+
163+ define void @vectorType2 (ptr %in.ptr , i64 %in.idx1 ) {
164+ ; CHECK-LABEL: define void @badVectorType2(
165+ ; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
166+ ; CHECK-NEXT: entry:
167+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647
168+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <4 x half>, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]
169+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <4 x i8>, ptr [[TMP0]], i32 1
170+ ; CHECK-NEXT: ret void
171+ ;
172+ entry:
173+ %in.idx1.nneg = and i64 %in.idx1 , 2147483647
174+ %const1 = getelementptr inbounds <4 x i8 >, ptr %in.ptr , i32 1
175+ %idx1 = getelementptr inbounds <4 x half >, ptr %const1 , i64 %in.idx1.nneg
176+ ret void
177+ }
178+
179+ define void @addrspace1 (ptr addrspace (1 ) %in.ptr , i64 %in.idx1 ) {
180+ ; CHECK-LABEL: define void @addrspace1(
181+ ; CHECK-SAME: ptr addrspace(1) [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
182+ ; CHECK-NEXT: entry:
183+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
184+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i128, ptr addrspace(1) [[IN_PTR]], i64 [[IN_IDX1_NNEG]]
185+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP0]], i64 1024
186+ ; CHECK-NEXT: ret void
187+ ;
188+ entry:
189+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
190+ %const1 = getelementptr inbounds i8 , ptr addrspace (1 ) %in.ptr , i64 1024
191+ %idx1 = getelementptr inbounds i128 , ptr addrspace (1 ) %const1 , i64 %in.idx1.nneg
192+ ret void
193+ }
194+
195+ define void @addrspace3 (ptr addrspace (3 ) %in.ptr , i64 %in.idx1 ) {
196+ ; CHECK-LABEL: define void @addrspace3(
197+ ; CHECK-SAME: ptr addrspace(3) [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
198+ ; CHECK-NEXT: entry:
199+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
200+ ; CHECK-NEXT: [[IDXPROM:%.*]] = trunc i64 [[IN_IDX1_NNEG]] to i32
201+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i128, ptr addrspace(3) [[IN_PTR]], i32 [[IDXPROM]]
202+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr addrspace(3) [[TMP0]], i64 1024
203+ ; CHECK-NEXT: ret void
204+ ;
205+ entry:
206+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
207+ %const1 = getelementptr inbounds i8 , ptr addrspace (3 ) %in.ptr , i64 1024
208+ %idx1 = getelementptr inbounds i128 , ptr addrspace (3 ) %const1 , i64 %in.idx1.nneg
209+ ret void
210+ }
211+
212+ define void @addrspace7 (ptr addrspace (7 ) %in.ptr , i64 %in.idx1 ) {
213+ ; CHECK-LABEL: define void @addrspace7(
214+ ; CHECK-SAME: ptr addrspace(7) [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {
215+ ; CHECK-NEXT: entry:
216+ ; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807
217+ ; CHECK-NEXT: [[IDXPROM:%.*]] = trunc i64 [[IN_IDX1_NNEG]] to i32
218+ ; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i128, ptr addrspace(7) [[IN_PTR]], i32 [[IDXPROM]]
219+ ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr addrspace(7) [[TMP0]], i64 1024
220+ ; CHECK-NEXT: ret void
221+ ;
222+ entry:
223+ %in.idx1.nneg = and i64 %in.idx1 , 9223372036854775807
224+ %const1 = getelementptr inbounds i8 , ptr addrspace (7 ) %in.ptr , i64 1024
225+ %idx1 = getelementptr inbounds i128 , ptr addrspace (7 ) %const1 , i64 %in.idx1.nneg
84226 ret void
85227}
0 commit comments