325 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6define i1 @test_outer_gep_last_index_no_overflow_all_inbounds_1(ptr %dst) {7; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_1(8; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 09; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 210; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 111; CHECK-NEXT: ret i1 true12;13 %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 014 %upper = getelementptr inbounds ptr, ptr %dst, i64 215 %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 116 %c.1 = icmp ult ptr %gep.1, %upper17 ret i1 %c.118}19 20define i1 @test_outer_gep_last_index_no_overflow_all_inbounds_2(ptr %dst) {21; CHECK-LABEL: @test_outer_gep_last_index_no_overflow_all_inbounds_2(22; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 023; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 324; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 125; CHECK-NEXT: ret i1 true26;27 %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 028 %upper = getelementptr inbounds ptr, ptr %dst, i64 329 %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 130 %c.1 = icmp ult ptr %gep.1, %upper31 ret i1 %c.132}33 34define i1 @test_outer_gep_last_index_overflow_all_inbounds(ptr %dst) {35; CHECK-LABEL: @test_outer_gep_last_index_overflow_all_inbounds(36; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 037; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 238; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 239; CHECK-NEXT: ret i1 false40;41 %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 042 %upper = getelementptr inbounds ptr, ptr %dst, i64 243 %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 244 %c = icmp ult ptr %gep.1, %upper45 ret i1 %c46}47 48define i1 @test_inner_gep_multiple_indices_ult_true_all_inbounds(ptr %dst) {49; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_all_inbounds(50; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 051; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 252; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 153; CHECK-NEXT: ret i1 true54;55 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 056 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 257 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 158 %c = icmp ult ptr %gep.1, %upper59 ret i1 %c60}61 62define i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds(ptr %dst) {63; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds(64; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 065; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 266; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 167; CHECK-NEXT: ret i1 true68;69 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 070 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 271 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 172 %c = icmp uge ptr %gep.1, %dst.073 ret i1 %c74}75 76define i1 @test_inner_gep_multiple_indices_ult_false_all_inbounds(ptr %dst) {77; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_all_inbounds(78; CHECK-NEXT: entry:79; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 080; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 281; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 282; CHECK-NEXT: ret i1 false83;84entry:85 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 086 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 287 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 288 %c = icmp ult ptr %gep.1, %upper89 ret i1 %c90}91 92define i1 @test_inner_gep_multiple_indices_uge_true_all_inbounds_2(ptr %dst) {93; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_all_inbounds_2(94; CHECK-NEXT: entry:95; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 096; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 297; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 298; CHECK-NEXT: ret i1 true99;100entry:101 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0102 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2103 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 2104 %c = icmp uge ptr %gep.1, %dst.0105 ret i1 %c106}107 108define i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow(ptr %dst) {109; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_all_inbounds_overflow(110; CHECK-NEXT: entry:111; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0112; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 6113; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2114; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]115; CHECK-NEXT: ret i1 [[C]]116;117entry:118 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0119 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 6120 %gep.1 = getelementptr i32, ptr %dst.0, i64 2121 %c = icmp ult ptr %gep.1, %upper122 ret i1 %c123}124 125define i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds(ptr %dst) {126; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds(127; CHECK-NEXT: entry:128; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0129; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2130; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1131; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]132; CHECK-NEXT: ret i1 [[C]]133;134entry:135 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0136 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2137 %gep.1 = getelementptr i32, ptr %dst.0, i64 1138 %c = icmp ult ptr %gep.1, %upper139 ret i1 %c140}141 142define i1 @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds(ptr %dst) {143; CHECK-LABEL: @test_inner_gep_multiple_indices_uge_true_inc_gep_not_inbounds(144; CHECK-NEXT: entry:145; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0146; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2147; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 1148; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]149; CHECK-NEXT: ret i1 [[C]]150;151entry:152 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0153 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2154 %gep.1 = getelementptr i32, ptr %dst.0, i64 1155 %c = icmp ult ptr %gep.1, %upper156 ret i1 %c157}158 159define i1 @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds(ptr %dst) {160; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_false_inc_gep_not_inbounds(161; CHECK-NEXT: entry:162; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0163; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 2164; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2165; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]166; CHECK-NEXT: ret i1 [[C]]167;168entry:169 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0170 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 2171 %gep.1 = getelementptr i32, ptr %dst.0, i64 2172 %c = icmp ult ptr %gep.1, %upper173 ret i1 %c174}175 176define i1 @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow(ptr %dst) {177; CHECK-LABEL: @test_inner_gep_multiple_indices_ult_true_inc_gep_not_inbounds_overflow(178; CHECK-NEXT: entry:179; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0180; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST]], i64 0, i64 5181; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr i32, ptr [[DST_0]], i64 2182; CHECK-NEXT: [[C:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]183; CHECK-NEXT: ret i1 [[C]]184;185entry:186 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0187 %upper = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 5188 %gep.1 = getelementptr i32, ptr %dst.0, i64 2189 %c = icmp ult ptr %gep.1, %upper190 ret i1 %c191}192 193define i1 @test_inner_gep_multi_index(ptr %dst) {194; CHECK-LABEL: @test_inner_gep_multi_index(195; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 0196; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2197; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1198; CHECK-NEXT: ret i1 true199;200 %dst.0 = getelementptr inbounds ptr, ptr %dst, i64 0201 %upper = getelementptr inbounds ptr, ptr %dst, i64 2202 %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1203 %c.1 = icmp ult ptr %gep.1, %upper204 ret i1 %c.1205}206 207define i1 @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds(ptr %dst) {208; CHECK-LABEL: @test_inner_gep_multi_index_outer_gep_last_index_no_overflow_all_inbounds(209; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 0210; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i64 2211; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST_0]], i64 1, i64 1212; CHECK-NEXT: ret i1 true213;214 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 0215 %upper = getelementptr inbounds ptr, ptr %dst, i64 2216 %gep.1 = getelementptr inbounds [2 x i32] , ptr %dst.0, i64 1, i64 1217 %c.1 = icmp ult ptr %gep.1, %upper218 ret i1 %c.1219}220 221define i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_1(ptr %dst) {222; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_1(223; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 0, i64 1224; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2225; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1226; CHECK-NEXT: ret i1 false227;228 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 0, i64 1229 %upper = getelementptr inbounds i32, ptr %dst, i64 2230 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1231 %c.1 = icmp ult ptr %gep.1, %upper232 ret i1 %c.1233}234 235define i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_2(ptr %dst) {236; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_2(237; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0238; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2239; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1240; CHECK-NEXT: ret i1 false241;242 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0243 %upper = getelementptr inbounds i32, ptr %dst, i64 2244 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1245 %c.1 = icmp ult ptr %gep.1, %upper246 ret i1 %c.1247}248 249define i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_3(ptr %dst) {250; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_3(251; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0252; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3253; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1254; CHECK-NEXT: ret i1 false255;256 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0257 %upper = getelementptr inbounds i32, ptr %dst, i64 3258 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1259 %c.1 = icmp ult ptr %gep.1, %upper260 ret i1 %c.1261}262 263define i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_4(ptr %dst) {264; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_4(265; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 1, i64 0266; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 4267; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1268; CHECK-NEXT: ret i1 true269;270 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 1, i64 0271 %upper = getelementptr inbounds i32, ptr %dst, i64 4272 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1273 %c.1 = icmp ult ptr %gep.1, %upper274 ret i1 %c.1275}276 277define i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_5(i64 %off, ptr %dst) {278; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_5(279; CHECK-NEXT: [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2280; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0281; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5282; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1283; CHECK-NEXT: ret i1 true284;285 %off.ult = icmp ule i64 %off, 2286 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0287 %upper = getelementptr inbounds i32, ptr %dst, i64 5288 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1289 %c.1 = icmp ule ptr %gep.1, %upper290 ret i1 %c.1291}292 293define i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_6(i64 %off, ptr %dst) {294; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_6(295; CHECK-NEXT: [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2296; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0297; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 5298; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1299; CHECK-NEXT: ret i1 false300;301 %off.ult = icmp ule i64 %off, 2302 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0303 %upper = getelementptr inbounds i32, ptr %dst, i64 5304 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1305 %c.1 = icmp ult ptr %gep.1, %upper306 ret i1 %c.1307}308 309define i1 @test_inner_gep_multi_index_no_overflow_all_inbounds_7(i64 %off, ptr %dst) {310; CHECK-LABEL: @test_inner_gep_multi_index_no_overflow_all_inbounds_7(311; CHECK-NEXT: [[OFF_ULT:%.*]] = icmp ule i64 [[OFF:%.*]], 2312; CHECK-NEXT: [[DST_0:%.*]] = getelementptr inbounds [2 x i32], ptr [[DST:%.*]], i64 2, i64 0313; CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[OFF]]314; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST_0]], i64 1315; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[GEP_1]], [[UPPER]]316; CHECK-NEXT: ret i1 [[C_1]]317;318 %off.ult = icmp ule i64 %off, 2319 %dst.0 = getelementptr inbounds [2 x i32], ptr %dst, i64 2, i64 0320 %upper = getelementptr inbounds i32, ptr %dst, i64 %off321 %gep.1 = getelementptr inbounds i32, ptr %dst.0, i64 1322 %c.1 = icmp ult ptr %gep.1, %upper323 ret i1 %c.1324}325