xref: /llvm-project/llvm/test/Transforms/InstCombine/array.ll (revision 462cb3cd6cecd0511ecaf0e3ebcaba455ece587d)
1f7247d50SLiqinWeng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2f7247d50SLiqinWeng; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3f7247d50SLiqinWeng
4f7247d50SLiqinWengdefine void @test(ptr %ptr, i32 %a, i32 %b) {
5f7247d50SLiqinWeng; CHECK-LABEL: define void @test(
6f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
7f7247d50SLiqinWeng; CHECK-NEXT:  entry:
8f7247d50SLiqinWeng; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[A]] to i64
9f7247d50SLiqinWeng; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP0]]
1090ba3309SNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP1]], i64 40
11f7247d50SLiqinWeng; CHECK-NEXT:    store i32 [[B]], ptr [[GEP]], align 4
12f7247d50SLiqinWeng; CHECK-NEXT:    ret void
13f7247d50SLiqinWeng;
14f7247d50SLiqinWengentry:
15f7247d50SLiqinWeng  %add = add nsw i32 %a, 10
16f7247d50SLiqinWeng  %idx = sext i32 %add to i64
17f7247d50SLiqinWeng  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
18f7247d50SLiqinWeng  store i32 %b, ptr %gep
19f7247d50SLiqinWeng  ret void
20f7247d50SLiqinWeng}
21f7247d50SLiqinWeng
22f7247d50SLiqinWengdefine  i32 @test_add_res_moreoneuse(ptr %ptr, i32 %a, i32 %b) {
23f7247d50SLiqinWeng; CHECK-LABEL: define i32 @test_add_res_moreoneuse(
24f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
25f7247d50SLiqinWeng; CHECK-NEXT:  entry:
26f7247d50SLiqinWeng; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 5
27f7247d50SLiqinWeng; CHECK-NEXT:    [[IDX:%.*]] = sext i32 [[ADD]] to i64
28f7247d50SLiqinWeng; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[IDX]]
29f7247d50SLiqinWeng; CHECK-NEXT:    store i32 [[B]], ptr [[GEP]], align 4
30f7247d50SLiqinWeng; CHECK-NEXT:    ret i32 [[ADD]]
31f7247d50SLiqinWeng;
32f7247d50SLiqinWengentry:
33f7247d50SLiqinWeng  %add = add nsw i32 %a, 5
34f7247d50SLiqinWeng  %idx = sext i32 %add to i64
35f7247d50SLiqinWeng  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
36f7247d50SLiqinWeng  store i32 %b, ptr %gep
37f7247d50SLiqinWeng  ret i32 %add
38f7247d50SLiqinWeng}
39f7247d50SLiqinWeng
40f7247d50SLiqinWengdefine void @test_addop_nonsw_flag(ptr %ptr, i32 %a, i32 %b) {
41f7247d50SLiqinWeng; CHECK-LABEL: define void @test_addop_nonsw_flag(
42f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
43f7247d50SLiqinWeng; CHECK-NEXT:  entry:
44f7247d50SLiqinWeng; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[A]], 10
45f7247d50SLiqinWeng; CHECK-NEXT:    [[IDX:%.*]] = sext i32 [[ADD]] to i64
46f7247d50SLiqinWeng; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[IDX]]
47f7247d50SLiqinWeng; CHECK-NEXT:    store i32 [[B]], ptr [[GEP]], align 4
48f7247d50SLiqinWeng; CHECK-NEXT:    ret void
49f7247d50SLiqinWeng;
50f7247d50SLiqinWengentry:
51f7247d50SLiqinWeng  %add = add i32 %a, 10
52f7247d50SLiqinWeng  %idx = sext i32 %add to i64
53f7247d50SLiqinWeng  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
54f7247d50SLiqinWeng  store i32 %b, ptr %gep
55f7247d50SLiqinWeng  ret void
56f7247d50SLiqinWeng}
57f7247d50SLiqinWeng
58f7247d50SLiqinWengdefine void @test_add_op2_not_constant(ptr %ptr, i32 %a, i32 %b) {
59f7247d50SLiqinWeng; CHECK-LABEL: define void @test_add_op2_not_constant(
60f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
61f7247d50SLiqinWeng; CHECK-NEXT:  entry:
62f7247d50SLiqinWeng; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[A]], [[B]]
63f7247d50SLiqinWeng; CHECK-NEXT:    [[IDX:%.*]] = sext i32 [[ADD]] to i64
64f7247d50SLiqinWeng; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[IDX]]
65f7247d50SLiqinWeng; CHECK-NEXT:    store i32 [[B]], ptr [[GEP]], align 4
66f7247d50SLiqinWeng; CHECK-NEXT:    ret void
67f7247d50SLiqinWeng;
68f7247d50SLiqinWengentry:
69f7247d50SLiqinWeng  %add = add i32 %a, %b
70f7247d50SLiqinWeng  %idx = sext i32 %add to i64
71f7247d50SLiqinWeng  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
72f7247d50SLiqinWeng  store i32 %b, ptr %gep
73f7247d50SLiqinWeng  ret void
74f7247d50SLiqinWeng}
754d711243SNikita Popov
764d711243SNikita Popovdefine void @test_zext_nneg(ptr %ptr, i32 %a, i32 %b) {
774d711243SNikita Popov; CHECK-LABEL: define void @test_zext_nneg(
784d711243SNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
794d711243SNikita Popov; CHECK-NEXT:  entry:
80b8df88b4SNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[A]] to i64
81b8df88b4SNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP0]]
8290ba3309SNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP1]], i64 40
834d711243SNikita Popov; CHECK-NEXT:    store i32 [[B]], ptr [[GEP]], align 4
844d711243SNikita Popov; CHECK-NEXT:    ret void
854d711243SNikita Popov;
864d711243SNikita Popoventry:
874d711243SNikita Popov  %add = add nsw i32 %a, 10
884d711243SNikita Popov  %idx = zext nneg i32 %add to i64
894d711243SNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
904d711243SNikita Popov  store i32 %b, ptr %gep
914d711243SNikita Popov  ret void
924d711243SNikita Popov}
934d711243SNikita Popov
944d711243SNikita Popovdefine void @test_zext_missing_nneg(ptr %ptr, i32 %a, i32 %b) {
954d711243SNikita Popov; CHECK-LABEL: define void @test_zext_missing_nneg(
964d711243SNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
974d711243SNikita Popov; CHECK-NEXT:  entry:
984d711243SNikita Popov; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[A]], 10
994d711243SNikita Popov; CHECK-NEXT:    [[IDX:%.*]] = zext i32 [[ADD]] to i64
100*462cb3cdSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[PTR]], i64 [[IDX]]
1014d711243SNikita Popov; CHECK-NEXT:    store i32 [[B]], ptr [[GEP]], align 4
1024d711243SNikita Popov; CHECK-NEXT:    ret void
1034d711243SNikita Popov;
1044d711243SNikita Popoventry:
1054d711243SNikita Popov  %add = add nsw i32 %a, 10
1064d711243SNikita Popov  %idx = zext i32 %add to i64
1074d711243SNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
1084d711243SNikita Popov  store i32 %b, ptr %gep
1094d711243SNikita Popov  ret void
1104d711243SNikita Popov}
111c8edf11dSNikita Popov
112c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_nsw_nonneg(ptr %ptr, i64 %a, i64 %b) {
113c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_nsw_nonneg(
114c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
115c8edf11dSNikita Popov; CHECK-NEXT:    [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1
116c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NNEG]])
117c8edf11dSNikita Popov; CHECK-NEXT:    [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1
118c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[B_NNEG]])
119*462cb3cdSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw i32, ptr [[PTR]], i64 [[A]]
120*462cb3cdSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP1]], i64 [[B]]
121c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
122c8edf11dSNikita Popov;
123c8edf11dSNikita Popov  %a.nneg = icmp sgt i64 %a, -1
124c8edf11dSNikita Popov  call void @llvm.assume(i1 %a.nneg)
125c8edf11dSNikita Popov  %b.nneg = icmp sgt i64 %b, -1
126c8edf11dSNikita Popov  call void @llvm.assume(i1 %b.nneg)
127c8edf11dSNikita Popov  %add = add nsw i64 %a, %b
128c8edf11dSNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %add
129c8edf11dSNikita Popov  ret ptr %gep
130c8edf11dSNikita Popov}
131c8edf11dSNikita Popov
132c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_nsw_not_nonneg1(ptr %ptr, i64 %a, i64 %b) {
133c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_nsw_not_nonneg1(
134c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
135c8edf11dSNikita Popov; CHECK-NEXT:    [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1
136c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NNEG]])
137c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]]
138c8edf11dSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]]
139c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
140c8edf11dSNikita Popov;
141c8edf11dSNikita Popov  %a.nneg = icmp sgt i64 %a, -1
142c8edf11dSNikita Popov  call void @llvm.assume(i1 %a.nneg)
143c8edf11dSNikita Popov  %add = add nsw i64 %a, %b
144c8edf11dSNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %add
145c8edf11dSNikita Popov  ret ptr %gep
146c8edf11dSNikita Popov}
147c8edf11dSNikita Popov
148c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_nsw_not_nonneg2(ptr %ptr, i64 %a, i64 %b) {
149c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_nsw_not_nonneg2(
150c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
151c8edf11dSNikita Popov; CHECK-NEXT:    [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1
152c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[B_NNEG]])
153c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]]
154c8edf11dSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]]
155c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
156c8edf11dSNikita Popov;
157c8edf11dSNikita Popov  %b.nneg = icmp sgt i64 %b, -1
158c8edf11dSNikita Popov  call void @llvm.assume(i1 %b.nneg)
159c8edf11dSNikita Popov  %add = add nsw i64 %a, %b
160c8edf11dSNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %add
161c8edf11dSNikita Popov  ret ptr %gep
162c8edf11dSNikita Popov}
163c8edf11dSNikita Popov
164c8edf11dSNikita Popovdefine ptr @gep_not_inbounds_add_nsw_nonneg(ptr %ptr, i64 %a, i64 %b) {
165c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_not_inbounds_add_nsw_nonneg(
166c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
167c8edf11dSNikita Popov; CHECK-NEXT:    [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1
168c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NNEG]])
169c8edf11dSNikita Popov; CHECK-NEXT:    [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1
170c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[B_NNEG]])
171c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]]
172c8edf11dSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]]
173c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
174c8edf11dSNikita Popov;
175c8edf11dSNikita Popov  %a.nneg = icmp sgt i64 %a, -1
176c8edf11dSNikita Popov  call void @llvm.assume(i1 %a.nneg)
177c8edf11dSNikita Popov  %b.nneg = icmp sgt i64 %b, -1
178c8edf11dSNikita Popov  call void @llvm.assume(i1 %b.nneg)
179c8edf11dSNikita Popov  %add = add nsw i64 %a, %b
180c8edf11dSNikita Popov  %gep = getelementptr i32, ptr %ptr, i64 %add
181c8edf11dSNikita Popov  ret ptr %gep
182c8edf11dSNikita Popov}
183c8edf11dSNikita Popov
184c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_not_nsw_nonneg(ptr %ptr, i64 %a, i64 %b) {
185c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_not_nsw_nonneg(
186c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
187c8edf11dSNikita Popov; CHECK-NEXT:    [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1
188c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NNEG]])
189c8edf11dSNikita Popov; CHECK-NEXT:    [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1
190c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[B_NNEG]])
191c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]]
192c8edf11dSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]]
193c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
194c8edf11dSNikita Popov;
195c8edf11dSNikita Popov  %a.nneg = icmp sgt i64 %a, -1
196c8edf11dSNikita Popov  call void @llvm.assume(i1 %a.nneg)
197c8edf11dSNikita Popov  %b.nneg = icmp sgt i64 %b, -1
198c8edf11dSNikita Popov  call void @llvm.assume(i1 %b.nneg)
199c8edf11dSNikita Popov  %add = add i64 %a, %b
200c8edf11dSNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %add
201c8edf11dSNikita Popov  ret ptr %gep
202c8edf11dSNikita Popov}
203c8edf11dSNikita Popov
204c8edf11dSNikita Popovdefine ptr @gep_inbounds_sext_add_nonneg(ptr %ptr, i32 %a) {
205c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_sext_add_nonneg(
206c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) {
207c8edf11dSNikita Popov; CHECK-NEXT:    [[A_NNEG:%.*]] = icmp sgt i32 [[A]], -1
208c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NNEG]])
209c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = zext nneg i32 [[A]] to i64
210*462cb3cdSNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw i32, ptr [[PTR]], i64 [[TMP1]]
211*462cb3cdSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP2]], i64 40
212c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
213c8edf11dSNikita Popov;
214c8edf11dSNikita Popov  %a.nneg = icmp sgt i32 %a, -1
215c8edf11dSNikita Popov  call void @llvm.assume(i1 %a.nneg)
216c8edf11dSNikita Popov  %add = add nsw i32 %a, 10
217c8edf11dSNikita Popov  %idx = sext i32 %add to i64
218c8edf11dSNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
219c8edf11dSNikita Popov  ret ptr %gep
220c8edf11dSNikita Popov}
221c8edf11dSNikita Popov
222c8edf11dSNikita Popovdefine ptr @gep_inbounds_sext_add_not_nonneg_1(ptr %ptr, i32 %a) {
223c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_sext_add_not_nonneg_1(
224c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) {
225c8edf11dSNikita Popov; CHECK-NEXT:    [[A_NNEG:%.*]] = icmp sgt i32 [[A]], -1
226c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NNEG]])
227c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = zext nneg i32 [[A]] to i64
228c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP1]]
229c8edf11dSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 -40
230c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
231c8edf11dSNikita Popov;
232c8edf11dSNikita Popov  %a.nneg = icmp sgt i32 %a, -1
233c8edf11dSNikita Popov  call void @llvm.assume(i1 %a.nneg)
234c8edf11dSNikita Popov  %add = add nsw i32 %a, -10
235c8edf11dSNikita Popov  %idx = sext i32 %add to i64
236c8edf11dSNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
237c8edf11dSNikita Popov  ret ptr %gep
238c8edf11dSNikita Popov}
239c8edf11dSNikita Popov
240c8edf11dSNikita Popovdefine ptr @gep_inbounds_sext_add_not_nonneg_2(ptr %ptr, i32 %a) {
241c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_sext_add_not_nonneg_2(
242c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) {
243c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = sext i32 [[A]] to i64
244c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP1]]
245c8edf11dSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 40
246c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
247c8edf11dSNikita Popov;
248c8edf11dSNikita Popov  %add = add nsw i32 %a, 10
249c8edf11dSNikita Popov  %idx = sext i32 %add to i64
250c8edf11dSNikita Popov  %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx
251c8edf11dSNikita Popov  ret ptr %gep
252c8edf11dSNikita Popov}
253c8edf11dSNikita Popov
254c8edf11dSNikita Popovdefine ptr @gep_not_inbounds_sext_add_nonneg(ptr %ptr, i32 %a) {
255c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_not_inbounds_sext_add_nonneg(
256c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) {
257c8edf11dSNikita Popov; CHECK-NEXT:    [[A_NNEG:%.*]] = icmp sgt i32 [[A]], -1
258c8edf11dSNikita Popov; CHECK-NEXT:    call void @llvm.assume(i1 [[A_NNEG]])
259c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP1:%.*]] = zext nneg i32 [[A]] to i64
260c8edf11dSNikita Popov; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP1]]
261c8edf11dSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 40
262c8edf11dSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
263c8edf11dSNikita Popov;
264c8edf11dSNikita Popov  %a.nneg = icmp sgt i32 %a, -1
265c8edf11dSNikita Popov  call void @llvm.assume(i1 %a.nneg)
266c8edf11dSNikita Popov  %add = add nsw i32 %a, 10
267c8edf11dSNikita Popov  %idx = sext i32 %add to i64
268c8edf11dSNikita Popov  %gep = getelementptr i32, ptr %ptr, i64 %idx
269c8edf11dSNikita Popov  ret ptr %gep
270c8edf11dSNikita Popov}
271