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