475 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @use(i1)5 6define void @iv_known_non_negative_constant_trip_count() {7; CHECK-LABEL: @iv_known_non_negative_constant_trip_count(8; CHECK-NEXT: entry:9; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]10; CHECK: loop.header:11; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]12; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], 213; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]14; CHECK: loop.latch:15; CHECK-NEXT: call void @use(i1 true)16; CHECK-NEXT: call void @use(i1 true)17; CHECK-NEXT: call void @use(i1 false)18; CHECK-NEXT: call void @use(i1 false)19; CHECK-NEXT: call void @use(i1 false)20; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 121; CHECK-NEXT: br label [[LOOP_HEADER]]22; CHECK: exit.1:23; CHECK-NEXT: ret void24;25entry:26 br label %loop.header27 28loop.header:29 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]30 %cmp = icmp slt i8 %iv, 231 br i1 %cmp, label %loop.latch, label %exit.132 33loop.latch:34 %t.1 = icmp ugt i8 2, %iv35 call void @use(i1 %t.1)36 %t.2 = icmp sgt i8 2, %iv37 call void @use(i1 %t.2)38 %f.1 = icmp ule i8 2, %iv39 call void @use(i1 %f.1)40 %f.2 = icmp sle i8 2, %iv41 call void @use(i1 %f.2)42 %c.0 = icmp ugt i8 %iv, 243 call void @use(i1 %c.0)44 %iv.next = add nuw nsw i8 %iv, 145 br label %loop.header46 47exit.1:48 ret void49}50 51define void @iv_known_non_negative_constant_trip_count_no_nsw_flag(i8 %N) {52; CHECK-LABEL: @iv_known_non_negative_constant_trip_count_no_nsw_flag(53; CHECK-NEXT: entry:54; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]55; CHECK: loop.header:56; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]57; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], 258; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]59; CHECK: loop.latch:60; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N:%.*]], [[IV]]61; CHECK-NEXT: call void @use(i1 [[T_1]])62; CHECK-NEXT: [[T_2:%.*]] = icmp sgt i8 [[N]], [[IV]]63; CHECK-NEXT: call void @use(i1 [[T_2]])64; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]65; CHECK-NEXT: call void @use(i1 [[F_1]])66; CHECK-NEXT: [[F_2:%.*]] = icmp sle i8 [[N]], [[IV]]67; CHECK-NEXT: call void @use(i1 [[F_2]])68; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 269; CHECK-NEXT: call void @use(i1 [[C_0]])70; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 171; CHECK-NEXT: br label [[LOOP_HEADER]]72; CHECK: exit.1:73; CHECK-NEXT: ret void74;75entry:76 br label %loop.header77 78loop.header:79 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]80 %cmp = icmp slt i8 %iv, 281 br i1 %cmp, label %loop.latch, label %exit.182 83loop.latch:84 %t.1 = icmp ugt i8 %N, %iv85 call void @use(i1 %t.1)86 %t.2 = icmp sgt i8 %N, %iv87 call void @use(i1 %t.2)88 %f.1 = icmp ule i8 %N, %iv89 call void @use(i1 %f.1)90 %f.2 = icmp sle i8 %N, %iv91 call void @use(i1 %f.2)92 %c.0 = icmp ugt i8 %iv, 293 call void @use(i1 %c.0)94 %iv.next = add nuw i8 %iv, 195 br label %loop.header96 97exit.1:98 ret void99}100 101define void @iv_known_non_negative_variable_trip_count(i8 %N) {102; CHECK-LABEL: @iv_known_non_negative_variable_trip_count(103; CHECK-NEXT: entry:104; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]105; CHECK: loop.header:106; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]107; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], [[N:%.*]]108; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]109; CHECK: loop.latch:110; CHECK-NEXT: call void @use(i1 true)111; CHECK-NEXT: call void @use(i1 true)112; CHECK-NEXT: call void @use(i1 false)113; CHECK-NEXT: call void @use(i1 false)114; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2115; CHECK-NEXT: call void @use(i1 [[C_0]])116; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1117; CHECK-NEXT: br label [[LOOP_HEADER]]118; CHECK: exit.1:119; CHECK-NEXT: ret void120;121entry:122 br label %loop.header123 124loop.header:125 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]126 %cmp = icmp slt i8 %iv, %N127 br i1 %cmp, label %loop.latch, label %exit.1128 129loop.latch:130 %t.1 = icmp ugt i8 %N, %iv131 call void @use(i1 %t.1)132 %t.2 = icmp sgt i8 %N, %iv133 call void @use(i1 %t.2)134 %f.1 = icmp ule i8 %N, %iv135 call void @use(i1 %f.1)136 %f.2 = icmp sle i8 %N, %iv137 call void @use(i1 %f.2)138 %c.0 = icmp ugt i8 %iv, 2139 call void @use(i1 %c.0)140 %iv.next = add nuw nsw i8 %iv, 1141 br label %loop.header142 143exit.1:144 ret void145}146 147define void @iv_may_signed_wrap_variable_trip_count(i8 %N) {148; CHECK-LABEL: @iv_may_signed_wrap_variable_trip_count(149; CHECK-NEXT: entry:150; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]151; CHECK: loop.header:152; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]153; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], [[N:%.*]]154; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]155; CHECK: loop.latch:156; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N]], [[IV]]157; CHECK-NEXT: call void @use(i1 [[T_1]])158; CHECK-NEXT: call void @use(i1 true)159; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]160; CHECK-NEXT: call void @use(i1 [[F_1]])161; CHECK-NEXT: call void @use(i1 false)162; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2163; CHECK-NEXT: call void @use(i1 [[C_0]])164; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1165; CHECK-NEXT: br label [[LOOP_HEADER]]166; CHECK: exit.1:167; CHECK-NEXT: ret void168;169entry:170 br label %loop.header171 172loop.header:173 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]174 %cmp = icmp slt i8 %iv, %N175 br i1 %cmp, label %loop.latch, label %exit.1176 177loop.latch:178 %t.1 = icmp ugt i8 %N, %iv179 call void @use(i1 %t.1)180 %t.2 = icmp sgt i8 %N, %iv181 call void @use(i1 %t.2)182 %f.1 = icmp ule i8 %N, %iv183 call void @use(i1 %f.1)184 %f.2 = icmp sle i8 %N, %iv185 call void @use(i1 %f.2)186 %c.0 = icmp ugt i8 %iv, 2187 call void @use(i1 %c.0)188 %iv.next = add nuw i8 %iv, 1189 br label %loop.header190 191exit.1:192 ret void193}194 195define void @iv_known_non_negative_iv_constant_trip_count_sgt() {196; CHECK-LABEL: @iv_known_non_negative_iv_constant_trip_count_sgt(197; CHECK-NEXT: entry:198; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]199; CHECK: loop.header:200; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]201; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 2, [[IV]]202; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]203; CHECK: loop.latch:204; CHECK-NEXT: call void @use(i1 false)205; CHECK-NEXT: call void @use(i1 true)206; CHECK-NEXT: call void @use(i1 false)207; CHECK-NEXT: call void @use(i1 false)208; CHECK-NEXT: call void @use(i1 false)209; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1210; CHECK-NEXT: br label [[LOOP_HEADER]]211; CHECK: exit.1:212; CHECK-NEXT: ret void213;214entry:215 br label %loop.header216 217loop.header:218 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]219 %cmp = icmp sgt i8 2, %iv220 br i1 %cmp, label %loop.latch, label %exit.1221 222loop.latch:223 %t.1 = icmp ugt i8 %iv, 2224 call void @use(i1 %t.1)225 %t.2 = icmp sgt i8 2, %iv226 call void @use(i1 %t.2)227 %f.1 = icmp ule i8 2, %iv228 call void @use(i1 %f.1)229 %f.2 = icmp sle i8 2, %iv230 call void @use(i1 %f.2)231 %c.0 = icmp ugt i8 %iv, 2232 call void @use(i1 %c.0)233 %iv.next = add nsw nuw i8 %iv, 1234 br label %loop.header235 236exit.1:237 ret void238}239 240define void @iv_known_non_negative_iv_variable_trip_count_sgt(i8 %N) {241; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_sgt(242; CHECK-NEXT: entry:243; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]244; CHECK: loop.header:245; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]246; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[N:%.*]], [[IV]]247; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]248; CHECK: loop.latch:249; CHECK-NEXT: call void @use(i1 false)250; CHECK-NEXT: call void @use(i1 true)251; CHECK-NEXT: call void @use(i1 false)252; CHECK-NEXT: call void @use(i1 false)253; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2254; CHECK-NEXT: call void @use(i1 [[C_0]])255; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1256; CHECK-NEXT: br label [[LOOP_HEADER]]257; CHECK: exit.1:258; CHECK-NEXT: ret void259;260entry:261 br label %loop.header262 263loop.header:264 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]265 %cmp = icmp sgt i8 %N, %iv266 br i1 %cmp, label %loop.latch, label %exit.1267 268loop.latch:269 %t.1 = icmp ugt i8 %iv, %N270 call void @use(i1 %t.1)271 %t.2 = icmp sgt i8 %N, %iv272 call void @use(i1 %t.2)273 %f.1 = icmp ule i8 %N, %iv274 call void @use(i1 %f.1)275 %f.2 = icmp sle i8 %N, %iv276 call void @use(i1 %f.2)277 %c.0 = icmp ugt i8 %iv, 2278 call void @use(i1 %c.0)279 %iv.next = add nsw nuw i8 %iv, 1280 br label %loop.header281 282exit.1:283 ret void284}285 286 287define void @iv_known_non_negative_iv_variable_trip_count_sgt_ops_flipped(i8 %N) {288; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_sgt_ops_flipped(289; CHECK-NEXT: entry:290; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]291; CHECK: loop.header:292; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]293; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[IV]], [[N:%.*]]294; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]295; CHECK: loop.latch:296; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[IV]], [[N]]297; CHECK-NEXT: call void @use(i1 [[T_1]])298; CHECK-NEXT: call void @use(i1 true)299; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]300; CHECK-NEXT: call void @use(i1 [[F_1]])301; CHECK-NEXT: call void @use(i1 true)302; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2303; CHECK-NEXT: call void @use(i1 [[C_0]])304; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1305; CHECK-NEXT: br label [[LOOP_HEADER]]306; CHECK: exit.1:307; CHECK-NEXT: ret void308;309entry:310 br label %loop.header311 312loop.header:313 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]314 %cmp = icmp sgt i8 %iv, %N315 br i1 %cmp, label %loop.latch, label %exit.1316 317loop.latch:318 %t.1 = icmp ugt i8 %iv, %N319 call void @use(i1 %t.1)320 %t.2 = icmp sgt i8 %iv, %N321 call void @use(i1 %t.2)322 %f.1 = icmp ule i8 %N, %iv323 call void @use(i1 %f.1)324 %f.2 = icmp sle i8 %N, %iv325 call void @use(i1 %f.2)326 %c.0 = icmp ugt i8 %iv, 2327 call void @use(i1 %c.0)328 %iv.next = add nsw nuw i8 %iv, 1329 br label %loop.header330 331exit.1:332 ret void333}334 335define void @iv_known_non_negative_iv_constant_trip_count_sge() {336; CHECK-LABEL: @iv_known_non_negative_iv_constant_trip_count_sge(337; CHECK-NEXT: entry:338; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]339; CHECK: loop.header:340; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]341; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 2, [[IV]]342; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]343; CHECK: loop.latch:344; CHECK-NEXT: call void @use(i1 true)345; CHECK-NEXT: call void @use(i1 true)346; CHECK-NEXT: call void @use(i1 false)347; CHECK-NEXT: call void @use(i1 false)348; CHECK-NEXT: call void @use(i1 false)349; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1350; CHECK-NEXT: br label [[LOOP_HEADER]]351; CHECK: exit.1:352; CHECK-NEXT: ret void353;354entry:355 br label %loop.header356 357loop.header:358 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]359 %cmp = icmp sge i8 2, %iv360 br i1 %cmp, label %loop.latch, label %exit.1361 362loop.latch:363 %t.1 = icmp uge i8 2, %iv364 call void @use(i1 %t.1)365 %t.2 = icmp sge i8 2, %iv366 call void @use(i1 %t.2)367 %f.1 = icmp ult i8 2, %iv368 call void @use(i1 %f.1)369 %f.2 = icmp slt i8 2, %iv370 call void @use(i1 %f.2)371 %c.0 = icmp ugt i8 %iv, 2372 call void @use(i1 %c.0)373 %iv.next = add nsw nuw i8 %iv, 1374 br label %loop.header375 376exit.1:377 ret void378}379 380define void @iv_known_non_negative_iv_variable_trip_count_sge(i8 %N) {381; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_sge(382; CHECK-NEXT: entry:383; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]384; CHECK: loop.header:385; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]386; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[N:%.*]], [[IV]]387; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]388; CHECK: loop.latch:389; CHECK-NEXT: call void @use(i1 true)390; CHECK-NEXT: call void @use(i1 true)391; CHECK-NEXT: call void @use(i1 false)392; CHECK-NEXT: call void @use(i1 false)393; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2394; CHECK-NEXT: call void @use(i1 [[C_0]])395; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1396; CHECK-NEXT: br label [[LOOP_HEADER]]397; CHECK: exit.1:398; CHECK-NEXT: ret void399;400entry:401 br label %loop.header402 403loop.header:404 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]405 %cmp = icmp sge i8 %N, %iv406 br i1 %cmp, label %loop.latch, label %exit.1407 408loop.latch:409 %t.1 = icmp uge i8 %N, %iv410 call void @use(i1 %t.1)411 %t.2 = icmp sge i8 %N, %iv412 call void @use(i1 %t.2)413 %f.1 = icmp ult i8 %N, %iv414 call void @use(i1 %f.1)415 %f.2 = icmp slt i8 %N, %iv416 call void @use(i1 %f.2)417 %c.0 = icmp ugt i8 %iv, 2418 call void @use(i1 %c.0)419 %iv.next = add nsw nuw i8 %iv, 1420 br label %loop.header421 422exit.1:423 ret void424}425 426define void @iv_known_non_negative_iv_variable_trip_count_sge_operands_swapped(i8 %N) {427; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_sge_operands_swapped(428; CHECK-NEXT: entry:429; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]430; CHECK: loop.header:431; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]432; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[IV]], [[N:%.*]]433; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]434; CHECK: loop.latch:435; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[N]], [[IV]]436; CHECK-NEXT: call void @use(i1 [[T_1]])437; CHECK-NEXT: [[T_2:%.*]] = icmp sge i8 [[N]], [[IV]]438; CHECK-NEXT: call void @use(i1 [[T_2]])439; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[N]], [[IV]]440; CHECK-NEXT: call void @use(i1 [[F_1]])441; CHECK-NEXT: [[F_2:%.*]] = icmp slt i8 [[N]], [[IV]]442; CHECK-NEXT: call void @use(i1 [[F_2]])443; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2444; CHECK-NEXT: call void @use(i1 [[C_0]])445; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1446; CHECK-NEXT: br label [[LOOP_HEADER]]447; CHECK: exit.1:448; CHECK-NEXT: ret void449;450entry:451 br label %loop.header452 453loop.header:454 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]455 %cmp = icmp sge i8 %iv, %N456 br i1 %cmp, label %loop.latch, label %exit.1457 458loop.latch:459 %t.1 = icmp uge i8 %N, %iv460 call void @use(i1 %t.1)461 %t.2 = icmp sge i8 %N, %iv462 call void @use(i1 %t.2)463 %f.1 = icmp ult i8 %N, %iv464 call void @use(i1 %f.1)465 %f.2 = icmp slt i8 %N, %iv466 call void @use(i1 %f.2)467 %c.0 = icmp ugt i8 %iv, 2468 call void @use(i1 %c.0)469 %iv.next = add nsw nuw i8 %iv, 1470 br label %loop.header471 472exit.1:473 ret void474}475