421 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 @loop_phi_pos_start_value(i32 %y, i1 %c, i32 %n) {7; CHECK-LABEL: @loop_phi_pos_start_value(8; CHECK-NEXT: entry:9; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]10; CHECK: loop.header:11; CHECK-NEXT: [[X:%.*]] = phi i32 [ 10, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]12; CHECK-NEXT: [[C_1:%.*]] = icmp slt i32 [[X]], [[N:%.*]]13; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]14; CHECK: loop.latch:15; CHECK-NEXT: call void @use(i1 true)16; CHECK-NEXT: call void @use(i1 false)17; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[X]], 1018; CHECK-NEXT: call void @use(i1 [[T_2]])19; CHECK-NEXT: [[C_2:%.*]] = icmp sle i32 [[X]], 920; CHECK-NEXT: call void @use(i1 [[C_2]])21; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i32 [[X]], 922; CHECK-NEXT: call void @use(i1 [[C_3]])23; CHECK-NEXT: call void @use(i1 true)24; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 925; CHECK-NEXT: call void @use(i1 [[C_5]])26; CHECK-NEXT: [[X_NEXT]] = add nsw i32 [[X]], 127; CHECK-NEXT: br label [[LOOP_HEADER]]28; CHECK: exit:29; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i32 [[Y:%.*]], 1030; CHECK-NEXT: call void @use(i1 [[C_6]])31; CHECK-NEXT: ret void32;33entry:34 br i1 %c, label %loop.header, label %exit35 36loop.header:37 %x = phi i32 [ 10, %entry ], [ %x.next, %loop.latch ]38 %c.1 = icmp slt i32 %x, %n39 br i1 %c.1, label %loop.latch, label %exit40 41loop.latch:42 %f.1 = icmp sle i32 %x, %n43 call void @use(i1 %f.1)44 %t.1 = icmp sgt i32 %x, %n45 call void @use(i1 %t.1)46 %t.2 = icmp sge i32 %x, 1047 call void @use(i1 %t.2)48 49 %c.2 = icmp sle i32 %x, 950 call void @use(i1 %c.2)51 %c.3 = icmp sgt i32 %x, 952 call void @use(i1 %c.3)53 %c.4 = icmp sge i32 %x, 054 call void @use(i1 %c.4)55 %c.5 = icmp sge i32 %x, 956 call void @use(i1 %c.5)57 58 %x.next = add nsw i32 %x, 159 br label %loop.header60 61exit:62 %c.6 = icmp sgt i32 %y, 1063 call void @use(i1 %c.6)64 ret void65}66 67define void @loop_phi_neg_start_value(i32 %y, i1 %c, i32 %n) {68; CHECK-LABEL: @loop_phi_neg_start_value(69; CHECK-NEXT: entry:70; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]71; CHECK: loop.header:72; CHECK-NEXT: [[X:%.*]] = phi i32 [ -10, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]73; CHECK-NEXT: [[C_1:%.*]] = icmp slt i32 [[X]], [[N:%.*]]74; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]75; CHECK: loop.latch:76; CHECK-NEXT: call void @use(i1 true)77; CHECK-NEXT: call void @use(i1 false)78; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[X]], -1079; CHECK-NEXT: call void @use(i1 [[T_2]])80; CHECK-NEXT: [[C_2:%.*]] = icmp sle i32 [[X]], 981; CHECK-NEXT: call void @use(i1 [[C_2]])82; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i32 [[X]], 983; CHECK-NEXT: call void @use(i1 [[C_3]])84; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 [[X]], 085; CHECK-NEXT: call void @use(i1 [[C_4]])86; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 987; CHECK-NEXT: call void @use(i1 [[C_5]])88; CHECK-NEXT: [[X_NEXT]] = add nsw i32 [[X]], 189; CHECK-NEXT: br label [[LOOP_HEADER]]90; CHECK: exit:91; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i32 [[Y:%.*]], 1092; CHECK-NEXT: call void @use(i1 [[C_6]])93; CHECK-NEXT: ret void94;95entry:96 br i1 %c, label %loop.header, label %exit97 98loop.header:99 %x = phi i32 [ -10, %entry ], [ %x.next, %loop.latch ]100 %c.1 = icmp slt i32 %x, %n101 br i1 %c.1, label %loop.latch, label %exit102 103loop.latch:104 %f.1 = icmp sle i32 %x, %n105 call void @use(i1 %f.1)106 %t.1 = icmp sgt i32 %x, %n107 call void @use(i1 %t.1)108 %t.2 = icmp sge i32 %x, -10109 call void @use(i1 %t.2)110 111 %c.2 = icmp sle i32 %x, 9112 call void @use(i1 %c.2)113 %c.3 = icmp sgt i32 %x, 9114 call void @use(i1 %c.3)115 %c.4 = icmp sge i32 %x, 0116 call void @use(i1 %c.4)117 %c.5 = icmp sge i32 %x, 9118 call void @use(i1 %c.5)119 120 %x.next = add nsw i32 %x, 1121 br label %loop.header122 123exit:124 %c.6 = icmp sgt i32 %y, 10125 call void @use(i1 %c.6)126 ret void127}128 129define void @loop_count_down(i32 %y, i1 %c, i32 %n) {130; CHECK-LABEL: @loop_count_down(131; CHECK-NEXT: entry:132; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]133; CHECK: loop.header:134; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]135; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[X]], 0136; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]137; CHECK: loop.latch:138; CHECK-NEXT: [[F_1:%.*]] = icmp sle i32 [[X]], [[N]]139; CHECK-NEXT: call void @use(i1 [[F_1]])140; CHECK-NEXT: [[T_1:%.*]] = icmp sgt i32 [[X]], [[N]]141; CHECK-NEXT: call void @use(i1 [[T_1]])142; CHECK-NEXT: call void @use(i1 true)143; CHECK-NEXT: call void @use(i1 true)144; CHECK-NEXT: [[C_2:%.*]] = icmp sle i32 [[X]], 9145; CHECK-NEXT: call void @use(i1 [[C_2]])146; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i32 [[X]], 9147; CHECK-NEXT: call void @use(i1 [[C_3]])148; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 [[X]], 1149; CHECK-NEXT: call void @use(i1 [[C_4]])150; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 2151; CHECK-NEXT: call void @use(i1 [[C_5]])152; CHECK-NEXT: [[X_NEXT]] = add nsw i32 [[X]], 1153; CHECK-NEXT: br label [[LOOP_HEADER]]154; CHECK: exit:155; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i32 [[Y:%.*]], 10156; CHECK-NEXT: call void @use(i1 [[C_6]])157; CHECK-NEXT: ret void158;159entry:160 br i1 %c, label %loop.header, label %exit161 162loop.header:163 %x = phi i32 [ %n, %entry ], [ %x.next, %loop.latch ]164 %c.1 = icmp sge i32 %x, 0165 br i1 %c.1, label %loop.latch, label %exit166 167loop.latch:168 %f.1 = icmp sle i32 %x, %n169 call void @use(i1 %f.1)170 %t.1 = icmp sgt i32 %x, %n171 call void @use(i1 %t.1)172 %t.2 = icmp sge i32 %x, 0173 call void @use(i1 %t.2)174 %t.3 = icmp sge i32 %x, -1175 call void @use(i1 %t.3)176 177 %c.2 = icmp sle i32 %x, 9178 call void @use(i1 %c.2)179 %c.3 = icmp sgt i32 %x, 9180 call void @use(i1 %c.3)181 %c.4 = icmp sge i32 %x, 1182 call void @use(i1 %c.4)183 %c.5 = icmp sge i32 %x, 2184 call void @use(i1 %c.5)185 186 %x.next = add nsw i32 %x, 1187 br label %loop.header188 189exit:190 %c.6 = icmp sgt i32 %y, 10191 call void @use(i1 %c.6)192 ret void193}194 195define void @loop_latch_may_not_executed(i32 %y, i1 %c, i32 %n) {196; CHECK-LABEL: @loop_latch_may_not_executed(197; CHECK-NEXT: entry:198; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]199; CHECK: loop.header:200; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]201; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[X]], [[N:%.*]]202; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]203; CHECK: loop.latch:204; CHECK-NEXT: call void @use(i1 false)205; CHECK-NEXT: call void @use(i1 true)206; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 9207; CHECK-NEXT: call void @use(i1 [[C_2]])208; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[X]], 9209; CHECK-NEXT: call void @use(i1 [[C_3]])210; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1211; CHECK-NEXT: br label [[LOOP_HEADER]]212; CHECK: exit:213; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10214; CHECK-NEXT: call void @use(i1 [[C_4]])215; CHECK-NEXT: ret void216;217entry:218 br i1 %c, label %loop.header, label %exit219 220loop.header:221 %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]222 %c.1 = icmp ugt i32 %x, %n223 br i1 %c.1, label %loop.latch, label %exit224 225loop.latch:226 %f.1 = icmp ule i32 %x, %n227 call void @use(i1 %f.1)228 %t.1 = icmp ugt i32 %x, %n229 call void @use(i1 %t.1)230 231 %c.2 = icmp ule i32 %x, 9232 call void @use(i1 %c.2)233 %c.3 = icmp ugt i32 %x, 9234 call void @use(i1 %c.3)235 236 %x.next = add i32 %x, 1237 br label %loop.header238 239exit:240 %c.4 = icmp ugt i32 %y, 10241 call void @use(i1 %c.4)242 ret void243}244 245define void @loop_latch_not_executed_constant_bound(i32 %y, i1 %c) {246; CHECK-LABEL: @loop_latch_not_executed_constant_bound(247; CHECK-NEXT: entry:248; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]249; CHECK: loop.header:250; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]251; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[X]], 10252; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]253; CHECK: loop.latch:254; CHECK-NEXT: call void @use(i1 false)255; CHECK-NEXT: call void @use(i1 true)256; CHECK-NEXT: call void @use(i1 false)257; CHECK-NEXT: call void @use(i1 true)258; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1259; CHECK-NEXT: br label [[LOOP_HEADER]]260; CHECK: exit:261; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10262; CHECK-NEXT: call void @use(i1 [[C_4]])263; CHECK-NEXT: ret void264;265entry:266 br i1 %c, label %loop.header, label %exit267 268loop.header:269 %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]270 %c.1 = icmp ugt i32 %x, 10271 br i1 %c.1, label %loop.latch, label %exit272 273loop.latch:274 %t.1 = icmp ule i32 %x, 10275 call void @use(i1 %t.1)276 %f.1 = icmp ugt i32 %x, 10277 call void @use(i1 %f.1)278 279 %c.2 = icmp ule i32 %x, 9280 call void @use(i1 %c.2)281 %c.3 = icmp ugt i32 %x, 9282 call void @use(i1 %c.3)283 284 %x.next = add i32 %x, 1285 br label %loop.header286 287exit:288 %c.4 = icmp ugt i32 %y, 10289 call void @use(i1 %c.4)290 ret void291}292 293 294define void @loop_iv_cond_variable_bound(i32 %n) {295; CHECK-LABEL: @loop_iv_cond_variable_bound(296; CHECK-NEXT: entry:297; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]298; CHECK: loop.header:299; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]300; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], [[N:%.*]]301; CHECK-NEXT: call void @use(i1 [[T_1]])302; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 0303; CHECK-NEXT: call void @use(i1 [[T_2]])304; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -1305; CHECK-NEXT: call void @use(i1 [[T_3]])306; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], [[N]]307; CHECK-NEXT: call void @use(i1 [[C_1]])308; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 1309; CHECK-NEXT: call void @use(i1 [[C_2]])310; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV]], [[N]]311; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]312; CHECK: loop.latch:313; CHECK-NEXT: call void @use(i1 true)314; CHECK-NEXT: [[C_3:%.*]] = icmp ult i32 [[IV]], 2315; CHECK-NEXT: call void @use(i1 [[C_3]])316; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[IV]], 1317; CHECK-NEXT: call void @use(i1 [[C_4]])318; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1319; CHECK-NEXT: br label [[LOOP_HEADER]]320; CHECK: exit:321; CHECK-NEXT: ret void322;323entry:324 br label %loop.header325 326loop.header:327 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]328 %t.1 = icmp ule i32 %iv, %n329 call void @use(i1 %t.1)330 %t.2 = icmp sge i32 %iv, 0331 call void @use(i1 %t.2)332 %t.3 = icmp sge i32 %iv, -1333 call void @use(i1 %t.3)334 335 %c.1 = icmp ult i32 %iv, %n336 call void @use(i1 %c.1)337 %c.2 = icmp ugt i32 %iv, 1338 call void @use(i1 %c.2)339 340 %cmp = icmp ult i32 %iv, %n341 br i1 %cmp, label %loop.latch, label %exit342 343loop.latch:344 %t.4 = icmp ule i32 %iv, %n345 call void @use(i1 %t.4)346 347 %c.3 = icmp ult i32 %iv, 2348 call void @use(i1 %c.3)349 %c.4 = icmp ugt i32 %iv, 1350 call void @use(i1 %c.4)351 352 %iv.next = add nuw nsw i32 %iv, 1353 br label %loop.header354 355exit:356 ret void357}358 359define void @loop_iv_cond_constant_bound() {360; CHECK-LABEL: @loop_iv_cond_constant_bound(361; CHECK-NEXT: entry:362; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]363; CHECK: loop.header:364; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]365; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], 2366; CHECK-NEXT: call void @use(i1 [[T_1]])367; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 0368; CHECK-NEXT: call void @use(i1 [[T_2]])369; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -1370; CHECK-NEXT: call void @use(i1 [[T_3]])371; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], 2372; CHECK-NEXT: call void @use(i1 [[C_1]])373; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 1374; CHECK-NEXT: call void @use(i1 [[C_2]])375; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[IV]], 2376; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]377; CHECK: loop.latch:378; CHECK-NEXT: call void @use(i1 true)379; CHECK-NEXT: call void @use(i1 true)380; CHECK-NEXT: call void @use(i1 false)381; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1382; CHECK-NEXT: br label [[LOOP_HEADER]]383; CHECK: exit:384; CHECK-NEXT: ret void385;386entry:387 br label %loop.header388 389loop.header:390 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]391 %t.1 = icmp ule i32 %iv, 2392 call void @use(i1 %t.1)393 %t.2 = icmp sge i32 %iv, 0394 call void @use(i1 %t.2)395 %t.3 = icmp sge i32 %iv, -1396 call void @use(i1 %t.3)397 398 %c.1 = icmp ult i32 %iv, 2399 call void @use(i1 %c.1)400 %c.2 = icmp ugt i32 %iv, 1401 call void @use(i1 %c.2)402 403 %cmp = icmp ult i32 %iv, 2404 br i1 %cmp, label %loop.latch, label %exit405 406loop.latch:407 %t.4 = icmp ule i32 %iv, 2408 call void @use(i1 %t.4)409 410 %c.3 = icmp ult i32 %iv, 2411 call void @use(i1 %c.3)412 %c.4 = icmp ugt i32 %iv, 1413 call void @use(i1 %c.4)414 415 %iv.next = add nuw nsw i32 %iv, 1416 br label %loop.header417 418exit:419 ret void420}421