11b1696b2SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
21b1696b2SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
31b1696b2SFlorian Hahn
41b1696b2SFlorian Hahntarget datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
51b1696b2SFlorian Hahn
61b1696b2SFlorian Hahndefine i1 @test_outer_gep_last_index_no_overflow_all_inbounds_1(ptr %dst) {
71b1696b2SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_1(
81b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
91b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
101b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
111b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
121b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
131b1696b2SFlorian Hahn;
141b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
151b1696b2SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
161b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
171b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
181b1696b2SFlorian Hahn  ret i1 %c.1
191b1696b2SFlorian Hahn}
201b1696b2SFlorian Hahn
211b1696b2SFlorian Hahndefine i1 @test_outer_gep_last_index_no_overflow_all_inbounds_2(ptr %dst) {
221b1696b2SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_2(
231b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
241b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 3
251b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
261b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
271b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
281b1696b2SFlorian Hahn;
291b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
301b1696b2SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 3
311b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
321b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
331b1696b2SFlorian Hahn  ret i1 %c.1
341b1696b2SFlorian Hahn}
351b1696b2SFlorian Hahn
361b1696b2SFlorian Hahndefine i1 @test_outer_gep_last_index_overflow_all_inbounds(ptr %dst) {
371b1696b2SFlorian Hahn; CHECK-LABEL: @test_outer_gep_last_index_overflow_all_inbounds(
381b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
391b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
401b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 2
411b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
421b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
431b1696b2SFlorian Hahn;
441b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
451b1696b2SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
461b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 2
471b1696b2SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
481b1696b2SFlorian Hahn  ret i1 %c
491b1696b2SFlorian Hahn}
501b1696b2SFlorian Hahn
511b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_all_inbounds(ptr %dst) {
521b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_all_inbounds(
531b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
541b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
551b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
561b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
571b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
581b1696b2SFlorian Hahn;
591b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
601b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
611b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
621b1696b2SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
631b1696b2SFlorian Hahn  ret i1 %c
641b1696b2SFlorian Hahn}
651b1696b2SFlorian Hahn
661b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds(ptr %dst) {
671b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds(
681b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
691b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
701b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
711b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp sge ptr [[GEP_1]], [[DST_0]]
721b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
731b1696b2SFlorian Hahn;
741b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
751b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
761b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
771b1696b2SFlorian Hahn  %c = icmp sge ptr %gep.1, %dst.0
781b1696b2SFlorian Hahn  ret i1 %c
791b1696b2SFlorian Hahn}
801b1696b2SFlorian Hahn
811b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_false_all_inbounds(ptr %dst) {
821b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_all_inbounds(
831b1696b2SFlorian Hahn; CHECK-NEXT:  entry:
841b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
851b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
861b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 2
871b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
881b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
891b1696b2SFlorian Hahn;
901b1696b2SFlorian Hahnentry:
911b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
921b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
931b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 2
941b1696b2SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
951b1696b2SFlorian Hahn  ret i1 %c
961b1696b2SFlorian Hahn}
971b1696b2SFlorian Hahn
981b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds_2(ptr %dst) {
991b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds_2(
1001b1696b2SFlorian Hahn; CHECK-NEXT:  entry:
1011b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
1021b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
1031b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 2
1041b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp sge ptr [[GEP_1]], [[DST_0]]
1051b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
1061b1696b2SFlorian Hahn;
1071b1696b2SFlorian Hahnentry:
1081b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
1091b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
1101b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 2
1111b1696b2SFlorian Hahn  %c = icmp sge ptr %gep.1, %dst.0
1121b1696b2SFlorian Hahn  ret i1 %c
1131b1696b2SFlorian Hahn}
1141b1696b2SFlorian Hahn
1151b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow(ptr %dst) {
1161b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow(
1171b1696b2SFlorian Hahn; CHECK-NEXT:  entry:
1181b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
1191b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 6
1201b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2
1211b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
1221b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
1231b1696b2SFlorian Hahn;
1241b1696b2SFlorian Hahnentry:
1251b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
1261b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 6
127*34e477e9SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 2
128*34e477e9SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
1291b1696b2SFlorian Hahn  ret i1 %c
1301b1696b2SFlorian Hahn}
1311b1696b2SFlorian Hahn
1321b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds(ptr %dst) {
1331b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds(
1341b1696b2SFlorian Hahn; CHECK-NEXT:  entry:
1351b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
1361b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
1371b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1
1381b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
1391b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
1401b1696b2SFlorian Hahn;
1411b1696b2SFlorian Hahnentry:
1421b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
1431b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
1441b1696b2SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 1
145*34e477e9SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
1461b1696b2SFlorian Hahn  ret i1 %c
1471b1696b2SFlorian Hahn}
1481b1696b2SFlorian Hahn
1491b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds(ptr %dst) {
1501b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds(
1511b1696b2SFlorian Hahn; CHECK-NEXT:  entry:
1521b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
1531b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
1541b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1
1551b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
1561b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
1571b1696b2SFlorian Hahn;
1581b1696b2SFlorian Hahnentry:
1591b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
1601b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
1611b1696b2SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 1
162*34e477e9SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
1631b1696b2SFlorian Hahn  ret i1 %c
1641b1696b2SFlorian Hahn}
1651b1696b2SFlorian Hahn
1661b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds(ptr %dst) {
1671b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds(
1681b1696b2SFlorian Hahn; CHECK-NEXT:  entry:
1691b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
1701b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2
1711b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2
1721b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
1731b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
1741b1696b2SFlorian Hahn;
1751b1696b2SFlorian Hahnentry:
1761b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
1771b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2
178*34e477e9SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 2
179*34e477e9SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
1801b1696b2SFlorian Hahn  ret i1 %c
1811b1696b2SFlorian Hahn}
1821b1696b2SFlorian Hahn
1831b1696b2SFlorian Hahndefine i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow(ptr %dst) {
1841b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow(
1851b1696b2SFlorian Hahn; CHECK-NEXT:  entry:
1861b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
1871b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 5
1881b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2
1891b1696b2SFlorian Hahn; CHECK-NEXT:    [[C:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
1901b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C]]
1911b1696b2SFlorian Hahn;
1921b1696b2SFlorian Hahnentry:
1931b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
1941b1696b2SFlorian Hahn  %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 5
195*34e477e9SFlorian Hahn  %gep.1 = getelementptr i32, ptr %dst.0, i64 2
196*34e477e9SFlorian Hahn  %c = icmp slt ptr %gep.1, %upper
1971b1696b2SFlorian Hahn  ret i1 %c
1981b1696b2SFlorian Hahn}
1991b1696b2SFlorian Hahn
2001b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index(ptr %dst) {
2011b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index(
2021b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0
2031b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
2041b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
2051b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
2061b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
2071b1696b2SFlorian Hahn;
2081b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0
2091b1696b2SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
2101b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
2111b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
2121b1696b2SFlorian Hahn  ret i1 %c.1
2131b1696b2SFlorian Hahn}
2141b1696b2SFlorian Hahn
2151b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds(ptr %dst) {
2161b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds(
2171b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0
2181b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2
2191b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1
2201b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
2211b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
2221b1696b2SFlorian Hahn;
2231b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0
2241b1696b2SFlorian Hahn  %upper = getelementptr inbounds ptr, ptr %dst, i64 2
2251b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1
2261b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
2271b1696b2SFlorian Hahn  ret i1 %c.1
2281b1696b2SFlorian Hahn}
2291b1696b2SFlorian Hahn
2301b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_1(ptr %dst) {
2311b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_1(
2321b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 1
2331b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2
2341b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
2351b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
2361b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
2371b1696b2SFlorian Hahn;
2381b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 1
2391b1696b2SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 2
2401b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2411b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
2421b1696b2SFlorian Hahn  ret i1 %c.1
2431b1696b2SFlorian Hahn}
2441b1696b2SFlorian Hahn
2451b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_2(ptr %dst) {
2461b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_2(
2471b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0
2481b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2
2491b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
2501b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
2511b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
2521b1696b2SFlorian Hahn;
2531b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0
2541b1696b2SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 2
2551b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2561b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
2571b1696b2SFlorian Hahn  ret i1 %c.1
2581b1696b2SFlorian Hahn}
2591b1696b2SFlorian Hahn
2601b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_3(ptr %dst) {
2611b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_3(
2621b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0
2631b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3
2641b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
2651b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
2661b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
2671b1696b2SFlorian Hahn;
2681b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0
2691b1696b2SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 3
2701b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2711b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
2721b1696b2SFlorian Hahn  ret i1 %c.1
2731b1696b2SFlorian Hahn}
2741b1696b2SFlorian Hahn
2751b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_4(ptr %dst) {
2761b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_4(
2771b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0
2781b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 4
2791b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
2801b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
2811b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
2821b1696b2SFlorian Hahn;
2831b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0
2841b1696b2SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 4
2851b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
2861b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
2871b1696b2SFlorian Hahn  ret i1 %c.1
2881b1696b2SFlorian Hahn}
2891b1696b2SFlorian Hahn
2901b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_5(i64 %off, ptr %dst) {
2911b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_5(
2921b1696b2SFlorian Hahn; CHECK-NEXT:    [[OFF_ULT:%.*]] = icmp sle i64 [[OFF:%.*]], 2
2931b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0
2941b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5
2951b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
2961b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp sle ptr [[GEP_1]], [[UPPER]]
2971b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
2981b1696b2SFlorian Hahn;
2991b1696b2SFlorian Hahn  %off.ult = icmp sle i64 %off, 2
3001b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0
3011b1696b2SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 5
3021b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
3031b1696b2SFlorian Hahn  %c.1 = icmp sle ptr %gep.1, %upper
3041b1696b2SFlorian Hahn  ret i1 %c.1
3051b1696b2SFlorian Hahn}
3061b1696b2SFlorian Hahn
3071b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_6(i64 %off, ptr %dst) {
3081b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_6(
3091b1696b2SFlorian Hahn; CHECK-NEXT:    [[OFF_ULT:%.*]] = icmp sle i64 [[OFF:%.*]], 2
3101b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0
3111b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5
3121b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
3131b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
3141b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
3151b1696b2SFlorian Hahn;
3161b1696b2SFlorian Hahn  %off.ult = icmp sle i64 %off, 2
3171b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0
3181b1696b2SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 5
3191b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
3201b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
3211b1696b2SFlorian Hahn  ret i1 %c.1
3221b1696b2SFlorian Hahn}
3231b1696b2SFlorian Hahn
3241b1696b2SFlorian Hahndefine i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_7(i64 %off, ptr %dst) {
3251b1696b2SFlorian Hahn; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_7(
3261b1696b2SFlorian Hahn; CHECK-NEXT:    [[OFF_ULT:%.*]] = icmp sle i64 [[OFF:%.*]], 2
3271b1696b2SFlorian Hahn; CHECK-NEXT:    [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0
3281b1696b2SFlorian Hahn; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[OFF]]
3291b1696b2SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1
3301b1696b2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp slt ptr [[GEP_1]], [[UPPER]]
3311b1696b2SFlorian Hahn; CHECK-NEXT:    ret i1 [[C_1]]
3321b1696b2SFlorian Hahn;
3331b1696b2SFlorian Hahn  %off.ult = icmp sle i64 %off, 2
3341b1696b2SFlorian Hahn  %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0
3351b1696b2SFlorian Hahn  %upper = getelementptr inbounds i32, ptr %dst, i64 %off
3361b1696b2SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1
3371b1696b2SFlorian Hahn  %c.1 = icmp slt ptr %gep.1, %upper
3381b1696b2SFlorian Hahn  ret i1 %c.1
3391b1696b2SFlorian Hahn}
340