brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.3 KiB · f35c48b Raw
763 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s3 4; Tests for PR47904.5 6define void @test_trip_multiple_4(i32 %num) {7; CHECK-LABEL: 'test_trip_multiple_4'8; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_49; CHECK-NEXT:    %u = urem i32 %num, 410; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)11; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]12; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }13; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 114; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }15; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_416; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)17; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -218; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)19; CHECK-NEXT:  Loop %for.body: Trip multiple is 420;21entry:22  %u = urem i32 %num, 423  %cmp = icmp eq i32 %u, 024  tail call void @llvm.assume(i1 %cmp)25  %cmp.1 = icmp uge i32 %num, 426  tail call void @llvm.assume(i1 %cmp.1)27  br label %for.body28 29for.body:30  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]31  %inc = add nuw nsw i32 %i.010, 132  %cmp2 = icmp ult i32 %inc, %num33  br i1 %cmp2, label %for.body, label %exit34 35exit:36  ret void37}38 39define void @test_trip_multiple_4_guard(i32 %num) {40; CHECK-LABEL: 'test_trip_multiple_4_guard'41; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_guard42; CHECK-NEXT:    %u = urem i32 %num, 443; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)44; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]45; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }46; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 147; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }48; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_guard49; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)50; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -251; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)52; CHECK-NEXT:  Loop %for.body: Trip multiple is 453;54entry:55  %u = urem i32 %num, 456  %cmp = icmp eq i32 %u, 057  call void(i1, ...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]58  %cmp.1 = icmp uge i32 %num, 459  call void(i1, ...) @llvm.experimental.guard(i1 %cmp.1) [ "deopt"() ]60  br label %for.body61 62for.body:63  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]64  %inc = add nuw nsw i32 %i.010, 165  %cmp2 = icmp ult i32 %inc, %num66  br i1 %cmp2, label %for.body, label %exit67 68exit:69  ret void70}71 72 73define void @test_trip_multiple_4_ugt_5(i32 %num) {74; CHECK-LABEL: 'test_trip_multiple_4_ugt_5'75; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_ugt_576; CHECK-NEXT:    %u = urem i32 %num, 477; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)78; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]79; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }80; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 181; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }82; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_ugt_583; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)84; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -285; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)86; CHECK-NEXT:  Loop %for.body: Trip multiple is 487;88entry:89  %u = urem i32 %num, 490  %cmp = icmp eq i32 %u, 091  tail call void @llvm.assume(i1 %cmp)92  %cmp.1 = icmp ugt i32 %num, 593  tail call void @llvm.assume(i1 %cmp.1)94  br label %for.body95 96for.body:97  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]98  %inc = add nuw nsw i32 %i.010, 199  %cmp2 = icmp ult i32 %inc, %num100  br i1 %cmp2, label %for.body, label %exit101 102exit:103  ret void104}105 106define void @test_trip_multiple_4_ugt_5_order_swapped(i32 %num) {107; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.108; CHECK-LABEL: 'test_trip_multiple_4_ugt_5_order_swapped'109; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_ugt_5_order_swapped110; CHECK-NEXT:    %u = urem i32 %num, 4111; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)112; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]113; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }114; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1115; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }116; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_ugt_5_order_swapped117; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)118; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2119; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)120; CHECK-NEXT:  Loop %for.body: Trip multiple is 4121;122entry:123  %u = urem i32 %num, 4124  %cmp.1 = icmp ugt i32 %num, 5125  tail call void @llvm.assume(i1 %cmp.1)126  %cmp = icmp eq i32 %u, 0127  tail call void @llvm.assume(i1 %cmp)128  br label %for.body129 130for.body:131  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]132  %inc = add nuw nsw i32 %i.010, 1133  %cmp2 = icmp ult i32 %inc, %num134  br i1 %cmp2, label %for.body, label %exit135 136exit:137  ret void138}139 140define void @test_trip_multiple_4_sgt_5(i32 %num) {141; CHECK-LABEL: 'test_trip_multiple_4_sgt_5'142; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_sgt_5143; CHECK-NEXT:    %u = urem i32 %num, 4144; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)145; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]146; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }147; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1148; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }149; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_sgt_5150; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)151; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483646152; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)153; CHECK-NEXT:  Loop %for.body: Trip multiple is 4154;155entry:156  %u = urem i32 %num, 4157  %cmp = icmp eq i32 %u, 0158  tail call void @llvm.assume(i1 %cmp)159  %cmp.1 = icmp sgt i32 %num, 5160  tail call void @llvm.assume(i1 %cmp.1)161  br label %for.body162 163for.body:164  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]165  %inc = add nuw nsw i32 %i.010, 1166  %cmp2 = icmp slt i32 %inc, %num167  br i1 %cmp2, label %for.body, label %exit168 169exit:170  ret void171}172 173define void @test_trip_multiple_4_sgt_5_order_swapped(i32 %num) {174; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.175; CHECK-LABEL: 'test_trip_multiple_4_sgt_5_order_swapped'176; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_sgt_5_order_swapped177; CHECK-NEXT:    %u = urem i32 %num, 4178; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)179; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]180; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }181; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1182; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }183; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_sgt_5_order_swapped184; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)185; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483646186; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)187; CHECK-NEXT:  Loop %for.body: Trip multiple is 4188;189entry:190  %u = urem i32 %num, 4191  %cmp.1 = icmp sgt i32 %num, 5192  tail call void @llvm.assume(i1 %cmp.1)193  %cmp = icmp eq i32 %u, 0194  tail call void @llvm.assume(i1 %cmp)195  br label %for.body196 197for.body:198  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]199  %inc = add nuw nsw i32 %i.010, 1200  %cmp2 = icmp slt i32 %inc, %num201  br i1 %cmp2, label %for.body, label %exit202 203exit:204  ret void205}206 207define void @test_trip_multiple_4_uge_5(i32 %num) {208; CHECK-LABEL: 'test_trip_multiple_4_uge_5'209; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_uge_5210; CHECK-NEXT:    %u = urem i32 %num, 4211; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)212; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]213; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }214; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1215; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }216; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_uge_5217; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)218; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2219; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)220; CHECK-NEXT:  Loop %for.body: Trip multiple is 4221;222entry:223  %u = urem i32 %num, 4224  %cmp = icmp eq i32 %u, 0225  tail call void @llvm.assume(i1 %cmp)226  %cmp.1 = icmp uge i32 %num, 5227  tail call void @llvm.assume(i1 %cmp.1)228  br label %for.body229 230for.body:231  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]232  %inc = add nuw nsw i32 %i.010, 1233  %cmp2 = icmp ult i32 %inc, %num234  br i1 %cmp2, label %for.body, label %exit235 236exit:237  ret void238}239 240define void @test_trip_multiple_4_uge_5_order_swapped(i32 %num) {241; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.242; CHECK-LABEL: 'test_trip_multiple_4_uge_5_order_swapped'243; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_uge_5_order_swapped244; CHECK-NEXT:    %u = urem i32 %num, 4245; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)246; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]247; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }248; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1249; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }250; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_uge_5_order_swapped251; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)252; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2253; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)254; CHECK-NEXT:  Loop %for.body: Trip multiple is 4255;256entry:257  %u = urem i32 %num, 4258  %cmp = icmp eq i32 %u, 0259  %cmp.1 = icmp uge i32 %num, 5260  tail call void @llvm.assume(i1 %cmp.1)261  tail call void @llvm.assume(i1 %cmp)262  br label %for.body263 264for.body:265  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]266  %inc = add nuw nsw i32 %i.010, 1267  %cmp2 = icmp ult i32 %inc, %num268  br i1 %cmp2, label %for.body, label %exit269 270exit:271  ret void272}273 274define void @test_trip_multiple_4_sge_5(i32 %num) {275; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.276; CHECK-LABEL: 'test_trip_multiple_4_sge_5'277; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_sge_5278; CHECK-NEXT:    %u = urem i32 %num, 4279; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)280; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]281; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }282; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1283; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }284; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_sge_5285; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)286; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483646287; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)288; CHECK-NEXT:  Loop %for.body: Trip multiple is 4289;290entry:291  %u = urem i32 %num, 4292  %cmp = icmp eq i32 %u, 0293  tail call void @llvm.assume(i1 %cmp)294  %cmp.1 = icmp sge i32 %num, 5295  tail call void @llvm.assume(i1 %cmp.1)296  br label %for.body297 298for.body:299  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]300  %inc = add nuw nsw i32 %i.010, 1301  %cmp2 = icmp slt i32 %inc, %num302  br i1 %cmp2, label %for.body, label %exit303 304exit:305  ret void306}307 308define void @test_trip_multiple_4_sge_5_order_swapped(i32 %num) {309; CHECK-LABEL: 'test_trip_multiple_4_sge_5_order_swapped'310; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_sge_5_order_swapped311; CHECK-NEXT:    %u = urem i32 %num, 4312; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)313; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]314; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }315; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1316; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }317; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_sge_5_order_swapped318; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)319; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 2147483646320; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)321; CHECK-NEXT:  Loop %for.body: Trip multiple is 4322;323entry:324  %u = urem i32 %num, 4325  %cmp = icmp eq i32 %u, 0326  %cmp.1 = icmp sge i32 %num, 5327  tail call void @llvm.assume(i1 %cmp.1)328  tail call void @llvm.assume(i1 %cmp)329  br label %for.body330 331for.body:332  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]333  %inc = add nuw nsw i32 %i.010, 1334  %cmp2 = icmp slt i32 %inc, %num335  br i1 %cmp2, label %for.body, label %exit336 337exit:338  ret void339}340 341; Same as @test_trip_multiple_4 but with the icmp operands swapped.342define void @test_trip_multiple_4_icmp_ops_swapped(i32 %num) {343; CHECK-LABEL: 'test_trip_multiple_4_icmp_ops_swapped'344; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_icmp_ops_swapped345; CHECK-NEXT:    %u = urem i32 %num, 4346; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)347; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]348; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }349; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1350; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }351; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_icmp_ops_swapped352; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)353; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2354; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)355; CHECK-NEXT:  Loop %for.body: Trip multiple is 4356;357entry:358  %u = urem i32 %num, 4359  %cmp = icmp eq i32 0, %u360  tail call void @llvm.assume(i1 %cmp)361  %cmp.1 = icmp uge i32 %num, 4362  tail call void @llvm.assume(i1 %cmp.1)363  br label %for.body364 365for.body:366  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]367  %inc = add nuw nsw i32 %i.010, 1368  %cmp2 = icmp ult i32 %inc, %num369  br i1 %cmp2, label %for.body, label %exit370 371exit:372  ret void373}374 375define void @test_trip_multiple_4_upper_lower_bounds(i32 %num) {376; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds'377; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds378; CHECK-NEXT:    %u = urem i32 %num, 4379; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)380; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]381; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }382; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1383; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }384; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds385; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)386; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2387; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)388; CHECK-NEXT:  Loop %for.body: Trip multiple is 4389;390entry:391  %cmp.1 = icmp uge i32 %num, 5392  tail call void @llvm.assume(i1 %cmp.1)393  %u = urem i32 %num, 4394  %cmp = icmp eq i32 %u, 0395  tail call void @llvm.assume(i1 %cmp)396  %cmp.2 = icmp ult i32 %num, 59000397  tail call void @llvm.assume(i1 %cmp.2)398  br label %for.body399 400for.body:401  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]402  %inc = add nuw nsw i32 %i.010, 1403  %cmp2 = icmp ult i32 %inc, %num404  br i1 %cmp2, label %for.body, label %exit405 406exit:407  ret void408}409 410define void @test_trip_multiple_4_upper_lower_bounds_swapped1(i32 %num) {411; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds_swapped1'412; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds_swapped1413; CHECK-NEXT:    %u = urem i32 %num, 4414; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)415; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]416; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }417; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1418; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }419; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds_swapped1420; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)421; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2422; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)423; CHECK-NEXT:  Loop %for.body: Trip multiple is 4424;425entry:426  %cmp.1 = icmp uge i32 %num, 5427  tail call void @llvm.assume(i1 %cmp.1)428  %u = urem i32 %num, 4429  %cmp = icmp eq i32 %u, 0430  tail call void @llvm.assume(i1 %cmp)431  %cmp.2 = icmp ult i32 %num, 59000432  tail call void @llvm.assume(i1 %cmp.2)433  br label %for.body434 435for.body:436  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]437  %inc = add nuw nsw i32 %i.010, 1438  %cmp2 = icmp ult i32 %inc, %num439  br i1 %cmp2, label %for.body, label %exit440 441exit:442  ret void443}444 445define void @test_trip_multiple_4_upper_lower_bounds_swapped2(i32 %num) {446; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds_swapped2'447; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds_swapped2448; CHECK-NEXT:    %u = urem i32 %num, 4449; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)450; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]451; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }452; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1453; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }454; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds_swapped2455; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)456; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2457; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)458; CHECK-NEXT:  Loop %for.body: Trip multiple is 4459;460entry:461  %cmp.1 = icmp uge i32 %num, 5462  tail call void @llvm.assume(i1 %cmp.1)463  %cmp.2 = icmp ult i32 %num, 59000464  tail call void @llvm.assume(i1 %cmp.2)465  %u = urem i32 %num, 4466  %cmp = icmp eq i32 %u, 0467  tail call void @llvm.assume(i1 %cmp)468  br label %for.body469 470for.body:471  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]472  %inc = add nuw nsw i32 %i.010, 1473  %cmp2 = icmp ult i32 %inc, %num474  br i1 %cmp2, label %for.body, label %exit475 476exit:477  ret void478}479 480define void @test_trip_multiple_5(i32 %num) {481; CHECK-LABEL: 'test_trip_multiple_5'482; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_5483; CHECK-NEXT:    %u = urem i32 %num, 5484; CHECK-NEXT:    --> ((-5 * (%num /u 5)) + %num) U: full-set S: full-set485; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]486; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }487; CHECK-NEXT:    %inc = add nuw nsw i32 %i.010, 1488; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }489; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_5490; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)491; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -2492; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)493; CHECK-NEXT:  Loop %for.body: Trip multiple is 5494;495entry:496  %u = urem i32 %num, 5497  %cmp = icmp eq i32 %u, 0498  tail call void @llvm.assume(i1 %cmp)499  %cmp.1 = icmp uge i32 %num, 5500  tail call void @llvm.assume(i1 %cmp.1)501  br label %for.body502 503for.body:504  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]505  %inc = add nuw nsw i32 %i.010, 1506  %cmp2 = icmp ult i32 %inc, %num507  br i1 %cmp2, label %for.body, label %exit508 509exit:510  ret void511}512 513define void @test_trunc_operand_larger_than_urem_expr(i64 %N) {514; CHECK-LABEL: 'test_trunc_operand_larger_than_urem_expr'515; CHECK-NEXT:  Classifying expressions for: @test_trunc_operand_larger_than_urem_expr516; CHECK-NEXT:    %conv = trunc i64 %N to i32517; CHECK-NEXT:    --> (trunc i64 %N to i32) U: full-set S: full-set518; CHECK-NEXT:    %and = and i32 %conv, 1519; CHECK-NEXT:    --> (zext i1 (trunc i64 %N to i1) to i32) U: [0,2) S: [0,2)520; CHECK-NEXT:    %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]521; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.body> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: (-1 + %N) LoopDispositions: { %for.body: Computable }522; CHECK-NEXT:    %iv.next = add nuw nsw i64 %iv, 1523; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.body> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: %N LoopDispositions: { %for.body: Computable }524; CHECK-NEXT:  Determining loop execution counts for: @test_trunc_operand_larger_than_urem_expr525; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %N)526; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i64 -1527; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %N)528; CHECK-NEXT:  Loop %for.body: Trip multiple is 1529;530entry:531  %conv = trunc i64 %N to i32532  %and = and i32 %conv, 1533  %cmp.pre = icmp eq i32 %and, 0534  br i1 %cmp.pre, label %for.body, label %exit535 536for.body:537  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]538  %iv.next = add nuw nsw i64 %iv, 1539  %cmp.1 = icmp ne i64 %iv.next, %N540  br i1 %cmp.1, label %for.body, label %exit541 542exit:543  ret void544}545 546; TODO: Even though %num is known to divide by 4, and the loop's IV advances by 4, SCEV can't compute the trip count.547define void @test_trip_multiple_4_vectorized_iv(i32 %num) {548; CHECK-LABEL: 'test_trip_multiple_4_vectorized_iv'549; CHECK-NEXT:  Classifying expressions for: @test_trip_multiple_4_vectorized_iv550; CHECK-NEXT:    %u = urem i32 %num, 4551; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)552; CHECK-NEXT:    %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]553; CHECK-NEXT:    --> {0,+,4}<%for.body> U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %for.body: Computable }554; CHECK-NEXT:    %inc = add i32 %i.010, 4555; CHECK-NEXT:    --> {4,+,4}<%for.body> U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %for.body: Computable }556; CHECK-NEXT:  Determining loop execution counts for: @test_trip_multiple_4_vectorized_iv557; CHECK-NEXT:  Loop %for.body: Unpredictable backedge-taken count.558; CHECK-NEXT:  Loop %for.body: Unpredictable constant max backedge-taken count.559; CHECK-NEXT:  Loop %for.body: Unpredictable symbolic max backedge-taken count.560;561entry:562  %u = urem i32 %num, 4563  %cmp = icmp eq i32 %u, 0564  tail call void @llvm.assume(i1 %cmp)565  br label %for.body566 567for.body:568  %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]569  %inc = add i32 %i.010, 4570  %cmp2 = icmp ult i32 %inc, %num571  br i1 %cmp2, label %for.body, label %exit572 573exit:574  ret void575}576 577define void @test_ptr_aligned_by_2_and_4_via_assumption(ptr %start, ptr %end) {578; CHECK-LABEL: 'test_ptr_aligned_by_2_and_4_via_assumption'579; CHECK-NEXT:  Classifying expressions for: @test_ptr_aligned_by_2_and_4_via_assumption580; CHECK-NEXT:    %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]581; CHECK-NEXT:    --> {%start,+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }582; CHECK-NEXT:    %iv.next = getelementptr i8, ptr %iv, i64 4583; CHECK-NEXT:    --> {(4 + %start),+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }584; CHECK-NEXT:  Determining loop execution counts for: @test_ptr_aligned_by_2_and_4_via_assumption585; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.586; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.587; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.588; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)589; CHECK-NEXT:   Predicates:590; CHECK-NEXT:      Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0591; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903592; CHECK-NEXT:   Predicates:593; CHECK-NEXT:      Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0594; CHECK-NEXT:  Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)595; CHECK-NEXT:   Predicates:596; CHECK-NEXT:      Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0597;598entry:599  call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 2) ]600  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 4) ]601  br label %loop602 603loop:604  %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]605  store ptr %iv, ptr %iv606  %iv.next = getelementptr i8, ptr %iv, i64 4607  %ec = icmp ne ptr %iv.next, %end608  br i1 %ec, label %loop, label %exit609 610exit:611  ret void612}613 614define void @test_ptrs_aligned_by_4_via_assumption(ptr %start, ptr %end) {615; CHECK-LABEL: 'test_ptrs_aligned_by_4_via_assumption'616; CHECK-NEXT:  Classifying expressions for: @test_ptrs_aligned_by_4_via_assumption617; CHECK-NEXT:    %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]618; CHECK-NEXT:    --> {%start,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: (-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }619; CHECK-NEXT:    %iv.next = getelementptr i8, ptr %iv, i64 4620; CHECK-NEXT:    --> {(4 + %start),+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: ((-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }621; CHECK-NEXT:  Determining loop execution counts for: @test_ptrs_aligned_by_4_via_assumption622; CHECK-NEXT:  Loop %loop: backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)623; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4611686018427387903624; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)625; CHECK-NEXT:  Loop %loop: Trip multiple is 1626;627entry:628  call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 4) ]629  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 4) ]630  br label %loop631 632loop:633  %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]634  store ptr %iv, ptr %iv635  %iv.next = getelementptr i8, ptr %iv, i64 4636  %ec = icmp ne ptr %iv.next, %end637  br i1 %ec, label %loop, label %exit638 639exit:640  ret void641}642 643define void @test_ptrs_aligned_by_8_via_assumption(ptr %start, ptr %end) {644; CHECK-LABEL: 'test_ptrs_aligned_by_8_via_assumption'645; CHECK-NEXT:  Classifying expressions for: @test_ptrs_aligned_by_8_via_assumption646; CHECK-NEXT:    %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]647; CHECK-NEXT:    --> {%start,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: (-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }648; CHECK-NEXT:    %iv.next = getelementptr i8, ptr %iv, i64 4649; CHECK-NEXT:    --> {(4 + %start)<nuw><nsw>,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: ((-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }650; CHECK-NEXT:  Determining loop execution counts for: @test_ptrs_aligned_by_8_via_assumption651; CHECK-NEXT:  Loop %loop: backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)652; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 4611686018427387903653; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)654; CHECK-NEXT:  Loop %loop: Trip multiple is 1655;656entry:657  call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 8) ]658  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 8) ]659  br label %loop660 661loop:662  %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]663  store ptr %iv, ptr %iv664  %iv.next = getelementptr i8, ptr %iv, i64 4665  %ec = icmp ne ptr %iv.next, %end666  br i1 %ec, label %loop, label %exit667 668exit:669  ret void670}671 672declare i1 @cond()673 674define void @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors(ptr %start, ptr %end) {675; CHECK-LABEL: 'test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors'676; CHECK-NEXT:  Classifying expressions for: @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors677; CHECK-NEXT:    %c = call i1 @cond()678; CHECK-NEXT:    --> %c U: full-set S: full-set679; CHECK-NEXT:    %iv = phi ptr [ %start, %then ], [ %start, %else ], [ %iv.next, %loop ]680; CHECK-NEXT:    --> {%start,+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }681; CHECK-NEXT:    %iv.next = getelementptr i8, ptr %iv, i64 4682; CHECK-NEXT:    --> {(4 + %start),+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }683; CHECK-NEXT:  Determining loop execution counts for: @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors684; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.685; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.686; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.687; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)688; CHECK-NEXT:   Predicates:689; CHECK-NEXT:      Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0690; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903691; CHECK-NEXT:   Predicates:692; CHECK-NEXT:      Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0693; CHECK-NEXT:  Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)694; CHECK-NEXT:   Predicates:695; CHECK-NEXT:      Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0696;697entry:698  call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 2) ]699  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 4) ]700  %c = call i1 @cond()701  br i1 %c, label %then, label %else702 703then:704  br label %loop705 706else:707  br label %loop708 709loop:710  %iv = phi ptr [ %start, %then] , [ %start, %else ], [ %iv.next, %loop ]711  store ptr %iv, ptr %iv712  %iv.next = getelementptr i8, ptr %iv, i64 4713  %ec = icmp ne ptr %iv.next, %end714  br i1 %ec, label %loop, label %exit715 716exit:717  ret void718}719 720define void @test_urem_non_constant(ptr %dst, i32 %a, i32 %b) {721; CHECK-LABEL: 'test_urem_non_constant'722; CHECK-NEXT:  Classifying expressions for: @test_urem_non_constant723; CHECK-NEXT:    %rem = urem i32 %a, %b724; CHECK-NEXT:    --> ((-1 * (%a /u %b) * %b) + %a) U: full-set S: full-set725; CHECK-NEXT:    %and.0 = and i1 %pre.0, %pre.1726; CHECK-NEXT:    --> (%pre.1 umin %pre.0) U: full-set S: full-set727; CHECK-NEXT:    %and.1 = and i1 %and.0, %pre.2728; CHECK-NEXT:    --> (%pre.1 umin %pre.2 umin %pre.0) U: full-set S: full-set729; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]730; CHECK-NEXT:    --> {0,+,%b}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }731; CHECK-NEXT:    %gep.dst = getelementptr inbounds i8, ptr %dst, i32 %b732; CHECK-NEXT:    --> ((sext i32 %b to i64) + %dst) U: full-set S: full-set Exits: ((sext i32 %b to i64) + %dst) LoopDispositions: { %loop: Invariant }733; CHECK-NEXT:    %iv.next = add i32 %iv, %b734; CHECK-NEXT:    --> {%b,+,%b}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }735; CHECK-NEXT:  Determining loop execution counts for: @test_urem_non_constant736; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.737; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.738; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.739;740entry:741  %rem = urem i32 %a, %b742  %pre.0 = icmp eq i32 %rem, 0743  %pre.1 = icmp ne i32 %a, 0744  %pre.2 = icmp ne i32 %b, 0745  %and.0 = and i1 %pre.0, %pre.1746  %and.1 = and i1 %and.0, %pre.2747  br i1 %and.1, label %loop, label %exit748 749loop:750  %iv = phi i32 [ 0, %entry], [ %iv.next, %loop ]751  %gep.dst = getelementptr inbounds i8, ptr %dst, i32 %b752  store i8 0, ptr %gep.dst753  %iv.next = add i32 %iv, %b754  %ec = icmp ne i32 %iv.next, %a755  br i1 %ec, label %loop, label %exit756 757exit:758  ret void759}760 761declare void @llvm.assume(i1)762declare void @llvm.experimental.guard(i1, ...)763