xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/gep-add-multiple-indices.ll (revision d045e23c2d00a445e40a8c97471df023d8364f59)
1d4210800SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2d4210800SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3d4210800SFlorian Hahn
4d4210800SFlorian Hahntarget datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
5d4210800SFlorian Hahn
62de8f1f6SFlorian Hahndefine i1 @test_outer_gep_last_index_no_overflow_all_inbounds_1(ptr %dst) {
72de8f1f6SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_1(
8d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
9d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
10d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
11ee605b0aSFlorian Hahn; CHECK-NEXT:    ret i1 true
12d4210800SFlorian Hahn;
13d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
14d4210800SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
15d4210800SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
16d4210800SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
17d4210800SFlorian Hahn  ret i1 %c.1
18d4210800SFlorian Hahn}
19d4210800SFlorian Hahn
202de8f1f6SFlorian Hahndefine i1 @test_outer_gep_last_index_no_overflow_all_inbounds_2(ptr %dst) {
212de8f1f6SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_2(
222de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
232de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 3
242de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
25ee605b0aSFlorian Hahn; CHECK-NEXT:    ret i1 true
262de8f1f6SFlorian Hahn;
272de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
282de8f1f6SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 3
292de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
302de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
312de8f1f6SFlorian Hahn  ret i1 %c.1
322de8f1f6SFlorian Hahn}
332de8f1f6SFlorian Hahn
34d4210800SFlorian Hahndefine i1 @test_outer_gep_last_index_overflow_all_inbounds(ptr %dst) {
35d4210800SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_overflow_all_inbounds(
36d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
37d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
38d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 2
39ee605b0aSFlorian Hahn; CHECK-NEXT:    ret i1 false
40d4210800SFlorian Hahn;
41d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
42d4210800SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
43d4210800SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 2
44d4210800SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
45d4210800SFlorian Hahn  ret i1 %c
46d4210800SFlorian Hahn}
47d4210800SFlorian Hahn
48d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_all_inbounds(ptr %dst) {
49d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_all_inbounds(
50d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
51d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
52d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
53*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 true
54d4210800SFlorian Hahn;
55d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
56d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
57d4210800SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
58d4210800SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
59d4210800SFlorian Hahn  ret i1 %c
60d4210800SFlorian Hahn}
61d4210800SFlorian Hahn
62d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds(ptr %dst) {
63d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds(
64d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
65d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
66d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
67*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 true
68d4210800SFlorian Hahn;
69d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
70d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
71d4210800SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
72d4210800SFlorian Hahn  %c = icmp uge ptr %gep.1, %dst.0
73d4210800SFlorian Hahn  ret i1 %c
74d4210800SFlorian Hahn}
75d4210800SFlorian Hahn
76d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_false_all_inbounds(ptr %dst) {
77d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_all_inbounds(
78d4210800SFlorian Hahn; CHECK-NEXT:  entry:
79d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
80d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
81d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 2
82*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 false
83d4210800SFlorian Hahn;
84d4210800SFlorian Hahnentry:
85d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
86d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
87d4210800SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 2
88d4210800SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
89d4210800SFlorian Hahn  ret i1 %c
90d4210800SFlorian Hahn}
91d4210800SFlorian Hahn
92d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds_2(ptr %dst) {
93d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds_2(
94d4210800SFlorian Hahn; CHECK-NEXT:  entry:
95d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
96d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
97d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 2
98*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 true
99d4210800SFlorian Hahn;
100d4210800SFlorian Hahnentry:
101d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
102d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
103d4210800SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 2
104d4210800SFlorian Hahn  %c = icmp uge ptr %gep.1, %dst.0
105d4210800SFlorian Hahn  ret i1 %c
106d4210800SFlorian Hahn}
107d4210800SFlorian Hahn
108d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow(ptr %dst) {
109d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow(
110d4210800SFlorian Hahn; CHECK-NEXT:  entry:
111d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
112d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 6
113d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2
114d4210800SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]
115d4210800SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
116d4210800SFlorian Hahn;
117d4210800SFlorian Hahnentry:
118d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
119d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 6
12034e477e9SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 2
12134e477e9SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
122d4210800SFlorian Hahn  ret i1 %c
123d4210800SFlorian Hahn}
124d4210800SFlorian Hahn
125d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds(ptr %dst) {
126d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds(
127d4210800SFlorian Hahn; CHECK-NEXT:  entry:
128d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
129d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
130d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1
131d4210800SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]
132d4210800SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
133d4210800SFlorian Hahn;
134d4210800SFlorian Hahnentry:
135d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
136d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
137d4210800SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 1
13834e477e9SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
139d4210800SFlorian Hahn  ret i1 %c
140d4210800SFlorian Hahn}
141d4210800SFlorian Hahn
142d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds(ptr %dst) {
143d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds(
144d4210800SFlorian Hahn; CHECK-NEXT:  entry:
145d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
146d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
147d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1
148d4210800SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]
149d4210800SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
150d4210800SFlorian Hahn;
151d4210800SFlorian Hahnentry:
152d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
153d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
154d4210800SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 1
15534e477e9SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
156d4210800SFlorian Hahn  ret i1 %c
157d4210800SFlorian Hahn}
158d4210800SFlorian Hahn
159d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds(ptr %dst) {
160d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds(
161d4210800SFlorian Hahn; CHECK-NEXT:  entry:
162d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
163d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
164d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2
165d4210800SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]
166d4210800SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
167d4210800SFlorian Hahn;
168d4210800SFlorian Hahnentry:
169d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
170d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
17134e477e9SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 2
17234e477e9SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
173d4210800SFlorian Hahn  ret i1 %c
174d4210800SFlorian Hahn}
175d4210800SFlorian Hahn
176d4210800SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow(ptr %dst) {
177d4210800SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow(
178d4210800SFlorian Hahn; CHECK-NEXT:  entry:
179d4210800SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
180d4210800SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 5
181d4210800SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2
182d4210800SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]
183d4210800SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
184d4210800SFlorian Hahn;
185d4210800SFlorian Hahnentry:
186d4210800SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
187d4210800SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 5
18834e477e9SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 2
18934e477e9SFlorian Hahn  %c = icmp ult ptr %gep.1, %upper
190d4210800SFlorian Hahn  ret i1 %c
191d4210800SFlorian Hahn}
1922de8f1f6SFlorian Hahn
1932de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index(ptr %dst) {
1942de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index(
1952de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
1962de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
1972de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
198ee605b0aSFlorian Hahn; CHECK-NEXT:    ret i1 true
1992de8f1f6SFlorian Hahn;
2002de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
2012de8f1f6SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
2022de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
2032de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
2042de8f1f6SFlorian Hahn  ret i1 %c.1
2052de8f1f6SFlorian Hahn}
2062de8f1f6SFlorian Hahn
2072de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds(ptr %dst) {
2082de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds(
2092de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
2102de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
2112de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
212*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 true
2132de8f1f6SFlorian Hahn;
2142de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
2152de8f1f6SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
2162de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
2172de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
2182de8f1f6SFlorian Hahn  ret i1 %c.1
2192de8f1f6SFlorian Hahn}
2202de8f1f6SFlorian Hahn
2212de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_1(ptr %dst) {
2222de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_1(
2232de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 1
2242de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2
2252de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
226*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 false
2272de8f1f6SFlorian Hahn;
2282de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 1
2292de8f1f6SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 2
2302de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2312de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
2322de8f1f6SFlorian Hahn  ret i1 %c.1
2332de8f1f6SFlorian Hahn}
2342de8f1f6SFlorian Hahn
2352de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_2(ptr %dst) {
2362de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_2(
2372de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0
2382de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2
2392de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
240*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 false
2412de8f1f6SFlorian Hahn;
2422de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0
2432de8f1f6SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 2
2442de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2452de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
2462de8f1f6SFlorian Hahn  ret i1 %c.1
2472de8f1f6SFlorian Hahn}
2482de8f1f6SFlorian Hahn
2492de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_3(ptr %dst) {
2502de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_3(
2512de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0
2522de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3
2532de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
254*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 false
2552de8f1f6SFlorian Hahn;
2562de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0
2572de8f1f6SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 3
2582de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2592de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
2602de8f1f6SFlorian Hahn  ret i1 %c.1
2612de8f1f6SFlorian Hahn}
2622de8f1f6SFlorian Hahn
2632de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_4(ptr %dst) {
2642de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_4(
2652de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0
2662de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 4
2672de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
268*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 true
2692de8f1f6SFlorian Hahn;
2702de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0
2712de8f1f6SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 4
2722de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2732de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
2742de8f1f6SFlorian Hahn  ret i1 %c.1
2752de8f1f6SFlorian Hahn}
2762de8f1f6SFlorian Hahn
2772de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_5(i64 %off, ptr %dst) {
2782de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_5(
2792de8f1f6SFlorian Hahn; CHECK-NEXT:    [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2
2802de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0
2812de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5
2822de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
283*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 true
2842de8f1f6SFlorian Hahn;
2852de8f1f6SFlorian Hahn  %off.ult = icmp ule i64 %off, 2
2862de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0
2872de8f1f6SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 5
2882de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2892de8f1f6SFlorian Hahn  %c.1 = icmp ule ptr %gep.1, %upper
2902de8f1f6SFlorian Hahn  ret i1 %c.1
2912de8f1f6SFlorian Hahn}
2922de8f1f6SFlorian Hahn
2932de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_6(i64 %off, ptr %dst) {
2942de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_6(
2952de8f1f6SFlorian Hahn; CHECK-NEXT:    [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2
2962de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0
2972de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5
2982de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
299*d045e23cSFlorian Hahn; CHECK-NEXT:    ret i1 false
3002de8f1f6SFlorian Hahn;
3012de8f1f6SFlorian Hahn  %off.ult = icmp ule i64 %off, 2
3022de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0
3032de8f1f6SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 5
3042de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
3052de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
3062de8f1f6SFlorian Hahn  ret i1 %c.1
3072de8f1f6SFlorian Hahn}
3082de8f1f6SFlorian Hahn
3092de8f1f6SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_7(i64 %off, ptr %dst) {
3102de8f1f6SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_7(
3112de8f1f6SFlorian Hahn; CHECK-NEXT:    [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2
3122de8f1f6SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0
3132de8f1f6SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[OFF]]
3142de8f1f6SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
3152de8f1f6SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]
3162de8f1f6SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
3172de8f1f6SFlorian Hahn;
3182de8f1f6SFlorian Hahn  %off.ult = icmp ule i64 %off, 2
3192de8f1f6SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0
3202de8f1f6SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 %off
3212de8f1f6SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
3222de8f1f6SFlorian Hahn  %c.1 = icmp ult ptr %gep.1, %upper
3232de8f1f6SFlorian Hahn  ret i1 %c.1
3242de8f1f6SFlorian Hahn}
325