brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.8 KiB · efb218f Raw
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