brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.0 KiB · 7b928a0 Raw
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