213 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -S -passes='print<scalar-evolution>' -disable-output < %s 2>&1 | FileCheck %s3 4; Test non-unit strides in multiple-exit loops, and the interaction with5; nowrap flags.6 7define void @test_preinc_ult(i64 %len) {8; CHECK-LABEL: 'test_preinc_ult'9; CHECK-NEXT: Classifying expressions for: @test_preinc_ult10; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]11; CHECK-NEXT: --> {0,+,2}<nuw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }12; CHECK-NEXT: %iv.inc2 = add nuw i64 %iv, 213; CHECK-NEXT: --> {2,+,2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }14; CHECK-NEXT: Determining loop execution counts for: @test_preinc_ult15; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.16; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***17; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***18; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.19; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.20; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***21; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***22;23start:24 br label %loop25 26loop:27 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]28 %cmp1 = icmp ult i64 %iv, %len29 br i1 %cmp1, label %latch, label %exit30 31latch:32 %iv.inc2 = add nuw i64 %iv, 233 %cmp2 = icmp ult i64 %iv.inc2, %len34 br i1 %cmp2, label %loop, label %exit35 36exit:37 ret void38}39 40define void @test_postinc_ult(i64 %len) {41; CHECK-LABEL: 'test_postinc_ult'42; CHECK-NEXT: Classifying expressions for: @test_postinc_ult43; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]44; CHECK-NEXT: --> {0,+,2}<nuw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }45; CHECK-NEXT: %iv.inc = add nuw i64 %iv, 146; CHECK-NEXT: --> {1,+,2}<nuw><%loop> U: [1,0) S: [1,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }47; CHECK-NEXT: %iv.inc2 = add nuw i64 %iv, 248; CHECK-NEXT: --> {2,+,2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }49; CHECK-NEXT: Determining loop execution counts for: @test_postinc_ult50; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.51; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***52; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***53; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.54; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.55; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***56; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***57;58start:59 br label %loop60 61loop:62 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]63 %iv.inc = add nuw i64 %iv, 164 %cmp1 = icmp ult i64 %iv.inc, %len65 br i1 %cmp1, label %latch, label %exit66 67latch:68 %iv.inc2 = add nuw i64 %iv, 269 %cmp2 = icmp ult i64 %iv.inc2, %len70 br i1 %cmp2, label %loop, label %exit71 72exit:73 ret void74}75 76define void @test_preinc_slt(i64 %len) {77; CHECK-LABEL: 'test_preinc_slt'78; CHECK-NEXT: Classifying expressions for: @test_preinc_slt79; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]80; CHECK-NEXT: --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }81; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, 282; CHECK-NEXT: --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }83; CHECK-NEXT: Determining loop execution counts for: @test_preinc_slt84; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.85; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***86; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***87; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.88; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.89; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***90; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***91;92start:93 br label %loop94 95loop:96 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]97 %cmp1 = icmp slt i64 %iv, %len98 br i1 %cmp1, label %latch, label %exit99 100latch:101 %iv.inc2 = add nsw i64 %iv, 2102 %cmp2 = icmp slt i64 %iv.inc2, %len103 br i1 %cmp2, label %loop, label %exit104 105exit:106 ret void107}108 109define void @test_postinc_slt(i64 %len) {110; CHECK-LABEL: 'test_postinc_slt'111; CHECK-NEXT: Classifying expressions for: @test_postinc_slt112; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]113; CHECK-NEXT: --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }114; CHECK-NEXT: %iv.inc = add nsw i64 %iv, 1115; CHECK-NEXT: --> {1,+,2}<nuw><nsw><%loop> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }116; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, 2117; CHECK-NEXT: --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }118; CHECK-NEXT: Determining loop execution counts for: @test_postinc_slt119; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.120; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***121; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***122; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.123; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.124; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***125; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***126;127start:128 br label %loop129 130loop:131 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]132 %iv.inc = add nsw i64 %iv, 1133 %cmp1 = icmp slt i64 %iv.inc, %len134 br i1 %cmp1, label %latch, label %exit135 136latch:137 %iv.inc2 = add nsw i64 %iv, 2138 %cmp2 = icmp slt i64 %iv.inc2, %len139 br i1 %cmp2, label %loop, label %exit140 141exit:142 ret void143}144 145define void @test_preinc_sgt(i64 %lim) {146; CHECK-LABEL: 'test_preinc_sgt'147; CHECK-NEXT: Classifying expressions for: @test_preinc_sgt148; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]149; CHECK-NEXT: --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }150; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, -2151; CHECK-NEXT: --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }152; CHECK-NEXT: Determining loop execution counts for: @test_preinc_sgt153; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.154; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***155; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***156; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.157; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.158; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***159; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***160;161start:162 br label %loop163 164loop:165 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]166 %cmp1 = icmp sgt i64 %iv, %lim167 br i1 %cmp1, label %latch, label %exit168 169latch:170 %iv.inc2 = add nsw i64 %iv, -2171 %cmp2 = icmp sgt i64 %iv.inc2, %lim172 br i1 %cmp2, label %loop, label %exit173 174exit:175 ret void176}177 178define void @test_postinc_sgt(i64 %lim) {179; CHECK-LABEL: 'test_postinc_sgt'180; CHECK-NEXT: Classifying expressions for: @test_postinc_sgt181; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]182; CHECK-NEXT: --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }183; CHECK-NEXT: %iv.inc = add nsw i64 %iv, -1184; CHECK-NEXT: --> {-1,+,-2}<nsw><%loop> U: [-9223372036854775808,0) S: [-9223372036854775808,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }185; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, -2186; CHECK-NEXT: --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }187; CHECK-NEXT: Determining loop execution counts for: @test_postinc_sgt188; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.189; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***190; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE***191; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.192; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.193; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***194; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE***195;196start:197 br label %loop198 199loop:200 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ]201 %iv.inc = add nsw i64 %iv, -1202 %cmp1 = icmp sgt i64 %iv.inc, %lim203 br i1 %cmp1, label %latch, label %exit204 205latch:206 %iv.inc2 = add nsw i64 %iv, -2207 %cmp2 = icmp sgt i64 %iv.inc2, %lim208 br i1 %cmp2, label %loop, label %exit209 210exit:211 ret void212}213