brintos

brintos / llvm-project-archived public Read only

0
0
Text · 68.3 KiB · 1043b2f Raw
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