Home | History | Annotate | Download | only in IndVarSimplify
      1 ; RUN: opt < %s -indvars -S | FileCheck %s
      2 
      3 ;; --- signed ---
      4 
      5 define void @min.signed.1(i32* %a, i32 %a_len, i32 %n) {
      6 ; CHECK-LABEL: @min.signed.1
      7  entry:
      8   %smin.cmp = icmp slt i32 %a_len, %n
      9   %smin = select i1 %smin.cmp, i32 %a_len, i32 %n
     10   %entry.cond = icmp slt i32 0, %smin
     11   br i1 %entry.cond, label %loop, label %exit
     12 
     13  loop:
     14   %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
     15   %idx.inc = add i32 %idx, 1
     16   %in.bounds = icmp slt i32 %idx, %a_len
     17   br i1 %in.bounds, label %ok, label %latch
     18 ; CHECK: br i1 true, label %ok, label %latch
     19 
     20  ok:
     21   %addr = getelementptr i32, i32* %a, i32 %idx
     22   store i32 %idx, i32* %addr
     23   br label %latch
     24 
     25  latch:
     26   %be.cond = icmp slt i32 %idx.inc, %smin
     27   br i1 %be.cond, label %loop, label %exit
     28 
     29  exit:
     30   ret void
     31 }
     32 
     33 define void @min.signed.2(i32* %a, i32 %a_len, i32 %n) {
     34 ; CHECK-LABEL: @min.signed.2
     35  entry:
     36   %smin.cmp = icmp slt i32 %a_len, %n
     37   %smin = select i1 %smin.cmp, i32 %a_len, i32 %n
     38   %entry.cond = icmp slt i32 0, %smin
     39   br i1 %entry.cond, label %loop, label %exit
     40 
     41  loop:
     42   %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
     43   %idx.inc = add i32 %idx, 1
     44   %in.bounds = icmp sgt i32 %a_len, %idx
     45   br i1 %in.bounds, label %ok, label %latch
     46 ; CHECK: br i1 true, label %ok, label %latch
     47 
     48  ok:
     49   %addr = getelementptr i32, i32* %a, i32 %idx
     50   store i32 %idx, i32* %addr
     51   br label %latch
     52 
     53  latch:
     54   %be.cond = icmp slt i32 %idx.inc, %smin
     55   br i1 %be.cond, label %loop, label %exit
     56 
     57  exit:
     58   ret void
     59 }
     60 
     61 define void @min.signed.3(i32* %a, i32 %n) {
     62 ; CHECK-LABEL: @min.signed.3
     63  entry:
     64   %smin.cmp = icmp slt i32 42, %n
     65   %smin = select i1 %smin.cmp, i32 42, i32 %n
     66   %entry.cond = icmp slt i32 0, %smin
     67   br i1 %entry.cond, label %loop, label %exit
     68 
     69  loop:
     70   %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
     71   %idx.inc = add i32 %idx, 1
     72   %in.bounds = icmp slt i32 %idx, 42
     73   br i1 %in.bounds, label %ok, label %latch
     74 ; CHECK: br i1 true, label %ok, label %latch
     75 
     76  ok:
     77   %addr = getelementptr i32, i32* %a, i32 %idx
     78   store i32 %idx, i32* %addr
     79   br label %latch
     80 
     81  latch:
     82   %be.cond = icmp slt i32 %idx.inc, %smin
     83   br i1 %be.cond, label %loop, label %exit
     84 
     85  exit:
     86   ret void
     87 }
     88 
     89 define void @min.signed.4(i32* %a, i32 %n) {
     90 ; CHECK-LABEL: @min.signed.4
     91  entry:
     92   %smin.cmp = icmp slt i32 42, %n
     93   %smin = select i1 %smin.cmp, i32 42, i32 %n
     94   %entry.cond = icmp slt i32 0, %smin
     95   br i1 %entry.cond, label %loop, label %exit
     96 
     97  loop:
     98   %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
     99   %idx.inc = add i32 %idx, 1
    100   %in.bounds = icmp sgt i32 42, %idx
    101   br i1 %in.bounds, label %ok, label %latch
    102 ; CHECK: br i1 true, label %ok, label %latch
    103 
    104  ok:
    105   %addr = getelementptr i32, i32* %a, i32 %idx
    106   store i32 %idx, i32* %addr
    107   br label %latch
    108 
    109  latch:
    110   %be.cond = icmp slt i32 %idx.inc, %smin
    111   br i1 %be.cond, label %loop, label %exit
    112 
    113  exit:
    114   ret void
    115 }
    116 
    117 define void @max.signed.1(i32* %a, i32 %a_len, i32 %n) {
    118 ; CHECK-LABEL: @max.signed.1
    119  entry:
    120   %smax.cmp = icmp sgt i32 %a_len, %n
    121   %smax = select i1 %smax.cmp, i32 %a_len, i32 %n
    122   %entry.cond = icmp sgt i32 0, %smax
    123   br i1 %entry.cond, label %loop, label %exit
    124 
    125  loop:
    126   %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
    127   %idx.inc = add i32 %idx, 1
    128   %in.bounds = icmp sgt i32 %idx, %a_len
    129   br i1 %in.bounds, label %ok, label %latch
    130 ; CHECK: br i1 true, label %ok, label %latch
    131 
    132  ok:
    133   %addr = getelementptr i32, i32* %a, i32 %idx
    134   store i32 %idx, i32* %addr
    135   br label %latch
    136 
    137  latch:
    138   %be.cond = icmp sgt i32 %idx.inc, %smax
    139   br i1 %be.cond, label %loop, label %exit
    140 
    141  exit:
    142   ret void
    143 }
    144 
    145 define void @max.signed.2(i32* %a, i32 %a_len, i32 %n) {
    146 ; CHECK-LABEL: @max.signed.2
    147  entry:
    148   %smax.cmp = icmp sgt i32 %a_len, %n
    149   %smax = select i1 %smax.cmp, i32 %a_len, i32 %n
    150   %entry.cond = icmp sgt i32 0, %smax
    151   br i1 %entry.cond, label %loop, label %exit
    152 
    153  loop:
    154   %idx = phi i32 [ 0, %entry ], [ %idx.inc, %latch ]
    155   %idx.inc = add i32 %idx, 1
    156   %in.bounds = icmp slt i32 %a_len, %idx
    157   br i1 %in.bounds, label %ok, label %latch
    158 ; CHECK: br i1 true, label %ok, label %latch
    159 
    160  ok:
    161   %addr = getelementptr i32, i32* %a, i32 %idx
    162   store i32 %idx, i32* %addr
    163   br label %latch
    164 
    165  latch:
    166   %be.cond = icmp sgt i32 %idx.inc, %smax
    167   br i1 %be.cond, label %loop, label %exit
    168 
    169  exit:
    170   ret void
    171 }
    172 
    173 define void @max.signed.3(i32* %a, i32 %n, i32 %init) {
    174 ; CHECK-LABEL: @max.signed.3
    175  entry:
    176   %smax.cmp = icmp sgt i32 42, %n
    177   %smax = select i1 %smax.cmp, i32 42, i32 %n
    178   %entry.cond = icmp sgt i32 %init, %smax
    179   br i1 %entry.cond, label %loop, label %exit
    180 
    181  loop:
    182   %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
    183   %idx.inc = add i32 %idx, 1
    184   %in.bounds = icmp sgt i32 %idx, 42
    185   br i1 %in.bounds, label %ok, label %latch
    186 ; CHECK: br i1 true, label %ok, label %latch
    187 
    188  ok:
    189   %addr = getelementptr i32, i32* %a, i32 %idx
    190   store i32 %idx, i32* %addr
    191   br label %latch
    192 
    193  latch:
    194   %be.cond = icmp sgt i32 %idx.inc, %smax
    195   br i1 %be.cond, label %loop, label %exit
    196 
    197  exit:
    198   ret void
    199 }
    200 
    201 define void @max.signed.4(i32* %a, i32 %n, i32 %init) {
    202 ; CHECK-LABEL: @max.signed.4
    203  entry:
    204   %smax.cmp = icmp sgt i32 42, %n
    205   %smax = select i1 %smax.cmp, i32 42, i32 %n
    206   %entry.cond = icmp sgt i32 %init, %smax
    207   br i1 %entry.cond, label %loop, label %exit
    208 
    209  loop:
    210   %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
    211   %idx.inc = add i32 %idx, 1
    212   %in.bounds = icmp slt i32 42, %idx
    213   br i1 %in.bounds, label %ok, label %latch
    214 ; CHECK: br i1 true, label %ok, label %latch
    215 
    216  ok:
    217   %addr = getelementptr i32, i32* %a, i32 %idx
    218   store i32 %idx, i32* %addr
    219   br label %latch
    220 
    221  latch:
    222   %be.cond = icmp sgt i32 %idx.inc, %smax
    223   br i1 %be.cond, label %loop, label %exit
    224 
    225  exit:
    226   ret void
    227 }
    228 
    229 ;; --- unsigned ---
    230 
    231 define void @min.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
    232 ; CHECK-LABEL: @min.unsigned.1
    233  entry:
    234   %umin.cmp = icmp ult i32 %a_len, %n
    235   %umin = select i1 %umin.cmp, i32 %a_len, i32 %n
    236   %entry.cond = icmp ult i32 5, %umin
    237   br i1 %entry.cond, label %loop, label %exit
    238 
    239  loop:
    240   %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
    241   %idx.inc = add i32 %idx, 1
    242   %in.bounds = icmp ult i32 %idx, %a_len
    243   br i1 %in.bounds, label %ok, label %latch
    244 ; CHECK: br i1 true, label %ok, label %latch
    245 
    246  ok:
    247   %addr = getelementptr i32, i32* %a, i32 %idx
    248   store i32 %idx, i32* %addr
    249   br label %latch
    250 
    251  latch:
    252   %be.cond = icmp ult i32 %idx.inc, %umin
    253   br i1 %be.cond, label %loop, label %exit
    254 
    255  exit:
    256   ret void
    257 }
    258 
    259 define void @min.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
    260 ; CHECK-LABEL: @min.unsigned.2
    261  entry:
    262   %umin.cmp = icmp ult i32 %a_len, %n
    263   %umin = select i1 %umin.cmp, i32 %a_len, i32 %n
    264   %entry.cond = icmp ult i32 5, %umin
    265   br i1 %entry.cond, label %loop, label %exit
    266 
    267  loop:
    268   %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
    269   %idx.inc = add i32 %idx, 1
    270   %in.bounds = icmp ugt i32 %a_len, %idx
    271   br i1 %in.bounds, label %ok, label %latch
    272 ; CHECK: br i1 true, label %ok, label %latch
    273 
    274  ok:
    275   %addr = getelementptr i32, i32* %a, i32 %idx
    276   store i32 %idx, i32* %addr
    277   br label %latch
    278 
    279  latch:
    280   %be.cond = icmp ult i32 %idx.inc, %umin
    281   br i1 %be.cond, label %loop, label %exit
    282 
    283  exit:
    284   ret void
    285 }
    286 
    287 define void @min.unsigned.3(i32* %a, i32 %n) {
    288 ; CHECK-LABEL: @min.unsigned.3
    289  entry:
    290   %umin.cmp = icmp ult i32 42, %n
    291   %umin = select i1 %umin.cmp, i32 42, i32 %n
    292   %entry.cond = icmp ult i32 5, %umin
    293   br i1 %entry.cond, label %loop, label %exit
    294 
    295  loop:
    296   %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
    297   %idx.inc = add i32 %idx, 1
    298   %in.bounds = icmp ult i32 %idx, 42
    299   br i1 %in.bounds, label %ok, label %latch
    300 ; CHECK: br i1 true, label %ok, label %latch
    301 
    302  ok:
    303   %addr = getelementptr i32, i32* %a, i32 %idx
    304   store i32 %idx, i32* %addr
    305   br label %latch
    306 
    307  latch:
    308   %be.cond = icmp ult i32 %idx.inc, %umin
    309   br i1 %be.cond, label %loop, label %exit
    310 
    311  exit:
    312   ret void
    313 }
    314 
    315 define void @min.unsigned.4(i32* %a, i32 %n) {
    316 ; CHECK-LABEL: @min.unsigned.4
    317  entry:
    318   %umin.cmp = icmp ult i32 42, %n
    319   %umin = select i1 %umin.cmp, i32 42, i32 %n
    320   %entry.cond = icmp ult i32 5, %umin
    321   br i1 %entry.cond, label %loop, label %exit
    322 
    323  loop:
    324   %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
    325   %idx.inc = add i32 %idx, 1
    326   %in.bounds = icmp ugt i32 42, %idx
    327   br i1 %in.bounds, label %ok, label %latch
    328 ; CHECK: br i1 true, label %ok, label %latch
    329 
    330  ok:
    331   %addr = getelementptr i32, i32* %a, i32 %idx
    332   store i32 %idx, i32* %addr
    333   br label %latch
    334 
    335  latch:
    336   %be.cond = icmp ult i32 %idx.inc, %umin
    337   br i1 %be.cond, label %loop, label %exit
    338 
    339  exit:
    340   ret void
    341 }
    342 
    343 define void @max.unsigned.1(i32* %a, i32 %a_len, i32 %n) {
    344 ; CHECK-LABEL: @max.unsigned.1
    345  entry:
    346   %umax.cmp = icmp ugt i32 %a_len, %n
    347   %umax = select i1 %umax.cmp, i32 %a_len, i32 %n
    348   %entry.cond = icmp ugt i32 5, %umax
    349   br i1 %entry.cond, label %loop, label %exit
    350 
    351  loop:
    352   %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
    353   %idx.inc = add i32 %idx, 1
    354   %in.bounds = icmp ugt i32 %idx, %a_len
    355   br i1 %in.bounds, label %ok, label %latch
    356 ; CHECK: br i1 true, label %ok, label %latch
    357 
    358  ok:
    359   %addr = getelementptr i32, i32* %a, i32 %idx
    360   store i32 %idx, i32* %addr
    361   br label %latch
    362 
    363  latch:
    364   %be.cond = icmp ugt i32 %idx.inc, %umax
    365   br i1 %be.cond, label %loop, label %exit
    366 
    367  exit:
    368   ret void
    369 }
    370 
    371 define void @max.unsigned.2(i32* %a, i32 %a_len, i32 %n) {
    372 ; CHECK-LABEL: @max.unsigned.2
    373  entry:
    374   %umax.cmp = icmp ugt i32 %a_len, %n
    375   %umax = select i1 %umax.cmp, i32 %a_len, i32 %n
    376   %entry.cond = icmp ugt i32 5, %umax
    377   br i1 %entry.cond, label %loop, label %exit
    378 
    379  loop:
    380   %idx = phi i32 [ 5, %entry ], [ %idx.inc, %latch ]
    381   %idx.inc = add i32 %idx, 1
    382   %in.bounds = icmp ult i32 %a_len, %idx
    383   br i1 %in.bounds, label %ok, label %latch
    384 ; CHECK: br i1 true, label %ok, label %latch
    385 
    386  ok:
    387   %addr = getelementptr i32, i32* %a, i32 %idx
    388   store i32 %idx, i32* %addr
    389   br label %latch
    390 
    391  latch:
    392   %be.cond = icmp ugt i32 %idx.inc, %umax
    393   br i1 %be.cond, label %loop, label %exit
    394 
    395  exit:
    396   ret void
    397 }
    398 
    399 define void @max.unsigned.3(i32* %a, i32 %n, i32 %init) {
    400 ; CHECK-LABEL: @max.unsigned.3
    401  entry:
    402   %umax.cmp = icmp ugt i32 42, %n
    403   %umax = select i1 %umax.cmp, i32 42, i32 %n
    404   %entry.cond = icmp ugt i32 %init, %umax
    405   br i1 %entry.cond, label %loop, label %exit
    406 
    407  loop:
    408   %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
    409   %idx.inc = add i32 %idx, 1
    410   %in.bounds = icmp ugt i32 %idx, 42
    411   br i1 %in.bounds, label %ok, label %latch
    412 ; CHECK: br i1 true, label %ok, label %latch
    413 
    414  ok:
    415   %addr = getelementptr i32, i32* %a, i32 %idx
    416   store i32 %idx, i32* %addr
    417   br label %latch
    418 
    419  latch:
    420   %be.cond = icmp ugt i32 %idx.inc, %umax
    421   br i1 %be.cond, label %loop, label %exit
    422 
    423  exit:
    424   ret void
    425 }
    426 
    427 define void @max.unsigned.4(i32* %a, i32 %n, i32 %init) {
    428 ; CHECK-LABEL: @max.unsigned.4
    429  entry:
    430   %umax.cmp = icmp ugt i32 42, %n
    431   %umax = select i1 %umax.cmp, i32 42, i32 %n
    432   %entry.cond = icmp ugt i32 %init, %umax
    433   br i1 %entry.cond, label %loop, label %exit
    434 
    435  loop:
    436   %idx = phi i32 [ %init, %entry ], [ %idx.inc, %latch ]
    437   %idx.inc = add i32 %idx, 1
    438   %in.bounds = icmp ult i32 42, %idx
    439   br i1 %in.bounds, label %ok, label %latch
    440 ; CHECK: br i1 true, label %ok, label %latch
    441 
    442  ok:
    443   %addr = getelementptr i32, i32* %a, i32 %idx
    444   store i32 %idx, i32* %addr
    445   br label %latch
    446 
    447  latch:
    448   %be.cond = icmp ugt i32 %idx.inc, %umax
    449   br i1 %be.cond, label %loop, label %exit
    450 
    451  exit:
    452   ret void
    453 }
    454