Home | History | Annotate | Download | only in ScalarEvolution
      1 ; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s
      2 
      3 declare void @llvm.experimental.guard(i1, ...)
      4 
      5 define void @test_1(i32 %n) nounwind {
      6 ; Prove that (n > 1) ===> (n / 2 > 0).
      7 ; CHECK:         Determining loop execution counts for: @test_1
      8 ; CHECK:         Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw>
      9 entry:
     10   %cmp1 = icmp sgt i32 %n, 1
     11   %n.div.2 = sdiv i32 %n, 2
     12   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
     13   br label %header
     14 
     15 header:
     16   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
     17   %indvar.next = add i32 %indvar, 1
     18   %exitcond = icmp sgt i32 %n.div.2, %indvar.next
     19   br i1 %exitcond, label %header, label %exit
     20 
     21 exit:
     22   ret void
     23 }
     24 
     25 define void @test_1neg(i32 %n) nounwind {
     26 ; Prove that (n > 0) =\=> (n / 2 > 0).
     27 ; CHECK:         Determining loop execution counts for: @test_1neg
     28 ; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
     29 entry:
     30   %cmp1 = icmp sgt i32 %n, 0
     31   %n.div.2 = sdiv i32 %n, 2
     32   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
     33   br label %header
     34 
     35 header:
     36   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
     37   %indvar.next = add i32 %indvar, 1
     38   %exitcond = icmp sgt i32 %n.div.2, %indvar.next
     39   br i1 %exitcond, label %header, label %exit
     40 
     41 exit:
     42   ret void
     43 }
     44 
     45 define void @test_2(i32 %n) nounwind {
     46 ; Prove that (n >= 2) ===> (n / 2 > 0).
     47 ; CHECK:         Determining loop execution counts for: @test_2
     48 ; CHECK:         Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw>
     49 entry:
     50   %cmp1 = icmp sge i32 %n, 2
     51   %n.div.2 = sdiv i32 %n, 2
     52   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
     53   br label %header
     54 
     55 header:
     56   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
     57   %indvar.next = add i32 %indvar, 1
     58   %exitcond = icmp sgt i32 %n.div.2, %indvar.next
     59   br i1 %exitcond, label %header, label %exit
     60 
     61 exit:
     62   ret void
     63 }
     64 
     65 define void @test_2neg(i32 %n) nounwind {
     66 ; Prove that (n >= 1) =\=> (n / 2 > 0).
     67 ; CHECK:         Determining loop execution counts for: @test_2neg
     68 ; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw>
     69 entry:
     70   %cmp1 = icmp sge i32 %n, 1
     71   %n.div.2 = sdiv i32 %n, 2
     72   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
     73   br label %header
     74 
     75 header:
     76   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
     77   %indvar.next = add i32 %indvar, 1
     78   %exitcond = icmp sgt i32 %n.div.2, %indvar.next
     79   br i1 %exitcond, label %header, label %exit
     80 
     81 exit:
     82   ret void
     83 }
     84 
     85 define void @test_3(i32 %n) nounwind {
     86 ; Prove that (n > -2) ===> (n / 2 >= 0).
     87 ; CHECK:         Determining loop execution counts for: @test_3
     88 ; CHECK:         Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
     89 entry:
     90   %cmp1 = icmp sgt i32 %n, -2
     91   %n.div.2 = sdiv i32 %n, 2
     92   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
     93   br label %header
     94 
     95 header:
     96   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
     97   %indvar.next = add i32 %indvar, 1
     98   %exitcond = icmp sge i32 %n.div.2, %indvar
     99   br i1 %exitcond, label %header, label %exit
    100 
    101 exit:
    102   ret void
    103 }
    104 
    105 define void @test_3neg(i32 %n) nounwind {
    106 ; Prove that (n > -3) =\=> (n / 2 >= 0).
    107 ; CHECK:         Determining loop execution counts for: @test_3neg
    108 ; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
    109 entry:
    110   %cmp1 = icmp sgt i32 %n, -3
    111   %n.div.2 = sdiv i32 %n, 2
    112   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    113   br label %header
    114 
    115 header:
    116   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
    117   %indvar.next = add i32 %indvar, 1
    118   %exitcond = icmp sge i32 %n.div.2, %indvar
    119   br i1 %exitcond, label %header, label %exit
    120 
    121 exit:
    122   ret void
    123 }
    124 
    125 define void @test_4(i32 %n) nounwind {
    126 ; Prove that (n >= -1) ===> (n / 2 >= 0).
    127 ; CHECK:         Determining loop execution counts for: @test_4
    128 ; CHECK:         Loop %header: backedge-taken count is (1 + %n.div.2)<nsw>
    129 entry:
    130   %cmp1 = icmp sge i32 %n, -1
    131   %n.div.2 = sdiv i32 %n, 2
    132   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    133   br label %header
    134 
    135 header:
    136   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
    137   %indvar.next = add i32 %indvar, 1
    138   %exitcond = icmp sge i32 %n.div.2, %indvar
    139   br i1 %exitcond, label %header, label %exit
    140 
    141 exit:
    142   ret void
    143 }
    144 
    145 define void @test_4neg(i32 %n) nounwind {
    146 ; Prove that (n >= -2) =\=> (n / 2 >= 0).
    147 ; CHECK:         Determining loop execution counts for: @test_4neg
    148 ; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>)
    149 entry:
    150   %cmp1 = icmp sge i32 %n, -2
    151   %n.div.2 = sdiv i32 %n, 2
    152   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    153   br label %header
    154 
    155 header:
    156   %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ]
    157   %indvar.next = add i32 %indvar, 1
    158   %exitcond = icmp sge i32 %n.div.2, %indvar
    159   br i1 %exitcond, label %header, label %exit
    160 
    161 exit:
    162   ret void
    163 }
    164 
    165 define void @test_ext_01(i32 %n) nounwind {
    166 ; Prove that (n > 1) ===> (n / 2 > 0).
    167 ; CHECK:         Determining loop execution counts for: @test_ext_01
    168 ; CHECK:         Loop %header: backedge-taken count is (-1 + (sext i32 %n.div.2 to i64))<nsw>
    169 entry:
    170   %cmp1 = icmp sgt i32 %n, 1
    171   %n.div.2 = sdiv i32 %n, 2
    172   %n.div.2.ext = sext i32 %n.div.2 to i64
    173   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    174   br label %header
    175 
    176 header:
    177   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    178   %indvar.next = add i64 %indvar, 1
    179   %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
    180   br i1 %exitcond, label %header, label %exit
    181 
    182 exit:
    183   ret void
    184 }
    185 
    186 define void @test_ext_01neg(i32 %n) nounwind {
    187 ; Prove that (n > 0) =\=> (n / 2 > 0).
    188 ; CHECK:         Determining loop execution counts for: @test_ext_01neg
    189 ; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax (sext i32 %n.div.2 to i64)))<nsw>
    190 entry:
    191   %cmp1 = icmp sgt i32 %n, 0
    192   %n.div.2 = sdiv i32 %n, 2
    193   %n.div.2.ext = sext i32 %n.div.2 to i64
    194   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    195   br label %header
    196 
    197 header:
    198   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    199   %indvar.next = add i64 %indvar, 1
    200   %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
    201   br i1 %exitcond, label %header, label %exit
    202 
    203 exit:
    204   ret void
    205 }
    206 
    207 define void @test_ext_02(i32 %n) nounwind {
    208 ; Prove that (n >= 2) ===> (n / 2 > 0).
    209 ; CHECK:         Determining loop execution counts for: @test_ext_02
    210 ; CHECK:         Loop %header: backedge-taken count is (-1 + (sext i32 %n.div.2 to i64))<nsw>
    211 entry:
    212   %cmp1 = icmp sge i32 %n, 2
    213   %n.div.2 = sdiv i32 %n, 2
    214   %n.div.2.ext = sext i32 %n.div.2 to i64
    215   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    216   br label %header
    217 
    218 header:
    219   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    220   %indvar.next = add i64 %indvar, 1
    221   %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
    222   br i1 %exitcond, label %header, label %exit
    223 
    224 exit:
    225   ret void
    226 }
    227 
    228 define void @test_ext_02neg(i32 %n) nounwind {
    229 ; Prove that (n >= 1) =\=> (n / 2 > 0).
    230 ; CHECK:         Determining loop execution counts for: @test_ext_02neg
    231 ; CHECK:         Loop %header: backedge-taken count is (-1 + (1 smax (sext i32 %n.div.2 to i64)))<nsw>
    232 entry:
    233   %cmp1 = icmp sge i32 %n, 1
    234   %n.div.2 = sdiv i32 %n, 2
    235   %n.div.2.ext = sext i32 %n.div.2 to i64
    236   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    237   br label %header
    238 
    239 header:
    240   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    241   %indvar.next = add i64 %indvar, 1
    242   %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next
    243   br i1 %exitcond, label %header, label %exit
    244 
    245 exit:
    246   ret void
    247 }
    248 
    249 define void @test_ext_03(i32 %n) nounwind {
    250 ; Prove that (n > -2) ===> (n / 2 >= 0).
    251 ; CHECK:         Determining loop execution counts for: @test_ext_03
    252 ; CHECK:         Loop %header: backedge-taken count is (1 + (sext i32 %n.div.2 to i64))<nsw>
    253 entry:
    254   %cmp1 = icmp sgt i32 %n, -2
    255   %n.div.2 = sdiv i32 %n, 2
    256   %n.div.2.ext = sext i32 %n.div.2 to i64
    257   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    258   br label %header
    259 
    260 header:
    261   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    262   %indvar.next = add i64 %indvar, 1
    263   %exitcond = icmp sge i64 %n.div.2.ext, %indvar
    264   br i1 %exitcond, label %header, label %exit
    265 
    266 exit:
    267   ret void
    268 }
    269 
    270 define void @test_ext_03neg(i32 %n) nounwind {
    271 ; Prove that (n > -3) =\=> (n / 2 >= 0).
    272 ; CHECK:         Determining loop execution counts for: @test_ext_03neg
    273 ; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + (sext i32 %n.div.2 to i64))<nsw>)
    274 entry:
    275   %cmp1 = icmp sgt i32 %n, -3
    276   %n.div.2 = sdiv i32 %n, 2
    277   %n.div.2.ext = sext i32 %n.div.2 to i64
    278   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    279   br label %header
    280 
    281 header:
    282   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    283   %indvar.next = add i64 %indvar, 1
    284   %exitcond = icmp sge i64 %n.div.2.ext, %indvar
    285   br i1 %exitcond, label %header, label %exit
    286 
    287 exit:
    288   ret void
    289 }
    290 
    291 define void @test_ext_04(i32 %n) nounwind {
    292 ; Prove that (n >= -1) ===> (n / 2 >= 0).
    293 ; CHECK:         Determining loop execution counts for: @test_ext_04
    294 ; CHECK:         Loop %header: backedge-taken count is (1 + (sext i32 %n.div.2 to i64))<nsw>
    295 entry:
    296   %cmp1 = icmp sge i32 %n, -1
    297   %n.div.2 = sdiv i32 %n, 2
    298   %n.div.2.ext = sext i32 %n.div.2 to i64
    299   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    300   br label %header
    301 
    302 header:
    303   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    304   %indvar.next = add i64 %indvar, 1
    305   %exitcond = icmp sge i64 %n.div.2.ext, %indvar
    306   br i1 %exitcond, label %header, label %exit
    307 
    308 exit:
    309   ret void
    310 }
    311 
    312 define void @test_ext_04neg(i32 %n) nounwind {
    313 ; Prove that (n >= -2) =\=> (n / 2 >= 0).
    314 ; CHECK:         Determining loop execution counts for: @test_ext_04neg
    315 ; CHECK:         Loop %header: backedge-taken count is (0 smax (1 + (sext i32 %n.div.2 to i64))<nsw>)
    316 entry:
    317   %cmp1 = icmp sge i32 %n, -2
    318   %n.div.2 = sdiv i32 %n, 2
    319   %n.div.2.ext = sext i32 %n.div.2 to i64
    320   call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ]
    321   br label %header
    322 
    323 header:
    324   %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ]
    325   %indvar.next = add i64 %indvar, 1
    326   %exitcond = icmp sge i64 %n.div.2.ext, %indvar
    327   br i1 %exitcond, label %header, label %exit
    328 
    329 exit:
    330   ret void
    331 }
    332