231 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_iv_constant_trip_count_uge() {7; CHECK-LABEL: @iv_known_non_negative_iv_constant_trip_count_uge(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 uge 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: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 120; CHECK-NEXT: br label [[LOOP_HEADER]]21; CHECK: exit.1:22; CHECK-NEXT: ret void23;24entry:25 br label %loop.header26 27loop.header:28 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]29 %cmp = icmp uge i8 %iv, 230 br i1 %cmp, label %loop.latch, label %exit.131 32loop.latch:33 %t.1 = icmp uge i8 %iv, 234 call void @use(i1 %t.1)35 %t.2 = icmp sge i8 %iv, 236 call void @use(i1 %t.2)37 %f.1 = icmp ult i8 %iv, 238 call void @use(i1 %f.1)39 %f.2 = icmp slt i8 %iv, 240 call void @use(i1 %f.2)41 %iv.next = add nsw nuw i8 %iv, 142 br label %loop.header43 44exit.1:45 ret void46}47 48define void @iv_known_non_negative_iv_variable_trip_count_uge(i8 %N) {49; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_uge(50; CHECK-NEXT: entry:51; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]52; CHECK: loop.header:53; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]54; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[IV]], [[N:%.*]]55; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]56; CHECK: loop.latch:57; CHECK-NEXT: call void @use(i1 true)58; CHECK-NEXT: call void @use(i1 true)59; CHECK-NEXT: call void @use(i1 false)60; CHECK-NEXT: call void @use(i1 false)61; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 262; CHECK-NEXT: call void @use(i1 [[C_0]])63; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 164; CHECK-NEXT: br label [[LOOP_HEADER]]65; CHECK: exit.1:66; CHECK-NEXT: ret void67;68entry:69 br label %loop.header70 71loop.header:72 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]73 %cmp = icmp uge i8 %iv, %N74 br i1 %cmp, label %loop.latch, label %exit.175 76loop.latch:77 %t.1 = icmp uge i8 %iv, %N78 call void @use(i1 %t.1)79 %t.2 = icmp sge i8 %iv, %N80 call void @use(i1 %t.2)81 %f.1 = icmp ult i8 %iv, %N82 call void @use(i1 %f.1)83 %f.2 = icmp slt i8 %iv, %N84 call void @use(i1 %f.2)85 %c.0 = icmp ugt i8 %iv, 286 call void @use(i1 %c.0)87 %iv.next = add nsw nuw i8 %iv, 188 br label %loop.header89 90exit.1:91 ret void92}93 94define void @iv_known_non_negative_iv_variable_trip_count_uge_operands_swapped(i8 %N) {95; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_uge_operands_swapped(96; CHECK-NEXT: entry:97; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]98; CHECK: loop.header:99; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]100; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[N:%.*]], [[IV]]101; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]102; CHECK: loop.latch:103; CHECK-NEXT: call void @use(i1 true)104; CHECK-NEXT: [[T_2:%.*]] = icmp sge i8 [[N]], [[IV]]105; CHECK-NEXT: call void @use(i1 [[T_2]])106; CHECK-NEXT: call void @use(i1 false)107; CHECK-NEXT: [[F_2:%.*]] = icmp slt i8 [[N]], [[IV]]108; CHECK-NEXT: call void @use(i1 [[F_2]])109; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1110; CHECK-NEXT: br label [[LOOP_HEADER]]111; CHECK: exit.1:112; CHECK-NEXT: ret void113;114entry:115 br label %loop.header116 117loop.header:118 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]119 %cmp = icmp uge i8 %N, %iv120 br i1 %cmp, label %loop.latch, label %exit.1121 122loop.latch:123 %t.1 = icmp uge i8 %N, %iv124 call void @use(i1 %t.1)125 %t.2 = icmp sge i8 %N, %iv126 call void @use(i1 %t.2)127 %f.1 = icmp ult i8 %N, %iv128 call void @use(i1 %f.1)129 %f.2 = icmp slt i8 %N, %iv130 call void @use(i1 %f.2)131 %iv.next = add nsw nuw i8 %iv, 1132 br label %loop.header133 134exit.1:135 ret void136}137 138define void @iv_known_non_negative_iv_variable_trip_count_ugt(i8 %N) {139; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_ugt(140; CHECK-NEXT: entry:141; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]142; CHECK: loop.header:143; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]144; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[IV]], [[N:%.*]]145; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]146; CHECK: loop.latch:147; CHECK-NEXT: call void @use(i1 true)148; CHECK-NEXT: call void @use(i1 true)149; CHECK-NEXT: call void @use(i1 false)150; CHECK-NEXT: call void @use(i1 false)151; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2152; CHECK-NEXT: call void @use(i1 [[C_0]])153; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1154; CHECK-NEXT: br label [[LOOP_HEADER]]155; CHECK: exit.1:156; CHECK-NEXT: ret void157;158entry:159 br label %loop.header160 161loop.header:162 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]163 %cmp = icmp ugt i8 %iv, %N164 br i1 %cmp, label %loop.latch, label %exit.1165 166loop.latch:167 %t.1 = icmp ugt i8 %iv, %N168 call void @use(i1 %t.1)169 %t.2 = icmp sgt i8 %iv, %N170 call void @use(i1 %t.2)171 %f.1 = icmp ult i8 %iv, %N172 call void @use(i1 %f.1)173 %f.2 = icmp slt i8 %iv, %N174 call void @use(i1 %f.2)175 %c.0 = icmp ugt i8 %iv, 2176 call void @use(i1 %c.0)177 %iv.next = add nsw nuw i8 %iv, 1178 br label %loop.header179 180exit.1:181 ret void182}183 184define void @iv_known_non_negative_iv_variable_trip_count_ugt_operands_swapped(i8 %N) {185; CHECK-LABEL: @iv_known_non_negative_iv_variable_trip_count_ugt_operands_swapped(186; CHECK-NEXT: entry:187; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]188; CHECK: loop.header:189; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]190; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N:%.*]], [[IV]]191; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]192; CHECK: loop.latch:193; CHECK-NEXT: call void @use(i1 true)194; CHECK-NEXT: [[T_2:%.*]] = icmp sgt i8 [[N]], [[IV]]195; CHECK-NEXT: call void @use(i1 [[T_2]])196; CHECK-NEXT: call void @use(i1 false)197; CHECK-NEXT: [[F_2:%.*]] = icmp slt i8 [[N]], [[IV]]198; CHECK-NEXT: call void @use(i1 [[F_2]])199; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2200; CHECK-NEXT: call void @use(i1 [[C_0]])201; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1202; CHECK-NEXT: br label [[LOOP_HEADER]]203; CHECK: exit.1:204; CHECK-NEXT: ret void205;206entry:207 br label %loop.header208 209loop.header:210 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop.latch ]211 %cmp = icmp ugt i8 %N, %iv212 br i1 %cmp, label %loop.latch, label %exit.1213 214loop.latch:215 %t.1 = icmp ugt i8 %N, %iv216 call void @use(i1 %t.1)217 %t.2 = icmp sgt i8 %N, %iv218 call void @use(i1 %t.2)219 %f.1 = icmp ult i8 %N, %iv220 call void @use(i1 %f.1)221 %f.2 = icmp slt i8 %N, %iv222 call void @use(i1 %f.2)223 %c.0 = icmp ugt i8 %iv, 2224 call void @use(i1 %c.0)225 %iv.next = add nsw nuw i8 %iv, 1226 br label %loop.header227 228exit.1:229 ret void230}231