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