Home | History | Annotate | Download | only in LoopUnrollAndJam
      1 ; RUN: opt -loop-unroll-and-jam -allow-unroll-and-jam -pass-remarks=loop-unroll < %s -S 2>&1 | FileCheck %s
      2 
      3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
      4 target triple = "thumbv8m.main-arm-none-eabi"
      5 
      6 ;; Common check for all tests. None should be unroll and jammed due to profitability
      7 ; CHECK-NOT: remark: {{.*}} unroll and jammed
      8 
      9 
     10 ; CHECK-LABEL: unprof1
     11 ; Multiple inner loop blocks
     12 define void @unprof1(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
     13 ; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
     14 ; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner2 ]
     15 entry:
     16   %cmp = icmp ne i32 %J, 0
     17   %cmp122 = icmp ne i32 %I, 0
     18   %or.cond = and i1 %cmp, %cmp122
     19   br i1 %or.cond, label %for.outer.preheader, label %for.end
     20 
     21 for.outer.preheader:
     22   br label %for.outer
     23 
     24 for.outer:
     25   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
     26   br label %for.inner
     27 
     28 for.inner:
     29   %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner2 ]
     30   %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner2 ]
     31   %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j
     32   %0 = load i32, i32* %arrayidx, align 4
     33   %add = add i32 %0, %sum1
     34 br label %for.inner2
     35 
     36 for.inner2:
     37   %inc = add nuw i32 %j, 1
     38   %exitcond = icmp eq i32 %inc, %J
     39   br i1 %exitcond, label %for.latch, label %for.inner
     40 
     41 for.latch:
     42   %add.lcssa = phi i32 [ %add, %for.inner2 ]
     43   %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
     44   store i32 %add.lcssa, i32* %arrayidx6, align 4
     45   %addinc = add nuw i32 %i, 1
     46   %exitcond25 = icmp eq i32 %addinc, %I
     47   br i1 %exitcond25, label %for.loopexit, label %for.outer
     48 
     49 for.loopexit:
     50   br label %for.end
     51 
     52 for.end:
     53   ret void
     54 }
     55 
     56 
     57 ; CHECK-LABEL: unprof2
     58 ; Constant inner loop count
     59 define void @unprof2(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
     60 ; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
     61 ; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
     62 entry:
     63   %cmp = icmp ne i32 %J, 0
     64   %cmp122 = icmp ne i32 %I, 0
     65   %or.cond = and i1 %cmp, %cmp122
     66   br i1 %or.cond, label %for.outer.preheader, label %for.end
     67 
     68 for.outer.preheader:
     69   br label %for.outer
     70 
     71 for.outer:
     72   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
     73   br label %for.inner
     74 
     75 for.inner:
     76   %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
     77   %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
     78   %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j
     79   %0 = load i32, i32* %arrayidx, align 4
     80   %add = add i32 %0, %sum1
     81   %inc = add nuw i32 %j, 1
     82   %exitcond = icmp eq i32 %inc, 10
     83   br i1 %exitcond, label %for.latch, label %for.inner
     84 
     85 for.latch:
     86   %add.lcssa = phi i32 [ %add, %for.inner ]
     87   %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
     88   store i32 %add.lcssa, i32* %arrayidx6, align 4
     89   %addinc = add nuw i32 %i, 1
     90   %exitcond25 = icmp eq i32 %addinc, %I
     91   br i1 %exitcond25, label %for.loopexit, label %for.outer
     92 
     93 for.loopexit:
     94   br label %for.end
     95 
     96 for.end:
     97   ret void
     98 }
     99 
    100 
    101 ; CHECK-LABEL: unprof3
    102 ; Complex inner loop
    103 define void @unprof3(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
    104 ; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
    105 ; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
    106 entry:
    107   %cmp = icmp ne i32 %J, 0
    108   %cmp122 = icmp ne i32 %I, 0
    109   %or.cond = and i1 %cmp, %cmp122
    110   br i1 %or.cond, label %for.outer.preheader, label %for.end
    111 
    112 for.outer.preheader:
    113   br label %for.outer
    114 
    115 for.outer:
    116   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
    117   br label %for.inner
    118 
    119 for.inner:
    120   %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
    121   %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
    122   %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j
    123   %0 = load i32, i32* %arrayidx, align 4
    124   %add = add i32 %0, %sum1
    125   %add0 = add i32 %0, %sum1
    126   %add1 = add i32 %0, %sum1
    127   %add2 = add i32 %0, %sum1
    128   %add3 = add i32 %0, %sum1
    129   %add4 = add i32 %0, %sum1
    130   %add5 = add i32 %0, %sum1
    131   %add6 = add i32 %0, %sum1
    132   %add7 = add i32 %0, %sum1
    133   %add8 = add i32 %0, %sum1
    134   %add9 = add i32 %0, %sum1
    135   %add10 = add i32 %0, %sum1
    136   %add11 = add i32 %0, %sum1
    137   %add12 = add i32 %0, %sum1
    138   %add13 = add i32 %0, %sum1
    139   %add14 = add i32 %0, %sum1
    140   %add15 = add i32 %0, %sum1
    141   %add16 = add i32 %0, %sum1
    142   %add17 = add i32 %0, %sum1
    143   %add18 = add i32 %0, %sum1
    144   %add19 = add i32 %0, %sum1
    145   %add20 = add i32 %0, %sum1
    146   %add21 = add i32 %0, %sum1
    147   %add22 = add i32 %0, %sum1
    148   %add23 = add i32 %0, %sum1
    149   %add24 = add i32 %0, %sum1
    150   %add25 = add i32 %0, %sum1
    151   %add26 = add i32 %0, %sum1
    152   %add27 = add i32 %0, %sum1
    153   %add28 = add i32 %0, %sum1
    154   %add29 = add i32 %0, %sum1
    155   %inc = add nuw i32 %j, 1
    156   %exitcond = icmp eq i32 %inc, %J
    157   br i1 %exitcond, label %for.latch, label %for.inner
    158 
    159 for.latch:
    160   %add.lcssa = phi i32 [ %add, %for.inner ]
    161   %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
    162   store i32 %add.lcssa, i32* %arrayidx6, align 4
    163   %addinc = add nuw i32 %i, 1
    164   %exitcond25 = icmp eq i32 %addinc, %I
    165   br i1 %exitcond25, label %for.loopexit, label %for.outer
    166 
    167 for.loopexit:
    168   br label %for.end
    169 
    170 for.end:
    171   ret void
    172 }
    173 
    174 
    175 ; CHECK-LABEL: unprof4
    176 ; No loop invariant loads
    177 define void @unprof4(i32 %I, i32 %J, i32* noalias nocapture %A, i32* noalias nocapture readonly %B) #0 {
    178 ; CHECK: %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
    179 ; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
    180 entry:
    181   %cmp = icmp ne i32 %J, 0
    182   %cmp122 = icmp ne i32 %I, 0
    183   %or.cond = and i1 %cmp, %cmp122
    184   br i1 %or.cond, label %for.outer.preheader, label %for.end
    185 
    186 for.outer.preheader:
    187   br label %for.outer
    188 
    189 for.outer:
    190   %i = phi i32 [ %addinc, %for.latch ], [ 0, %for.outer.preheader ]
    191   br label %for.inner
    192 
    193 for.inner:
    194   %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]
    195   %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]
    196   %j2 = add i32 %j, %i
    197   %arrayidx = getelementptr inbounds i32, i32* %B, i32 %j2
    198   %0 = load i32, i32* %arrayidx, align 4
    199   %add = add i32 %0, %sum1
    200   %inc = add nuw i32 %j, 1
    201   %exitcond = icmp eq i32 %inc, %J
    202   br i1 %exitcond, label %for.latch, label %for.inner
    203 
    204 for.latch:
    205   %add.lcssa = phi i32 [ %add, %for.inner ]
    206   %arrayidx6 = getelementptr inbounds i32, i32* %A, i32 %i
    207   store i32 %add.lcssa, i32* %arrayidx6, align 4
    208   %addinc = add nuw i32 %i, 1
    209   %exitcond25 = icmp eq i32 %addinc, %I
    210   br i1 %exitcond25, label %for.loopexit, label %for.outer
    211 
    212 for.loopexit:
    213   br label %for.end
    214 
    215 for.end:
    216   ret void
    217 }
    218