Home | History | Annotate | Download | only in ScalarEvolution
      1 ; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
      2 
      3 define void @test0(i32 %init) {
      4 ; CHECK-LABEL: Classifying expressions for: @test0
      5 ; CHECK: Loop %loop: max backedge-taken count is 32
      6  entry:
      7   br label %loop
      8 
      9  loop:
     10   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
     11   %iv.shift = lshr i32 %iv, 1
     12   %exit.cond = icmp eq i32 %iv, 0
     13   br i1 %exit.cond, label %leave, label %loop
     14 
     15  leave:
     16   ret void
     17 }
     18 
     19 define void @test1(i32 %init) {
     20 ; CHECK-LABEL: Classifying expressions for: @test1
     21 ; CHECK: Loop %loop: max backedge-taken count is 32
     22  entry:
     23   br label %loop
     24 
     25  loop:
     26   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
     27   %iv.shift = shl i32 %iv, 1
     28   %exit.cond = icmp eq i32 %iv, 0
     29   br i1 %exit.cond, label %leave, label %loop
     30 
     31  leave:
     32   ret void
     33 }
     34 
     35 define void @test2(i32 %init) {
     36 ; CHECK-LABEL: Determining loop execution counts for: @test2
     37 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
     38 
     39 ; Unpredictable because %iv could "stabilize" to either -1 or 0,
     40 ; depending on %init.
     41  entry:
     42   br label %loop
     43 
     44  loop:
     45   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
     46   %iv.shift = ashr i32 %iv, 1
     47   %exit.cond = icmp eq i32 %iv, 0
     48   br i1 %exit.cond, label %leave, label %loop
     49 
     50  leave:
     51   ret void
     52 }
     53 
     54 define void @test3(i32* %init.ptr) {
     55 ; CHECK-LABEL: Determining loop execution counts for: @test3
     56 ; CHECK: Loop %loop: max backedge-taken count is 32
     57  entry:
     58   %init = load i32, i32* %init.ptr, !range !0
     59   br label %loop
     60 
     61  loop:
     62   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
     63   %iv.shift = ashr i32 %iv, 1
     64   %exit.cond = icmp eq i32 %iv, 0
     65   br i1 %exit.cond, label %leave, label %loop
     66 
     67  leave:
     68   ret void
     69 }
     70 
     71 define void @test4(i32* %init.ptr) {
     72 ; CHECK-LABEL: Classifying expressions for: @test4
     73 ; CHECK-LABEL: Loop %loop: max backedge-taken count is 32
     74  entry:
     75   %init = load i32, i32* %init.ptr, !range !1
     76   br label %loop
     77 
     78  loop:
     79   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
     80   %iv.shift = ashr i32 %iv, 1
     81   %exit.cond = icmp eq i32 %iv, -1
     82   br i1 %exit.cond, label %leave, label %loop
     83 
     84  leave:
     85   ret void
     86 }
     87 
     88 define void @test5(i32* %init.ptr) {
     89 ; CHECK-LABEL: Determining loop execution counts for: @test5
     90 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
     91 
     92 ; %iv will "stabilize" to -1, so this is an infinite loop
     93  entry:
     94   %init = load i32, i32* %init.ptr, !range !1
     95   br label %loop
     96 
     97  loop:
     98   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
     99   %iv.shift = ashr i32 %iv, 1
    100   %exit.cond = icmp eq i32 %iv, 0
    101   br i1 %exit.cond, label %leave, label %loop
    102 
    103  leave:
    104   ret void
    105 }
    106 
    107 define void @test6(i32 %init, i32 %shift.amt) {
    108 ; CHECK-LABEL: Determining loop execution counts for: @test6
    109 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
    110 
    111 ; Potentially infinite loop, since %shift.amt could be 0
    112  entry:
    113   br label %loop
    114 
    115  loop:
    116   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
    117   %iv.shift = lshr i32 %iv, %shift.amt
    118   %exit.cond = icmp eq i32 %iv, 0
    119   br i1 %exit.cond, label %leave, label %loop
    120 
    121  leave:
    122   ret void
    123 }
    124 
    125 define void @test7(i32 %init) {
    126 ; CHECK-LABEL: Classifying expressions for: @test7
    127 ; CHECK: Loop %loop: max backedge-taken count is 32
    128 
    129  entry:
    130   br label %loop
    131 
    132  loop:
    133   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
    134   %iv.shift = lshr i32 %iv, 1
    135   %exit.cond = icmp eq i32 %iv.shift, 0
    136   br i1 %exit.cond, label %leave, label %loop
    137 
    138  leave:
    139   ret void
    140 }
    141 
    142 define void @test8(i32 %init) {
    143 ; CHECK-LABEL: Classifying expressions for: @test8
    144 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
    145 
    146 ; In this test case, %iv.test stabilizes to 127, not -1, so the loop
    147 ; is infinite.
    148 
    149  entry:
    150   br label %loop
    151 
    152  loop:
    153   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
    154   %iv.shift = ashr i32 %iv, 1
    155   %iv.test = lshr i32 %iv, 1
    156   %exit.cond = icmp eq i32 %iv.test, -1
    157   br i1 %exit.cond, label %leave, label %loop
    158 
    159  leave:
    160   ret void
    161 }
    162 
    163 !0 = !{i32 0, i32 50000}
    164 !1 = !{i32 -5000, i32 -1}
    165