1300 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -disable-output "-passes=print<scalar-evolution>" %s 2>&1 | FileCheck %s3 4define i32 @logical_and_2ops(i32 %n, i32 %m) {5; CHECK-LABEL: 'logical_and_2ops'6; CHECK-NEXT: Classifying expressions for: @logical_and_2ops7; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]8; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }9; CHECK-NEXT: %i.next = add i32 %i, 110; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }11; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false12; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }13; CHECK-NEXT: Determining loop execution counts for: @logical_and_2ops14; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m)15; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -116; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)17; CHECK-NEXT: Loop %loop: Trip multiple is 118;19entry:20 br label %loop21loop:22 %i = phi i32 [0, %entry], [%i.next, %loop]23 %i.next = add i32 %i, 124 %cond_p0 = icmp ult i32 %i, %n25 %cond_p1 = icmp ult i32 %i, %m26 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false27 br i1 %cond, label %loop, label %exit28exit:29 ret i32 %i30}31 32define i32 @logical_or_2ops(i32 %n, i32 %m) {33; CHECK-LABEL: 'logical_or_2ops'34; CHECK-NEXT: Classifying expressions for: @logical_or_2ops35; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]36; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }37; CHECK-NEXT: %i.next = add i32 %i, 138; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }39; CHECK-NEXT: %cond = select i1 %cond_p0, i1 true, i1 %cond_p140; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }41; CHECK-NEXT: Determining loop execution counts for: @logical_or_2ops42; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m)43; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -144; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)45; CHECK-NEXT: Loop %loop: Trip multiple is 146;47entry:48 br label %loop49loop:50 %i = phi i32 [0, %entry], [%i.next, %loop]51 %i.next = add i32 %i, 152 %cond_p0 = icmp uge i32 %i, %n53 %cond_p1 = icmp uge i32 %i, %m54 %cond = select i1 %cond_p0, i1 true, i1 %cond_p155 br i1 %cond, label %exit, label %loop56exit:57 ret i32 %i58}59 60define i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {61; CHECK-LABEL: 'logical_and_3ops'62; CHECK-NEXT: Classifying expressions for: @logical_and_3ops63; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]64; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }65; CHECK-NEXT: %i.next = add i32 %i, 166; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }67; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false68; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }69; CHECK-NEXT: %cond = select i1 %cond_p3, i1 %cond_p2, i1 false70; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }71; CHECK-NEXT: Determining loop execution counts for: @logical_and_3ops72; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)73; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -174; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)75; CHECK-NEXT: Loop %loop: Trip multiple is 176;77entry:78 br label %loop79loop:80 %i = phi i32 [0, %entry], [%i.next, %loop]81 %i.next = add i32 %i, 182 %cond_p0 = icmp ult i32 %i, %n83 %cond_p1 = icmp ult i32 %i, %m84 %cond_p2 = icmp ult i32 %i, %k85 %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false86 %cond = select i1 %cond_p3, i1 %cond_p2, i1 false87 br i1 %cond, label %loop, label %exit88exit:89 ret i32 %i90}91 92define i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {93; CHECK-LABEL: 'logical_or_3ops'94; CHECK-NEXT: Classifying expressions for: @logical_or_3ops95; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]96; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }97; CHECK-NEXT: %i.next = add i32 %i, 198; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }99; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1100; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }101; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2102; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }103; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops104; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)105; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1106; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)107; CHECK-NEXT: Loop %loop: Trip multiple is 1108;109entry:110 br label %loop111loop:112 %i = phi i32 [0, %entry], [%i.next, %loop]113 %i.next = add i32 %i, 1114 %cond_p0 = icmp uge i32 %i, %n115 %cond_p1 = icmp uge i32 %i, %m116 %cond_p2 = icmp uge i32 %i, %k117 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1118 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2119 br i1 %cond, label %exit, label %loop120exit:121 ret i32 %i122}123 124define i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) {125; CHECK-LABEL: 'logical_or_3ops_duplicate'126; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_duplicate127; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]128; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }129; CHECK-NEXT: %i.next = add i32 %i, 1130; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }131; CHECK-NEXT: %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1132; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }133; CHECK-NEXT: %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2134; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq ((true + %cond_p1) umin (true + %cond_p2)))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }135; CHECK-NEXT: %cond = select i1 %cond_p5, i1 true, i1 %cond_p3136; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq ((true + %cond_p1) umin (true + %cond_p2)) umin_seq (true + %cond_p3))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }137; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_duplicate138; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)139; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1140; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)141; CHECK-NEXT: Loop %loop: Trip multiple is 1142;143entry:144 br label %loop145loop:146 %i = phi i32 [0, %entry], [%i.next, %loop]147 %i.next = add i32 %i, 1148 %cond_p0 = icmp uge i32 %i, %n149 %cond_p1 = icmp uge i32 %i, %m150 %cond_p2 = icmp uge i32 %i, %n151 %cond_p3 = icmp uge i32 %i, %k152 %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1153 %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2154 %cond = select i1 %cond_p5, i1 true, i1 %cond_p3155 br i1 %cond, label %exit, label %loop156exit:157 ret i32 %i158}159 160define i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) {161; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand'162; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand163; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]164; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }165; CHECK-NEXT: %i.next = add i32 %i, 1166; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }167; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)168; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }169; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1170; CHECK-NEXT: --> (true + ((true + %cond_p0) umin (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }171; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2172; CHECK-NEXT: --> (true + (((true + %cond_p0) umin (true + %cond_p1)) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }173; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand174; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)175; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1176; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)177; CHECK-NEXT: Loop %loop: Trip multiple is 1178;179entry:180 br label %loop181loop:182 %i = phi i32 [0, %entry], [%i.next, %loop]183 %i.next = add i32 %i, 1184 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)185 %cond_p0 = icmp uge i32 %i, %umin186 %cond_p1 = icmp uge i32 %i, %n187 %cond_p2 = icmp uge i32 %i, %k188 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1189 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2190 br i1 %cond, label %exit, label %loop191exit:192 ret i32 %i193}194 195define i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) {196; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand'197; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_redundant_umin_operand198; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]199; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable }200; CHECK-NEXT: %i.next = add i32 %i, 1201; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable }202; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)203; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }204; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1205; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }206; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2207; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }208; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand209; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m)210; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1211; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %k umin_seq %m)212; CHECK-NEXT: Loop %loop: Trip multiple is 1213;214entry:215 br label %loop216loop:217 %i = phi i32 [0, %entry], [%i.next, %loop]218 %i.next = add i32 %i, 1219 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)220 %cond_p0 = icmp uge i32 %i, %n221 %cond_p1 = icmp uge i32 %i, %k222 %cond_p2 = icmp uge i32 %i, %umin223 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1224 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2225 br i1 %cond, label %exit, label %loop226exit:227 ret i32 %i228}229 230define i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) {231; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins'232; CHECK-NEXT: Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins233; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]234; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k umin_seq %q) LoopDispositions: { %loop: Computable }235; CHECK-NEXT: %i.next = add i32 %i, 1236; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k umin_seq %q)) LoopDispositions: { %loop: Computable }237; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)238; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }239; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)240; CHECK-NEXT: --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant }241; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1242; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }243; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2244; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }245; CHECK-NEXT: Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins246; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)247; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1248; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)249; CHECK-NEXT: Loop %loop: Trip multiple is 1250;251entry:252 br label %loop253loop:254 %i = phi i32 [0, %entry], [%i.next, %loop]255 %i.next = add i32 %i, 1256 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)257 %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)258 %cond_p0 = icmp uge i32 %i, %umin259 %cond_p1 = icmp uge i32 %i, %k260 %cond_p2 = icmp uge i32 %i, %umin2261 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1262 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2263 br i1 %cond, label %exit, label %loop264exit:265 ret i32 %i266}267 268define i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) {269; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin'270; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin271; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]272; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }273; CHECK-NEXT: %i.next = add i32 %i, 1274; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }275; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)276; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }277; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)278; CHECK-NEXT: --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant }279; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1280; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }281; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2282; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }283; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin284; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)285; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1286; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)287; CHECK-NEXT: Loop %loop: Trip multiple is 1288;289entry:290 br label %loop291loop:292 %i = phi i32 [0, %entry], [%i.next, %loop]293 %i.next = add i32 %i, 1294 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)295 %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)296 %cond_p0 = icmp uge i32 %i, %umin297 %cond_p1 = icmp uge i32 %i, %k298 %cond_p2 = icmp uge i32 %i, %umin2299 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1300 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2301 br i1 %cond, label %exit, label %loop302exit:303 ret i32 %i304}305 306define i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) {307; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin'308; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_partially_redundant_umin309; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]310; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable }311; CHECK-NEXT: %i.next = add i32 %i, 1312; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable }313; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)314; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }315; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)316; CHECK-NEXT: --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant }317; CHECK-NEXT: %cond = select i1 %cond_p0, i1 true, i1 %cond_p1318; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }319; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin320; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k))321; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1322; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%m umin %k))323; CHECK-NEXT: Loop %loop: Trip multiple is 1324;325entry:326 br label %loop327loop:328 %i = phi i32 [0, %entry], [%i.next, %loop]329 %i.next = add i32 %i, 1330 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)331 %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)332 %cond_p0 = icmp uge i32 %i, %n333 %cond_p1 = icmp uge i32 %i, %umin2334 %cond = select i1 %cond_p0, i1 true, i1 %cond_p1335 br i1 %cond, label %exit, label %loop336exit:337 ret i32 %i338}339 340define i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {341; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq'342; CHECK-NEXT: Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq343; CHECK-NEXT: %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ]344; CHECK-NEXT: --> {0,+,1}<%first.loop> U: full-set S: full-set Exits: (%e umin_seq %d umin_seq %a) LoopDispositions: { %first.loop: Computable }345; CHECK-NEXT: %first.i.next = add i32 %first.i, 1346; CHECK-NEXT: --> {1,+,1}<%first.loop> U: full-set S: full-set Exits: (1 + (%e umin_seq %d umin_seq %a)) LoopDispositions: { %first.loop: Computable }347; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1348; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }349; CHECK-NEXT: %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2350; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }351; CHECK-NEXT: %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ]352; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c)) LoopDispositions: { %loop: Computable }353; CHECK-NEXT: %i.next = add i32 %i, 1354; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))) LoopDispositions: { %loop: Computable }355; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)356; CHECK-NEXT: --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant }357; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)358; CHECK-NEXT: --> ({0,+,1}<%first.loop> umin %c umin %d) U: full-set S: full-set --> ((%e umin_seq %d umin_seq %a) umin %c umin %d) U: full-set S: full-set Exits: ((%e umin_seq %d umin_seq %a) umin %c umin %d) LoopDispositions: { %loop: Invariant }359; CHECK-NEXT: %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6360; CHECK-NEXT: --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }361; CHECK-NEXT: %cond = select i1 %cond_p8, i1 true, i1 %cond_p7362; CHECK-NEXT: --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6) umin_seq (true + %cond_p7))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }363; CHECK-NEXT: Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq364; CHECK-NEXT: Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))365; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1366; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))367; CHECK-NEXT: Loop %loop: Trip multiple is 1368; CHECK-NEXT: Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a)369; CHECK-NEXT: Loop %first.loop: constant max backedge-taken count is i32 -1370; CHECK-NEXT: Loop %first.loop: symbolic max backedge-taken count is (%e umin_seq %d umin_seq %a)371; CHECK-NEXT: Loop %first.loop: Trip multiple is 1372;373entry:374 br label %first.loop375first.loop:376 %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop]377 %first.i.next = add i32 %first.i, 1378 %cond_p0 = icmp uge i32 %first.i, %e379 %cond_p1 = icmp uge i32 %first.i, %d380 %cond_p2 = icmp uge i32 %first.i, %a381 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1382 %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2383 br i1 %cond_p4, label %first.loop.exit, label %first.loop384first.loop.exit:385 br label %loop386loop:387 %i = phi i32 [0, %first.loop.exit], [%i.next, %loop]388 %i.next = add i32 %i, 1389 %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)390 %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)391 %cond_p5 = icmp uge i32 %i, %a392 %cond_p6 = icmp uge i32 %i, %b393 %cond_p7 = icmp uge i32 %i, %umin2394 %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6395 %cond = select i1 %cond_p8, i1 true, i1 %cond_p7396 br i1 %cond, label %exit, label %loop397exit:398 ret i32 %i399}400 401define i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) {402; CHECK-LABEL: 'logical_and_2ops_and_constant'403; CHECK-NEXT: Classifying expressions for: @logical_and_2ops_and_constant404; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]405; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable }406; CHECK-NEXT: %i.next = add i32 %i, 1407; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable }408; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)409; CHECK-NEXT: --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant }410; CHECK-NEXT: %cond = select i1 %cond_p1, i1 true, i1 %cond_p0411; CHECK-NEXT: --> (true + ((true + %cond_p1) umin (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }412; CHECK-NEXT: Determining loop execution counts for: @logical_and_2ops_and_constant413; CHECK-NEXT: Loop %loop: backedge-taken count is (42 umin %n)414; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 42415; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (42 umin %n)416; CHECK-NEXT: Loop %loop: Trip multiple is 1417;418entry:419 br label %loop420loop:421 %i = phi i32 [0, %entry], [%i.next, %loop]422 %i.next = add i32 %i, 1423 %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)424 %cond_p0 = icmp uge i32 %i, %umin425 %cond_p1 = icmp uge i32 %i, %n426 %cond = select i1 %cond_p1, i1 true, i1 %cond_p0427 br i1 %cond, label %exit, label %loop428exit:429 ret i32 %i430}431 432define i32 @computeSCEVAtScope(i32 %d.0) {433; CHECK-LABEL: 'computeSCEVAtScope'434; CHECK-NEXT: Classifying expressions for: @computeSCEVAtScope435; CHECK-NEXT: %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]436; CHECK-NEXT: --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }437; CHECK-NEXT: %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]438; CHECK-NEXT: --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }439; CHECK-NEXT: %0 = select i1 %tobool1, i1 %tobool2, i1 false440; CHECK-NEXT: --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant }441; CHECK-NEXT: %inc = add nsw i32 %d.1, 1442; CHECK-NEXT: --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }443; CHECK-NEXT: %inc3 = add nsw i32 %e.1, 1444; CHECK-NEXT: --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }445; CHECK-NEXT: %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]446; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }447; CHECK-NEXT: %inc8 = add i32 %f.1, 1448; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }449; CHECK-NEXT: Determining loop execution counts for: @computeSCEVAtScope450; CHECK-NEXT: Loop %for.cond: backedge-taken count is (-1 * %d.0)451; CHECK-NEXT: Loop %for.cond: constant max backedge-taken count is i32 -1452; CHECK-NEXT: Loop %for.cond: symbolic max backedge-taken count is (-1 * %d.0)453; CHECK-NEXT: Loop %for.cond: Trip multiple is 1454; CHECK-NEXT: Loop %for.cond4: backedge-taken count is i32 0455; CHECK-NEXT: Loop %for.cond4: constant max backedge-taken count is i32 0456; CHECK-NEXT: Loop %for.cond4: symbolic max backedge-taken count is i32 0457; CHECK-NEXT: Loop %for.cond4: Trip multiple is 1458; CHECK-NEXT: Loop %while.cond: <multiple exits> Unpredictable backedge-taken count.459; CHECK-NEXT: Loop %while.cond: Unpredictable constant max backedge-taken count.460; CHECK-NEXT: Loop %while.cond: Unpredictable symbolic max backedge-taken count.461;462entry:463 br label %while.cond464 465while.cond.loopexit: ; preds = %for.cond4466 br label %while.cond467 468while.cond: ; preds = %while.cond.loopexit, %entry469 br label %for.cond.preheader470 471for.cond.preheader: ; preds = %while.cond472 br label %for.cond473 474for.cond: ; preds = %for.body, %for.cond.preheader475 %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]476 %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]477 %tobool1 = icmp ne i32 %e.1, 0478 %tobool2 = icmp ne i32 %d.1, 0479 %0 = select i1 %tobool1, i1 %tobool2, i1 false480 br i1 %0, label %for.body, label %for.cond4.preheader481 482for.cond4.preheader: ; preds = %for.cond483 br label %for.cond4484 485for.body: ; preds = %for.cond486 %inc = add nsw i32 %d.1, 1487 %inc3 = add nsw i32 %e.1, 1488 br label %for.cond489 490for.cond4: ; preds = %for.body5, %for.cond4.preheader491 %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]492 %exitcond.not = icmp eq i32 %f.1, %e.1493 br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5494 495for.body5: ; preds = %for.cond4496 %inc8 = add i32 %f.1, 1497 br label %for.cond4498}499 500define i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, ptr %ptr) {501; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity'502; CHECK-NEXT: Classifying expressions for: @uminseq_vs_ptrtoint_complexity503; CHECK-NEXT: %i = phi i64 [ 0, %entry ], [ %i.next, %loop ]504; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }505; CHECK-NEXT: %i.next = add i64 %i, 1506; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }507; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false508; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }509; CHECK-NEXT: %ptr.int = ptrtoint ptr %ptr to i64510; CHECK-NEXT: --> (ptrtoint ptr %ptr to i64) U: full-set S: full-set511; CHECK-NEXT: %r = add i64 %i, %ptr.int512; CHECK-NEXT: --> {(ptrtoint ptr %ptr to i64),+,1}<%loop> U: full-set S: full-set --> ((%n umin_seq %m) + (ptrtoint ptr %ptr to i64)) U: full-set S: full-set513; CHECK-NEXT: Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity514; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m)515; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1516; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)517; CHECK-NEXT: Loop %loop: Trip multiple is 1518;519entry:520 br label %loop521loop:522 %i = phi i64 [0, %entry], [%i.next, %loop]523 %i.next = add i64 %i, 1524 %cond_p0 = icmp ult i64 %i, %n525 %cond_p1 = icmp ult i64 %i, %m526 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false527 br i1 %cond, label %loop, label %exit528exit:529 %ptr.int = ptrtoint ptr %ptr to i64530 %r = add i64 %i, %ptr.int531 ret i64 %r532}533 534define i32 @logical_and_implies_poison1(i32 %n) {535; CHECK-LABEL: 'logical_and_implies_poison1'536; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison1537; CHECK-NEXT: %add = add i32 %n, 1538; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set539; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]540; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }541; CHECK-NEXT: %i.next = add i32 %i, 1542; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }543; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false544; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }545; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison1546; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + %n) umin %n)547; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1548; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)549; CHECK-NEXT: Loop %loop: Trip multiple is 1550;551entry:552 %add = add i32 %n, 1553 br label %loop554loop:555 %i = phi i32 [0, %entry], [%i.next, %loop]556 %i.next = add i32 %i, 1557 %cond_p0 = icmp ult i32 %i, %n558 %cond_p1 = icmp ult i32 %i, %add559 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false560 br i1 %cond, label %loop, label %exit561exit:562 ret i32 %i563}564 565define i32 @logical_and_implies_poison2(i32 %n) {566; CHECK-LABEL: 'logical_and_implies_poison2'567; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison2568; CHECK-NEXT: %add = add i32 %n, 1569; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set570; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]571; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }572; CHECK-NEXT: %i.next = add i32 %i, 1573; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }574; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false575; CHECK-NEXT: --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }576; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison2577; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + %n) umin %n)578; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1579; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)580; CHECK-NEXT: Loop %loop: Trip multiple is 1581;582entry:583 %add = add i32 %n, 1584 br label %loop585loop:586 %i = phi i32 [0, %entry], [%i.next, %loop]587 %i.next = add i32 %i, 1588 %cond_p0 = icmp ult i32 %i, %add589 %cond_p1 = icmp ult i32 %i, %n590 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false591 br i1 %cond, label %loop, label %exit592exit:593 ret i32 %i594}595 596define i32 @logical_and_implies_poison3(i32 %n, i32 %m) {597; CHECK-LABEL: 'logical_and_implies_poison3'598; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison3599; CHECK-NEXT: %add = add i32 %n, %m600; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set601; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]602; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable }603; CHECK-NEXT: %i.next = add i32 %i, 1604; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable }605; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false606; CHECK-NEXT: --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }607; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison3608; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin %n)609; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1610; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin %n)611; CHECK-NEXT: Loop %loop: Trip multiple is 1612;613entry:614 %add = add i32 %n, %m615 br label %loop616loop:617 %i = phi i32 [0, %entry], [%i.next, %loop]618 %i.next = add i32 %i, 1619 %cond_p0 = icmp ult i32 %i, %add620 %cond_p1 = icmp ult i32 %i, %n621 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false622 br i1 %cond, label %loop, label %exit623exit:624 ret i32 %i625}626 627define i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) {628; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction'629; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_wrong_direction630; CHECK-NEXT: %add = add i32 %n, %m631; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set632; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]633; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable }634; CHECK-NEXT: %i.next = add i32 %i, 1635; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable }636; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false637; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }638; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_wrong_direction639; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq (%n + %m))640; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1641; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%n + %m))642; CHECK-NEXT: Loop %loop: Trip multiple is 1643;644entry:645 %add = add i32 %n, %m646 br label %loop647loop:648 %i = phi i32 [0, %entry], [%i.next, %loop]649 %i.next = add i32 %i, 1650 %cond_p0 = icmp ult i32 %i, %n651 %cond_p1 = icmp ult i32 %i, %add652 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false653 br i1 %cond, label %loop, label %exit654exit:655 ret i32 %i656}657 658define i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) {659; CHECK-LABEL: 'logical_and_implies_poison_noundef'660; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_noundef661; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]662; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable }663; CHECK-NEXT: %i.next = add i32 %i, 1664; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable }665; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false666; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }667; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_noundef668; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin %m)669; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1670; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin %m)671; CHECK-NEXT: Loop %loop: Trip multiple is 1672;673entry:674 br label %loop675loop:676 %i = phi i32 [0, %entry], [%i.next, %loop]677 %i.next = add i32 %i, 1678 %cond_p0 = icmp ult i32 %i, %n679 %cond_p1 = icmp ult i32 %i, %m680 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false681 br i1 %cond, label %loop, label %exit682exit:683 ret i32 %i684}685 686define i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) {687; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction'688; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction689; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]690; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable }691; CHECK-NEXT: %i.next = add i32 %i, 1692; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable }693; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false694; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }695; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction696; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq %n)697; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1698; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%m umin_seq %n)699; CHECK-NEXT: Loop %loop: Trip multiple is 1700;701entry:702 br label %loop703loop:704 %i = phi i32 [0, %entry], [%i.next, %loop]705 %i.next = add i32 %i, 1706 %cond_p0 = icmp ult i32 %i, %m707 %cond_p1 = icmp ult i32 %i, %n708 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false709 br i1 %cond, label %loop, label %exit710exit:711 ret i32 %i712}713 714define i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) {715; CHECK-LABEL: 'logical_and_implies_poison_complex1'716; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex1717; CHECK-NEXT: %add = add i32 %n, %m718; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set719; CHECK-NEXT: %add1 = add i32 %add, 1720; CHECK-NEXT: --> (1 + %n + %m) U: full-set S: full-set721; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]722; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable }723; CHECK-NEXT: %i.next = add i32 %i, 1724; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable }725; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false726; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }727; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex1728; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m))729; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1730; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (1 + %n + %m))731; CHECK-NEXT: Loop %loop: Trip multiple is 1732;733entry:734 %add = add i32 %n, %m735 %add1 = add i32 %add, 1736 br label %loop737loop:738 %i = phi i32 [0, %entry], [%i.next, %loop]739 %i.next = add i32 %i, 1740 %cond_p0 = icmp ult i32 %i, %add1741 %cond_p1 = icmp ult i32 %i, %add742 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false743 br i1 %cond, label %loop, label %exit744exit:745 ret i32 %i746}747 748define i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) {749; CHECK-LABEL: 'logical_and_implies_poison_complex2'750; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex2751; CHECK-NEXT: %add = add i32 %n, %m752; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set753; CHECK-NEXT: %add1 = add i32 %add, %l754; CHECK-NEXT: --> (%n + %m + %l) U: full-set S: full-set755; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]756; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable }757; CHECK-NEXT: %i.next = add i32 %i, 1758; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable }759; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false760; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }761; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex2762; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l))763; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1764; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (%n + %m + %l))765; CHECK-NEXT: Loop %loop: Trip multiple is 1766;767entry:768 %add = add i32 %n, %m769 %add1 = add i32 %add, %l770 br label %loop771loop:772 %i = phi i32 [0, %entry], [%i.next, %loop]773 %i.next = add i32 %i, 1774 %cond_p0 = icmp ult i32 %i, %add1775 %cond_p1 = icmp ult i32 %i, %add776 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false777 br i1 %cond, label %loop, label %exit778exit:779 ret i32 %i780}781 782define i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) {783; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction'784; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction785; CHECK-NEXT: %add = add i32 %n, %m786; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set787; CHECK-NEXT: %add1 = add i32 %add, %l788; CHECK-NEXT: --> (%n + %m + %l) U: full-set S: full-set789; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]790; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable }791; CHECK-NEXT: %i.next = add i32 %i, 1792; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable }793; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false794; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }795; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction796; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))797; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1798; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))799; CHECK-NEXT: Loop %loop: Trip multiple is 1800;801entry:802 %add = add i32 %n, %m803 %add1 = add i32 %add, %l804 br label %loop805loop:806 %i = phi i32 [0, %entry], [%i.next, %loop]807 %i.next = add i32 %i, 1808 %cond_p0 = icmp ult i32 %i, %add809 %cond_p1 = icmp ult i32 %i, %add1810 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false811 br i1 %cond, label %loop, label %exit812exit:813 ret i32 %i814}815 816define i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) {817; CHECK-LABEL: 'logical_and_implies_multiple_ops'818; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops819; CHECK-NEXT: %add = add i32 %n, 1820; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set821; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]822; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable }823; CHECK-NEXT: %i.next = add i32 %i, 1824; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable }825; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false826; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }827; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false828; CHECK-NEXT: --> ((%cond_p0 umin %cond_p1) umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }829; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops830; CHECK-NEXT: Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m)831; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1832; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((1 + %n) umin %n) umin_seq %m)833; CHECK-NEXT: Loop %loop: Trip multiple is 1834;835entry:836 %add = add i32 %n, 1837 br label %loop838loop:839 %i = phi i32 [0, %entry], [%i.next, %loop]840 %i.next = add i32 %i, 1841 %cond_p0 = icmp ult i32 %i, %n842 %cond_p1 = icmp ult i32 %i, %add843 %cond_p2 = icmp ult i32 %i, %m844 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false845 %cond2 = select i1 %cond, i1 %cond_p2, i1 false846 br i1 %cond2, label %loop, label %exit847exit:848 ret i32 %i849}850 851define i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) {852; CHECK-LABEL: 'logical_and_implies_multiple_ops2'853; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops2854; CHECK-NEXT: %add = add i32 %n, 1855; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set856; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]857; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq ((1 + %n) umin %m)) LoopDispositions: { %loop: Computable }858; CHECK-NEXT: %i.next = add i32 %i, 1859; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq ((1 + %n) umin %m))) LoopDispositions: { %loop: Computable }860; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false861; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }862; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false863; CHECK-NEXT: --> (%cond_p0 umin_seq (%cond_p1 umin %cond_p2)) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }864; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops2865; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq ((1 + %n) umin %m))866; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1867; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq ((1 + %n) umin %m))868; CHECK-NEXT: Loop %loop: Trip multiple is 1869;870entry:871 %add = add i32 %n, 1872 br label %loop873loop:874 %i = phi i32 [0, %entry], [%i.next, %loop]875 %i.next = add i32 %i, 1876 %cond_p0 = icmp ult i32 %i, %n877 %cond_p1 = icmp ult i32 %i, %m878 %cond_p2 = icmp ult i32 %i, %add879 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false880 %cond2 = select i1 %cond, i1 %cond_p2, i1 false881 br i1 %cond2, label %loop, label %exit882exit:883 ret i32 %i884}885 886define i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) {887; CHECK-LABEL: 'logical_and_implies_multiple_ops3'888; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops3889; CHECK-NEXT: %add = add i32 %n, 1890; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set891; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]892; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }893; CHECK-NEXT: %i.next = add i32 %i, 1894; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable }895; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false896; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }897; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false898; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }899; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops3900; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n))901; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1902; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%m umin_seq ((1 + %n) umin %n))903; CHECK-NEXT: Loop %loop: Trip multiple is 1904;905entry:906 %add = add i32 %n, 1907 br label %loop908loop:909 %i = phi i32 [0, %entry], [%i.next, %loop]910 %i.next = add i32 %i, 1911 %cond_p0 = icmp ult i32 %i, %m912 %cond_p1 = icmp ult i32 %i, %n913 %cond_p2 = icmp ult i32 %i, %add914 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false915 %cond2 = select i1 %cond, i1 %cond_p2, i1 false916 br i1 %cond2, label %loop, label %exit917exit:918 ret i32 %i919}920 921define i32 @logical_and_not_zero(i16 %n, i32 %m) {922; CHECK-LABEL: 'logical_and_not_zero'923; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero924; CHECK-NEXT: %n.ext = zext i16 %n to i32925; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)926; CHECK-NEXT: %n1 = add i32 %n.ext, 1927; CHECK-NEXT: --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)928; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]929; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65537) S: [0,65537) Exits: ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) LoopDispositions: { %loop: Computable }930; CHECK-NEXT: %i.next = add i32 %i, 1931; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65538) S: [1,65538) Exits: (1 + ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m))<nuw><nsw> LoopDispositions: { %loop: Computable }932; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false933; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }934; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero935; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)936; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65536937; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)938; CHECK-NEXT: Loop %loop: Trip multiple is 1939;940entry:941 %n.ext = zext i16 %n to i32942 %n1 = add i32 %n.ext, 1943 br label %loop944loop:945 %i = phi i32 [0, %entry], [%i.next, %loop]946 %i.next = add i32 %i, 1947 %cond_p0 = icmp ult i32 %i, %n1948 %cond_p1 = icmp ult i32 %i, %m949 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false950 br i1 %cond, label %loop, label %exit951exit:952 ret i32 %i953}954 955define i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) {956; CHECK-LABEL: 'logical_and_not_zero_wrong_order'957; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero_wrong_order958; CHECK-NEXT: %n.ext = zext i16 %n to i32959; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)960; CHECK-NEXT: %n1 = add i32 %n.ext, 1961; CHECK-NEXT: --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)962; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]963; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65537) S: [0,65537) Exits: (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }964; CHECK-NEXT: %i.next = add i32 %i, 1965; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65538) S: [1,65538) Exits: (1 + (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable }966; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false967; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }968; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero_wrong_order969; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)970; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65536971; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)972; CHECK-NEXT: Loop %loop: Trip multiple is 1973;974entry:975 %n.ext = zext i16 %n to i32976 %n1 = add i32 %n.ext, 1977 br label %loop978loop:979 %i = phi i32 [0, %entry], [%i.next, %loop]980 %i.next = add i32 %i, 1981 %cond_p0 = icmp ult i32 %i, %m982 %cond_p1 = icmp ult i32 %i, %n1983 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false984 br i1 %cond, label %loop, label %exit985exit:986 ret i32 %i987}988 989define i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) {990; CHECK-LABEL: 'logical_and_not_zero_needs_context'991; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero_needs_context992; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]993; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }994; CHECK-NEXT: %i.next = add i32 %i, 1995; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }996; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false997; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }998; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero_needs_context999; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m)1000; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -11001; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)1002; CHECK-NEXT: Loop %loop: Trip multiple is 11003;1004entry:1005 %cmp = icmp ne i32 %n, 01006 br i1 %cmp, label %loop, label %guard.fail1007loop:1008 %i = phi i32 [0, %entry], [%i.next, %loop]1009 %i.next = add i32 %i, 11010 %cond_p0 = icmp ult i32 %i, %n1011 %cond_p1 = icmp ult i32 %i, %m1012 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1013 br i1 %cond, label %loop, label %exit1014exit:1015 ret i32 %i1016guard.fail:1017 ret i32 -11018}1019 1020define i32 @logical_and_known_smaller(i16 %n, i16 %m) {1021; CHECK-LABEL: 'logical_and_known_smaller'1022; CHECK-NEXT: Classifying expressions for: @logical_and_known_smaller1023; CHECK-NEXT: %n.ext = zext i16 %n to i321024; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)1025; CHECK-NEXT: %m.ext = zext i16 %m to i321026; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)1027; CHECK-NEXT: %m.add = add i32 %m.ext, 655361028; CHECK-NEXT: --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)1029; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1030; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }1031; CHECK-NEXT: %i.next = add i32 %i, 11032; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }1033; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1034; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }1035; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_smaller1036; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32)1037; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 655351038; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)1039; CHECK-NEXT: Loop %loop: Trip multiple is 11040;1041entry:1042 %n.ext = zext i16 %n to i321043 %m.ext = zext i16 %m to i321044 %m.add = add i32 %m.ext, 655361045 br label %loop1046loop:1047 %i = phi i32 [0, %entry], [%i.next, %loop]1048 %i.next = add i32 %i, 11049 %cond_p0 = icmp ult i32 %i, %n.ext1050 %cond_p1 = icmp ult i32 %i, %m.add1051 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1052 br i1 %cond, label %loop, label %exit1053exit:1054 ret i32 %i1055}1056 1057define i32 @logical_and_known_smaller_equal(i16 %n, i16 %m) {1058; CHECK-LABEL: 'logical_and_known_smaller_equal'1059; CHECK-NEXT: Classifying expressions for: @logical_and_known_smaller_equal1060; CHECK-NEXT: %n.ext = zext i16 %n to i321061; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)1062; CHECK-NEXT: %m.ext = zext i16 %m to i321063; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)1064; CHECK-NEXT: %m.add = add i32 %m.ext, 655351065; CHECK-NEXT: --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)1066; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1067; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }1068; CHECK-NEXT: %i.next = add i32 %i, 11069; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }1070; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1071; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }1072; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_smaller_equal1073; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32)1074; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 655351075; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)1076; CHECK-NEXT: Loop %loop: Trip multiple is 11077;1078entry:1079 %n.ext = zext i16 %n to i321080 %m.ext = zext i16 %m to i321081 %m.add = add i32 %m.ext, 655351082 br label %loop1083loop:1084 %i = phi i32 [0, %entry], [%i.next, %loop]1085 %i.next = add i32 %i, 11086 %cond_p0 = icmp ult i32 %i, %n.ext1087 %cond_p1 = icmp ult i32 %i, %m.add1088 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1089 br i1 %cond, label %loop, label %exit1090exit:1091 ret i32 %i1092}1093 1094define i32 @logical_and_not_known_smaller_equal(i16 %n, i16 %m) {1095; CHECK-LABEL: 'logical_and_not_known_smaller_equal'1096; CHECK-NEXT: Classifying expressions for: @logical_and_not_known_smaller_equal1097; CHECK-NEXT: %n.ext = zext i16 %n to i321098; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)1099; CHECK-NEXT: %m.ext = zext i16 %m to i321100; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)1101; CHECK-NEXT: %m.add = add i32 %m.ext, 655341102; CHECK-NEXT: --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)1103; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1104; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }1105; CHECK-NEXT: %i.next = add i32 %i, 11106; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable }1107; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1108; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }1109; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_known_smaller_equal1110; CHECK-NEXT: Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)1111; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 655351112; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)1113; CHECK-NEXT: Loop %loop: Trip multiple is 11114;1115entry:1116 %n.ext = zext i16 %n to i321117 %m.ext = zext i16 %m to i321118 %m.add = add i32 %m.ext, 655341119 br label %loop1120loop:1121 %i = phi i32 [0, %entry], [%i.next, %loop]1122 %i.next = add i32 %i, 11123 %cond_p0 = icmp ult i32 %i, %n.ext1124 %cond_p1 = icmp ult i32 %i, %m.add1125 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1126 br i1 %cond, label %loop, label %exit1127exit:1128 ret i32 %i1129}1130 1131define i32 @logical_and_known_greater(i16 %n, i16 %m) {1132; CHECK-LABEL: 'logical_and_known_greater'1133; CHECK-NEXT: Classifying expressions for: @logical_and_known_greater1134; CHECK-NEXT: %n.ext = zext i16 %n to i321135; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)1136; CHECK-NEXT: %m.ext = zext i16 %m to i321137; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)1138; CHECK-NEXT: %m.add = add i32 %m.ext, 655361139; CHECK-NEXT: --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)1140; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1141; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }1142; CHECK-NEXT: %i.next = add i32 %i, 11143; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }1144; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1145; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }1146; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_greater1147; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32)1148; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 655351149; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)1150; CHECK-NEXT: Loop %loop: Trip multiple is 11151;1152entry:1153 %n.ext = zext i16 %n to i321154 %m.ext = zext i16 %m to i321155 %m.add = add i32 %m.ext, 655361156 br label %loop1157loop:1158 %i = phi i32 [0, %entry], [%i.next, %loop]1159 %i.next = add i32 %i, 11160 %cond_p0 = icmp ult i32 %i, %m.add1161 %cond_p1 = icmp ult i32 %i, %n.ext1162 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1163 br i1 %cond, label %loop, label %exit1164exit:1165 ret i32 %i1166}1167 1168define i32 @logical_and_known_greater_equal(i16 %n, i16 %m) {1169; CHECK-LABEL: 'logical_and_known_greater_equal'1170; CHECK-NEXT: Classifying expressions for: @logical_and_known_greater_equal1171; CHECK-NEXT: %n.ext = zext i16 %n to i321172; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)1173; CHECK-NEXT: %m.ext = zext i16 %m to i321174; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)1175; CHECK-NEXT: %m.add = add i32 %m.ext, 655351176; CHECK-NEXT: --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)1177; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1178; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }1179; CHECK-NEXT: %i.next = add i32 %i, 11180; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }1181; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1182; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }1183; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_greater_equal1184; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32)1185; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 655351186; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)1187; CHECK-NEXT: Loop %loop: Trip multiple is 11188;1189entry:1190 %n.ext = zext i16 %n to i321191 %m.ext = zext i16 %m to i321192 %m.add = add i32 %m.ext, 655351193 br label %loop1194loop:1195 %i = phi i32 [0, %entry], [%i.next, %loop]1196 %i.next = add i32 %i, 11197 %cond_p0 = icmp ult i32 %i, %m.add1198 %cond_p1 = icmp ult i32 %i, %n.ext1199 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1200 br i1 %cond, label %loop, label %exit1201exit:1202 ret i32 %i1203}1204 1205define i32 @logical_and_not_known_greater_equal(i16 %n, i16 %m) {1206; CHECK-LABEL: 'logical_and_not_known_greater_equal'1207; CHECK-NEXT: Classifying expressions for: @logical_and_not_known_greater_equal1208; CHECK-NEXT: %n.ext = zext i16 %n to i321209; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)1210; CHECK-NEXT: %m.ext = zext i16 %m to i321211; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)1212; CHECK-NEXT: %m.add = add i32 %m.ext, 655341213; CHECK-NEXT: --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)1214; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1215; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }1216; CHECK-NEXT: %i.next = add i32 %i, 11217; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable }1218; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1219; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }1220; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_known_greater_equal1221; CHECK-NEXT: Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)1222; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 655351223; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)1224; CHECK-NEXT: Loop %loop: Trip multiple is 11225;1226entry:1227 %n.ext = zext i16 %n to i321228 %m.ext = zext i16 %m to i321229 %m.add = add i32 %m.ext, 655341230 br label %loop1231loop:1232 %i = phi i32 [0, %entry], [%i.next, %loop]1233 %i.next = add i32 %i, 11234 %cond_p0 = icmp ult i32 %i, %m.add1235 %cond_p1 = icmp ult i32 %i, %n.ext1236 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1237 br i1 %cond, label %loop, label %exit1238exit:1239 ret i32 %i1240}1241 1242define i32 @logical_and_zero_arg1(i32 %n) {1243; CHECK-LABEL: 'logical_and_zero_arg1'1244; CHECK-NEXT: Classifying expressions for: @logical_and_zero_arg11245; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1246; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }1247; CHECK-NEXT: %i.next = add i32 %i, 11248; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }1249; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1250; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }1251; CHECK-NEXT: Determining loop execution counts for: @logical_and_zero_arg11252; CHECK-NEXT: Loop %loop: backedge-taken count is i32 01253; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 01254; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i32 01255; CHECK-NEXT: Loop %loop: Trip multiple is 11256;1257entry:1258 br label %loop1259loop:1260 %i = phi i32 [0, %entry], [%i.next, %loop]1261 %i.next = add i32 %i, 11262 %cond_p0 = icmp ult i32 %i, 01263 %cond_p1 = icmp ult i32 %i, %n1264 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1265 br i1 %cond, label %loop, label %exit1266exit:1267 ret i32 %i1268}1269 1270define i32 @logical_and_zero_arg2(i32 %n) {1271; CHECK-LABEL: 'logical_and_zero_arg2'1272; CHECK-NEXT: Classifying expressions for: @logical_and_zero_arg21273; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]1274; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }1275; CHECK-NEXT: %i.next = add i32 %i, 11276; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }1277; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1278; CHECK-NEXT: --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }1279; CHECK-NEXT: Determining loop execution counts for: @logical_and_zero_arg21280; CHECK-NEXT: Loop %loop: backedge-taken count is i32 01281; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 01282; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i32 01283; CHECK-NEXT: Loop %loop: Trip multiple is 11284;1285entry:1286 br label %loop1287loop:1288 %i = phi i32 [0, %entry], [%i.next, %loop]1289 %i.next = add i32 %i, 11290 %cond_p0 = icmp ult i32 %i, %n1291 %cond_p1 = icmp ult i32 %i, 01292 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false1293 br i1 %cond, label %loop, label %exit1294exit:1295 ret i32 %i1296}1297 1298 1299declare i32 @llvm.umin.i32(i32, i32)1300