Home | History | Annotate | Download | only in LoopVectorize
      1 ; RUN: opt < %s  -basicaa -loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -dce -instcombine -S | FileCheck %s
      2 ; RUN: opt < %s  -basicaa -loop-vectorize -force-vector-width=4 -force-vector-interleave=4 -dce -instcombine -S | FileCheck %s -check-prefix=UNROLL
      3 
      4 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
      5 target triple = "x86_64-apple-macosx10.8.0"
      6 
      7 @b = common global [2048 x i32] zeroinitializer, align 16
      8 @c = common global [2048 x i32] zeroinitializer, align 16
      9 @a = common global [2048 x i32] zeroinitializer, align 16
     10 @G = common global [32 x [1024 x i32]] zeroinitializer, align 16
     11 @ub = common global [1024 x i32] zeroinitializer, align 16
     12 @uc = common global [1024 x i32] zeroinitializer, align 16
     13 @d = common global [2048 x i32] zeroinitializer, align 16
     14 @fa = common global [1024 x float] zeroinitializer, align 16
     15 @fb = common global [1024 x float] zeroinitializer, align 16
     16 @ic = common global [1024 x i32] zeroinitializer, align 16
     17 @da = common global [1024 x float] zeroinitializer, align 16
     18 @db = common global [1024 x float] zeroinitializer, align 16
     19 @dc = common global [1024 x float] zeroinitializer, align 16
     20 @dd = common global [1024 x float] zeroinitializer, align 16
     21 @dj = common global [1024 x i32] zeroinitializer, align 16
     22 
     23 ;CHECK-LABEL: @example1(
     24 ;CHECK: load <4 x i32>
     25 ;CHECK: add nsw <4 x i32>
     26 ;CHECK: store <4 x i32>
     27 ;CHECK: ret void
     28 ;UNROLL-LABEL: @example1(
     29 ;UNROLL: load <4 x i32>
     30 ;UNROLL: load <4 x i32>
     31 ;UNROLL: load <4 x i32>
     32 ;UNROLL: load <4 x i32>
     33 ;UNROLL: add nsw <4 x i32>
     34 ;UNROLL: add nsw <4 x i32>
     35 ;UNROLL: add nsw <4 x i32>
     36 ;UNROLL: add nsw <4 x i32>
     37 ;UNROLL: store <4 x i32>
     38 ;UNROLL: store <4 x i32>
     39 ;UNROLL: store <4 x i32>
     40 ;UNROLL: store <4 x i32>
     41 ;UNROLL: ret void
     42 define void @example1() nounwind uwtable ssp {
     43   br label %1
     44 
     45 ; <label>:1                                       ; preds = %1, %0
     46   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
     47   %2 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv
     48   %3 = load i32, i32* %2, align 4
     49   %4 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %indvars.iv
     50   %5 = load i32, i32* %4, align 4
     51   %6 = add nsw i32 %5, %3
     52   %7 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
     53   store i32 %6, i32* %7, align 4
     54   %indvars.iv.next = add i64 %indvars.iv, 1
     55   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
     56   %exitcond = icmp eq i32 %lftr.wideiv, 256
     57   br i1 %exitcond, label %8, label %1
     58 
     59 ; <label>:8                                       ; preds = %1
     60   ret void
     61 }
     62 
     63 ;CHECK-LABEL: @example2(
     64 ;CHECK: store <4 x i32>
     65 ;CHECK: ret void
     66 ;UNROLL-LABEL: @example2(
     67 ;UNROLL: store <4 x i32>
     68 ;UNROLL: store <4 x i32>
     69 ;UNROLL: store <4 x i32>
     70 ;UNROLL: store <4 x i32>
     71 ;UNROLL: ret void
     72 define void @example2(i32 %n, i32 %x) nounwind uwtable ssp {
     73   %1 = icmp sgt i32 %n, 0
     74   br i1 %1, label %.lr.ph5, label %.preheader
     75 
     76 ..preheader_crit_edge:                            ; preds = %.lr.ph5
     77   %phitmp = sext i32 %n to i64
     78   br label %.preheader
     79 
     80 .preheader:                                       ; preds = %..preheader_crit_edge, %0
     81   %i.0.lcssa = phi i64 [ %phitmp, %..preheader_crit_edge ], [ 0, %0 ]
     82   %2 = icmp eq i32 %n, 0
     83   br i1 %2, label %._crit_edge, label %.lr.ph
     84 
     85 .lr.ph5:                                          ; preds = %0, %.lr.ph5
     86   %indvars.iv6 = phi i64 [ %indvars.iv.next7, %.lr.ph5 ], [ 0, %0 ]
     87   %3 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv6
     88   store i32 %x, i32* %3, align 4
     89   %indvars.iv.next7 = add i64 %indvars.iv6, 1
     90   %lftr.wideiv = trunc i64 %indvars.iv.next7 to i32
     91   %exitcond = icmp eq i32 %lftr.wideiv, %n
     92   br i1 %exitcond, label %..preheader_crit_edge, label %.lr.ph5
     93 
     94 .lr.ph:                                           ; preds = %.preheader, %.lr.ph
     95   %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %i.0.lcssa, %.preheader ]
     96   %.02 = phi i32 [ %4, %.lr.ph ], [ %n, %.preheader ]
     97   %4 = add nsw i32 %.02, -1
     98   %5 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv
     99   %6 = load i32, i32* %5, align 4
    100   %7 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %indvars.iv
    101   %8 = load i32, i32* %7, align 4
    102   %9 = and i32 %8, %6
    103   %10 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
    104   store i32 %9, i32* %10, align 4
    105   %indvars.iv.next = add i64 %indvars.iv, 1
    106   %11 = icmp eq i32 %4, 0
    107   br i1 %11, label %._crit_edge, label %.lr.ph
    108 
    109 ._crit_edge:                                      ; preds = %.lr.ph, %.preheader
    110   ret void
    111 }
    112 
    113 ;CHECK-LABEL: @example3(
    114 ;CHECK: <4 x i32>
    115 ;CHECK: ret void
    116 ;UNROLL-LABEL: @example3(
    117 ;UNROLL: <4 x i32>
    118 ;UNROLL: <4 x i32>
    119 ;UNROLL: <4 x i32>
    120 ;UNROLL: <4 x i32>
    121 ;UNROLL: ret void
    122 define void @example3(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture %q) nounwind uwtable ssp {
    123   %1 = icmp eq i32 %n, 0
    124   br i1 %1, label %._crit_edge, label %.lr.ph
    125 
    126 .lr.ph:                                           ; preds = %0, %.lr.ph
    127   %.05 = phi i32 [ %2, %.lr.ph ], [ %n, %0 ]
    128   %.014 = phi i32* [ %5, %.lr.ph ], [ %p, %0 ]
    129   %.023 = phi i32* [ %3, %.lr.ph ], [ %q, %0 ]
    130   %2 = add nsw i32 %.05, -1
    131   %3 = getelementptr inbounds i32, i32* %.023, i64 1
    132   %4 = load i32, i32* %.023, align 16
    133   %5 = getelementptr inbounds i32, i32* %.014, i64 1
    134   store i32 %4, i32* %.014, align 16
    135   %6 = icmp eq i32 %2, 0
    136   br i1 %6, label %._crit_edge, label %.lr.ph
    137 
    138 ._crit_edge:                                      ; preds = %.lr.ph, %0
    139   ret void
    140 }
    141 
    142 ;CHECK-LABEL: @example4(
    143 ;CHECK: load <4 x i32>
    144 ;CHECK: ret void
    145 ;UNROLL-LABEL: @example4(
    146 ;UNROLL: load <4 x i32>
    147 ;UNROLL: load <4 x i32>
    148 ;UNROLL: load <4 x i32>
    149 ;UNROLL: load <4 x i32>
    150 ;UNROLL: ret void
    151 define void @example4(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture %q) nounwind uwtable ssp {
    152   %1 = add nsw i32 %n, -1
    153   %2 = icmp eq i32 %n, 0
    154   br i1 %2, label %.preheader4, label %.lr.ph10
    155 
    156 .preheader4:                                      ; preds = %0
    157   %3 = icmp sgt i32 %1, 0
    158   br i1 %3, label %.lr.ph6, label %._crit_edge
    159 
    160 .lr.ph10:                                         ; preds = %0, %.lr.ph10
    161   %4 = phi i32 [ %9, %.lr.ph10 ], [ %1, %0 ]
    162   %.018 = phi i32* [ %8, %.lr.ph10 ], [ %p, %0 ]
    163   %.027 = phi i32* [ %5, %.lr.ph10 ], [ %q, %0 ]
    164   %5 = getelementptr inbounds i32, i32* %.027, i64 1
    165   %6 = load i32, i32* %.027, align 16
    166   %7 = add nsw i32 %6, 5
    167   %8 = getelementptr inbounds i32, i32* %.018, i64 1
    168   store i32 %7, i32* %.018, align 16
    169   %9 = add nsw i32 %4, -1
    170   %10 = icmp eq i32 %4, 0
    171   br i1 %10, label %._crit_edge, label %.lr.ph10
    172 
    173 .preheader:                                       ; preds = %.lr.ph6
    174   br i1 %3, label %.lr.ph, label %._crit_edge
    175 
    176 .lr.ph6:                                          ; preds = %.preheader4, %.lr.ph6
    177   %indvars.iv11 = phi i64 [ %indvars.iv.next12, %.lr.ph6 ], [ 0, %.preheader4 ]
    178   %indvars.iv.next12 = add i64 %indvars.iv11, 1
    179   %11 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv.next12
    180   %12 = load i32, i32* %11, align 4
    181   %13 = add nsw i64 %indvars.iv11, 3
    182   %14 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %13
    183   %15 = load i32, i32* %14, align 4
    184   %16 = add nsw i32 %15, %12
    185   %17 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv11
    186   store i32 %16, i32* %17, align 4
    187   %lftr.wideiv13 = trunc i64 %indvars.iv.next12 to i32
    188   %exitcond14 = icmp eq i32 %lftr.wideiv13, %1
    189   br i1 %exitcond14, label %.preheader, label %.lr.ph6
    190 
    191 .lr.ph:                                           ; preds = %.preheader, %.lr.ph
    192   %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %.preheader ]
    193   %18 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
    194   %19 = load i32, i32* %18, align 4
    195   %20 = icmp sgt i32 %19, 4
    196   %21 = select i1 %20, i32 4, i32 0
    197   %22 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv
    198   store i32 %21, i32* %22, align 4
    199   %indvars.iv.next = add i64 %indvars.iv, 1
    200   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    201   %exitcond = icmp eq i32 %lftr.wideiv, %1
    202   br i1 %exitcond, label %._crit_edge, label %.lr.ph
    203 
    204 ._crit_edge:                                      ; preds = %.lr.ph10, %.preheader4, %.lr.ph, %.preheader
    205   ret void
    206 }
    207 
    208 ;CHECK-LABEL: @example8(
    209 ;CHECK: store <4 x i32>
    210 ;CHECK: ret void
    211 ;UNROLL-LABEL: @example8(
    212 ;UNROLL: store <4 x i32>
    213 ;UNROLL: store <4 x i32>
    214 ;UNROLL: store <4 x i32>
    215 ;UNROLL: store <4 x i32>
    216 ;UNROLL: ret void
    217 define void @example8(i32 %x) nounwind uwtable ssp {
    218   br label %.preheader
    219 
    220 .preheader:                                       ; preds = %3, %0
    221   %indvars.iv3 = phi i64 [ 0, %0 ], [ %indvars.iv.next4, %3 ]
    222   br label %1
    223 
    224 ; <label>:1                                       ; preds = %1, %.preheader
    225   %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %1 ]
    226   %2 = getelementptr inbounds [32 x [1024 x i32]], [32 x [1024 x i32]]* @G, i64 0, i64 %indvars.iv3, i64 %indvars.iv
    227   store i32 %x, i32* %2, align 4
    228   %indvars.iv.next = add i64 %indvars.iv, 1
    229   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    230   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    231   br i1 %exitcond, label %3, label %1
    232 
    233 ; <label>:3                                       ; preds = %1
    234   %indvars.iv.next4 = add i64 %indvars.iv3, 1
    235   %lftr.wideiv5 = trunc i64 %indvars.iv.next4 to i32
    236   %exitcond6 = icmp eq i32 %lftr.wideiv5, 32
    237   br i1 %exitcond6, label %4, label %.preheader
    238 
    239 ; <label>:4                                       ; preds = %3
    240   ret void
    241 }
    242 
    243 ;CHECK-LABEL: @example9(
    244 ;CHECK: phi <4 x i32>
    245 ;CHECK: ret i32
    246 define i32 @example9() nounwind uwtable readonly ssp {
    247   br label %1
    248 
    249 ; <label>:1                                       ; preds = %1, %0
    250   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
    251   %diff.01 = phi i32 [ 0, %0 ], [ %7, %1 ]
    252   %2 = getelementptr inbounds [1024 x i32], [1024 x i32]* @ub, i64 0, i64 %indvars.iv
    253   %3 = load i32, i32* %2, align 4
    254   %4 = getelementptr inbounds [1024 x i32], [1024 x i32]* @uc, i64 0, i64 %indvars.iv
    255   %5 = load i32, i32* %4, align 4
    256   %6 = add i32 %3, %diff.01
    257   %7 = sub i32 %6, %5
    258   %indvars.iv.next = add i64 %indvars.iv, 1
    259   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    260   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    261   br i1 %exitcond, label %8, label %1
    262 
    263 ; <label>:8                                       ; preds = %1
    264   ret i32 %7
    265 }
    266 
    267 ;CHECK-LABEL: @example10a(
    268 ;CHECK: load <4 x i32>
    269 ;CHECK: add nsw <4 x i32>
    270 ;CHECK: load <4 x i16>
    271 ;CHECK: add <4 x i16>
    272 ;CHECK: store <4 x i16>
    273 ;CHECK: ret void
    274 define void @example10a(i16* noalias nocapture %sa, i16* noalias nocapture %sb, i16* noalias nocapture %sc, i32* noalias nocapture %ia, i32* noalias nocapture %ib, i32* noalias nocapture %ic) nounwind uwtable ssp {
    275   br label %1
    276 
    277 ; <label>:1                                       ; preds = %1, %0
    278   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
    279   %2 = getelementptr inbounds i32, i32* %ib, i64 %indvars.iv
    280   %3 = load i32, i32* %2, align 4
    281   %4 = getelementptr inbounds i32, i32* %ic, i64 %indvars.iv
    282   %5 = load i32, i32* %4, align 4
    283   %6 = add nsw i32 %5, %3
    284   %7 = getelementptr inbounds i32, i32* %ia, i64 %indvars.iv
    285   store i32 %6, i32* %7, align 4
    286   %8 = getelementptr inbounds i16, i16* %sb, i64 %indvars.iv
    287   %9 = load i16, i16* %8, align 2
    288   %10 = getelementptr inbounds i16, i16* %sc, i64 %indvars.iv
    289   %11 = load i16, i16* %10, align 2
    290   %12 = add i16 %11, %9
    291   %13 = getelementptr inbounds i16, i16* %sa, i64 %indvars.iv
    292   store i16 %12, i16* %13, align 2
    293   %indvars.iv.next = add i64 %indvars.iv, 1
    294   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    295   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    296   br i1 %exitcond, label %14, label %1
    297 
    298 ; <label>:14                                      ; preds = %1
    299   ret void
    300 }
    301 
    302 ;CHECK-LABEL: @example10b(
    303 ;CHECK: load <4 x i16>
    304 ;CHECK: sext <4 x i16>
    305 ;CHECK: store <4 x i32>
    306 ;CHECK: ret void
    307 define void @example10b(i16* noalias nocapture %sa, i16* noalias nocapture %sb, i16* noalias nocapture %sc, i32* noalias nocapture %ia, i32* noalias nocapture %ib, i32* noalias nocapture %ic) nounwind uwtable ssp {
    308   br label %1
    309 
    310 ; <label>:1                                       ; preds = %1, %0
    311   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
    312   %2 = getelementptr inbounds i16, i16* %sb, i64 %indvars.iv
    313   %3 = load i16, i16* %2, align 2
    314   %4 = sext i16 %3 to i32
    315   %5 = getelementptr inbounds i32, i32* %ia, i64 %indvars.iv
    316   store i32 %4, i32* %5, align 4
    317   %indvars.iv.next = add i64 %indvars.iv, 1
    318   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    319   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    320   br i1 %exitcond, label %6, label %1
    321 
    322 ; <label>:6                                       ; preds = %1
    323   ret void
    324 }
    325 
    326 ;CHECK-LABEL: @example11(
    327 ;CHECK: load i32
    328 ;CHECK: load i32
    329 ;CHECK: load i32
    330 ;CHECK: load i32
    331 ;CHECK: insertelement
    332 ;CHECK: insertelement
    333 ;CHECK: insertelement
    334 ;CHECK: insertelement
    335 ;CHECK: ret void
    336 define void @example11() nounwind uwtable ssp {
    337   br label %1
    338 
    339 ; <label>:1                                       ; preds = %1, %0
    340   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
    341   %2 = shl nsw i64 %indvars.iv, 1
    342   %3 = or i64 %2, 1
    343   %4 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %3
    344   %5 = load i32, i32* %4, align 4
    345   %6 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %3
    346   %7 = load i32, i32* %6, align 4
    347   %8 = mul nsw i32 %7, %5
    348   %9 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %2
    349   %10 = load i32, i32* %9, align 8
    350   %11 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %2
    351   %12 = load i32, i32* %11, align 8
    352   %13 = mul nsw i32 %12, %10
    353   %14 = sub nsw i32 %8, %13
    354   %15 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
    355   store i32 %14, i32* %15, align 4
    356   %16 = mul nsw i32 %7, %10
    357   %17 = mul nsw i32 %12, %5
    358   %18 = add nsw i32 %17, %16
    359   %19 = getelementptr inbounds [2048 x i32], [2048 x i32]* @d, i64 0, i64 %indvars.iv
    360   store i32 %18, i32* %19, align 4
    361   %indvars.iv.next = add i64 %indvars.iv, 1
    362   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    363   %exitcond = icmp eq i32 %lftr.wideiv, 512
    364   br i1 %exitcond, label %20, label %1
    365 
    366 ; <label>:20                                      ; preds = %1
    367   ret void
    368 }
    369 
    370 ;CHECK-LABEL: @example12(
    371 ;CHECK: %vec.ind1 = phi <4 x i32>
    372 ;CHECK: store <4 x i32>
    373 ;CHECK: ret void
    374 define void @example12() nounwind uwtable ssp {
    375   br label %1
    376 
    377 ; <label>:1                                       ; preds = %1, %0
    378   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
    379   %2 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
    380   %3 = trunc i64 %indvars.iv to i32
    381   store i32 %3, i32* %2, align 4
    382   %indvars.iv.next = add i64 %indvars.iv, 1
    383   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    384   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    385   br i1 %exitcond, label %4, label %1
    386 
    387 ; <label>:4                                       ; preds = %1
    388   ret void
    389 }
    390 
    391 ;CHECK-LABEL: @example13(
    392 ;CHECK: <4 x i32>
    393 ;CHECK: ret void
    394 define void @example13(i32** nocapture %A, i32** nocapture %B, i32* nocapture %out) nounwind uwtable ssp {
    395   br label %.preheader
    396 
    397 .preheader:                                       ; preds = %14, %0
    398   %indvars.iv4 = phi i64 [ 0, %0 ], [ %indvars.iv.next5, %14 ]
    399   %1 = getelementptr inbounds i32*, i32** %A, i64 %indvars.iv4
    400   %2 = load i32*, i32** %1, align 8
    401   %3 = getelementptr inbounds i32*, i32** %B, i64 %indvars.iv4
    402   %4 = load i32*, i32** %3, align 8
    403   br label %5
    404 
    405 ; <label>:5                                       ; preds = %.preheader, %5
    406   %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %5 ]
    407   %diff.02 = phi i32 [ 0, %.preheader ], [ %11, %5 ]
    408   %6 = getelementptr inbounds i32, i32* %2, i64 %indvars.iv
    409   %7 = load i32, i32* %6, align 4
    410   %8 = getelementptr inbounds i32, i32* %4, i64 %indvars.iv
    411   %9 = load i32, i32* %8, align 4
    412   %10 = add i32 %7, %diff.02
    413   %11 = sub i32 %10, %9
    414   %indvars.iv.next = add i64 %indvars.iv, 8
    415   %12 = trunc i64 %indvars.iv.next to i32
    416   %13 = icmp slt i32 %12, 1024
    417   br i1 %13, label %5, label %14
    418 
    419 ; <label>:14                                      ; preds = %5
    420   %15 = getelementptr inbounds i32, i32* %out, i64 %indvars.iv4
    421   store i32 %11, i32* %15, align 4
    422   %indvars.iv.next5 = add i64 %indvars.iv4, 1
    423   %lftr.wideiv = trunc i64 %indvars.iv.next5 to i32
    424   %exitcond = icmp eq i32 %lftr.wideiv, 32
    425   br i1 %exitcond, label %16, label %.preheader
    426 
    427 ; <label>:16                                      ; preds = %14
    428   ret void
    429 }
    430 
    431 ; Can vectorize.
    432 ;CHECK-LABEL: @example14(
    433 ;CHECK: <4 x i32>
    434 ;CHECK: ret void
    435 define void @example14(i32** nocapture %in, i32** nocapture %coeff, i32* nocapture %out) nounwind uwtable ssp {
    436 .preheader3:
    437   br label %.preheader
    438 
    439 .preheader:                                       ; preds = %11, %.preheader3
    440   %indvars.iv7 = phi i64 [ 0, %.preheader3 ], [ %indvars.iv.next8, %11 ]
    441   %sum.05 = phi i32 [ 0, %.preheader3 ], [ %10, %11 ]
    442   br label %0
    443 
    444 ; <label>:0                                       ; preds = %0, %.preheader
    445   %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %0 ]
    446   %sum.12 = phi i32 [ %sum.05, %.preheader ], [ %10, %0 ]
    447   %1 = getelementptr inbounds i32*, i32** %in, i64 %indvars.iv
    448   %2 = load i32*, i32** %1, align 8
    449   %3 = getelementptr inbounds i32, i32* %2, i64 %indvars.iv7
    450   %4 = load i32, i32* %3, align 4
    451   %5 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv
    452   %6 = load i32*, i32** %5, align 8
    453   %7 = getelementptr inbounds i32, i32* %6, i64 %indvars.iv7
    454   %8 = load i32, i32* %7, align 4
    455   %9 = mul nsw i32 %8, %4
    456   %10 = add nsw i32 %9, %sum.12
    457   %indvars.iv.next = add i64 %indvars.iv, 1
    458   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    459   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    460   br i1 %exitcond, label %11, label %0
    461 
    462 ; <label>:11                                      ; preds = %0
    463   %indvars.iv.next8 = add i64 %indvars.iv7, 1
    464   %lftr.wideiv9 = trunc i64 %indvars.iv.next8 to i32
    465   %exitcond10 = icmp eq i32 %lftr.wideiv9, 32
    466   br i1 %exitcond10, label %.preheader3.1, label %.preheader
    467 
    468 .preheader3.1:                                    ; preds = %11
    469   store i32 %10, i32* %out, align 4
    470   br label %.preheader.1
    471 
    472 .preheader.1:                                     ; preds = %24, %.preheader3.1
    473   %indvars.iv7.1 = phi i64 [ 0, %.preheader3.1 ], [ %indvars.iv.next8.1, %24 ]
    474   %sum.05.1 = phi i32 [ 0, %.preheader3.1 ], [ %23, %24 ]
    475   br label %12
    476 
    477 ; <label>:12                                      ; preds = %12, %.preheader.1
    478   %indvars.iv.1 = phi i64 [ 0, %.preheader.1 ], [ %13, %12 ]
    479   %sum.12.1 = phi i32 [ %sum.05.1, %.preheader.1 ], [ %23, %12 ]
    480   %13 = add nsw i64 %indvars.iv.1, 1
    481   %14 = getelementptr inbounds i32*, i32** %in, i64 %13
    482   %15 = load i32*, i32** %14, align 8
    483   %16 = getelementptr inbounds i32, i32* %15, i64 %indvars.iv7.1
    484   %17 = load i32, i32* %16, align 4
    485   %18 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv.1
    486   %19 = load i32*, i32** %18, align 8
    487   %20 = getelementptr inbounds i32, i32* %19, i64 %indvars.iv7.1
    488   %21 = load i32, i32* %20, align 4
    489   %22 = mul nsw i32 %21, %17
    490   %23 = add nsw i32 %22, %sum.12.1
    491   %lftr.wideiv.1 = trunc i64 %13 to i32
    492   %exitcond.1 = icmp eq i32 %lftr.wideiv.1, 1024
    493   br i1 %exitcond.1, label %24, label %12
    494 
    495 ; <label>:24                                      ; preds = %12
    496   %indvars.iv.next8.1 = add i64 %indvars.iv7.1, 1
    497   %lftr.wideiv9.1 = trunc i64 %indvars.iv.next8.1 to i32
    498   %exitcond10.1 = icmp eq i32 %lftr.wideiv9.1, 32
    499   br i1 %exitcond10.1, label %.preheader3.2, label %.preheader.1
    500 
    501 .preheader3.2:                                    ; preds = %24
    502   %25 = getelementptr inbounds i32, i32* %out, i64 1
    503   store i32 %23, i32* %25, align 4
    504   br label %.preheader.2
    505 
    506 .preheader.2:                                     ; preds = %38, %.preheader3.2
    507   %indvars.iv7.2 = phi i64 [ 0, %.preheader3.2 ], [ %indvars.iv.next8.2, %38 ]
    508   %sum.05.2 = phi i32 [ 0, %.preheader3.2 ], [ %37, %38 ]
    509   br label %26
    510 
    511 ; <label>:26                                      ; preds = %26, %.preheader.2
    512   %indvars.iv.2 = phi i64 [ 0, %.preheader.2 ], [ %indvars.iv.next.2, %26 ]
    513   %sum.12.2 = phi i32 [ %sum.05.2, %.preheader.2 ], [ %37, %26 ]
    514   %27 = add nsw i64 %indvars.iv.2, 2
    515   %28 = getelementptr inbounds i32*, i32** %in, i64 %27
    516   %29 = load i32*, i32** %28, align 8
    517   %30 = getelementptr inbounds i32, i32* %29, i64 %indvars.iv7.2
    518   %31 = load i32, i32* %30, align 4
    519   %32 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv.2
    520   %33 = load i32*, i32** %32, align 8
    521   %34 = getelementptr inbounds i32, i32* %33, i64 %indvars.iv7.2
    522   %35 = load i32, i32* %34, align 4
    523   %36 = mul nsw i32 %35, %31
    524   %37 = add nsw i32 %36, %sum.12.2
    525   %indvars.iv.next.2 = add i64 %indvars.iv.2, 1
    526   %lftr.wideiv.2 = trunc i64 %indvars.iv.next.2 to i32
    527   %exitcond.2 = icmp eq i32 %lftr.wideiv.2, 1024
    528   br i1 %exitcond.2, label %38, label %26
    529 
    530 ; <label>:38                                      ; preds = %26
    531   %indvars.iv.next8.2 = add i64 %indvars.iv7.2, 1
    532   %lftr.wideiv9.2 = trunc i64 %indvars.iv.next8.2 to i32
    533   %exitcond10.2 = icmp eq i32 %lftr.wideiv9.2, 32
    534   br i1 %exitcond10.2, label %.preheader3.3, label %.preheader.2
    535 
    536 .preheader3.3:                                    ; preds = %38
    537   %39 = getelementptr inbounds i32, i32* %out, i64 2
    538   store i32 %37, i32* %39, align 4
    539   br label %.preheader.3
    540 
    541 .preheader.3:                                     ; preds = %52, %.preheader3.3
    542   %indvars.iv7.3 = phi i64 [ 0, %.preheader3.3 ], [ %indvars.iv.next8.3, %52 ]
    543   %sum.05.3 = phi i32 [ 0, %.preheader3.3 ], [ %51, %52 ]
    544   br label %40
    545 
    546 ; <label>:40                                      ; preds = %40, %.preheader.3
    547   %indvars.iv.3 = phi i64 [ 0, %.preheader.3 ], [ %indvars.iv.next.3, %40 ]
    548   %sum.12.3 = phi i32 [ %sum.05.3, %.preheader.3 ], [ %51, %40 ]
    549   %41 = add nsw i64 %indvars.iv.3, 3
    550   %42 = getelementptr inbounds i32*, i32** %in, i64 %41
    551   %43 = load i32*, i32** %42, align 8
    552   %44 = getelementptr inbounds i32, i32* %43, i64 %indvars.iv7.3
    553   %45 = load i32, i32* %44, align 4
    554   %46 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv.3
    555   %47 = load i32*, i32** %46, align 8
    556   %48 = getelementptr inbounds i32, i32* %47, i64 %indvars.iv7.3
    557   %49 = load i32, i32* %48, align 4
    558   %50 = mul nsw i32 %49, %45
    559   %51 = add nsw i32 %50, %sum.12.3
    560   %indvars.iv.next.3 = add i64 %indvars.iv.3, 1
    561   %lftr.wideiv.3 = trunc i64 %indvars.iv.next.3 to i32
    562   %exitcond.3 = icmp eq i32 %lftr.wideiv.3, 1024
    563   br i1 %exitcond.3, label %52, label %40
    564 
    565 ; <label>:52                                      ; preds = %40
    566   %indvars.iv.next8.3 = add i64 %indvars.iv7.3, 1
    567   %lftr.wideiv9.3 = trunc i64 %indvars.iv.next8.3 to i32
    568   %exitcond10.3 = icmp eq i32 %lftr.wideiv9.3, 32
    569   br i1 %exitcond10.3, label %53, label %.preheader.3
    570 
    571 ; <label>:53                                      ; preds = %52
    572   %54 = getelementptr inbounds i32, i32* %out, i64 3
    573   store i32 %51, i32* %54, align 4
    574   ret void
    575 }
    576 
    577 ;CHECK-LABEL: @example21(
    578 ;CHECK: load <4 x i32>
    579 ;CHECK: shufflevector {{.*}} <i32 3, i32 2, i32 1, i32 0>
    580 ;CHECK: ret i32
    581 define i32 @example21(i32* nocapture %b, i32 %n) nounwind uwtable readonly ssp {
    582   %1 = icmp sgt i32 %n, 0
    583   br i1 %1, label %.lr.ph, label %._crit_edge
    584 
    585 .lr.ph:                                           ; preds = %0
    586   %2 = sext i32 %n to i64
    587   br label %3
    588 
    589 ; <label>:3                                       ; preds = %.lr.ph, %3
    590   %indvars.iv = phi i64 [ %2, %.lr.ph ], [ %indvars.iv.next, %3 ]
    591   %a.02 = phi i32 [ 0, %.lr.ph ], [ %6, %3 ]
    592   %indvars.iv.next = add i64 %indvars.iv, -1
    593   %4 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv.next
    594   %5 = load i32, i32* %4, align 4
    595   %6 = add nsw i32 %5, %a.02
    596   %7 = trunc i64 %indvars.iv.next to i32
    597   %8 = icmp sgt i32 %7, 0
    598   br i1 %8, label %3, label %._crit_edge
    599 
    600 ._crit_edge:                                      ; preds = %3, %0
    601   %a.0.lcssa = phi i32 [ 0, %0 ], [ %6, %3 ]
    602   ret i32 %a.0.lcssa
    603 }
    604 
    605 ;CHECK-LABEL: @example23(
    606 ;CHECK: <4 x i32>
    607 ;CHECK: ret void
    608 define void @example23(i16* nocapture %src, i32* nocapture %dst) nounwind uwtable ssp {
    609   br label %1
    610 
    611 ; <label>:1                                       ; preds = %1, %0
    612   %.04 = phi i16* [ %src, %0 ], [ %2, %1 ]
    613   %.013 = phi i32* [ %dst, %0 ], [ %6, %1 ]
    614   %i.02 = phi i32 [ 0, %0 ], [ %7, %1 ]
    615   %2 = getelementptr inbounds i16, i16* %.04, i64 1
    616   %3 = load i16, i16* %.04, align 2
    617   %4 = zext i16 %3 to i32
    618   %5 = shl nuw nsw i32 %4, 7
    619   %6 = getelementptr inbounds i32, i32* %.013, i64 1
    620   store i32 %5, i32* %.013, align 4
    621   %7 = add nsw i32 %i.02, 1
    622   %exitcond = icmp eq i32 %7, 256
    623   br i1 %exitcond, label %8, label %1
    624 
    625 ; <label>:8                                       ; preds = %1
    626   ret void
    627 }
    628 
    629 ;CHECK-LABEL: @example24(
    630 ;CHECK: shufflevector <4 x i16>
    631 ;CHECK: ret void
    632 define void @example24(i16 signext %x, i16 signext %y) nounwind uwtable ssp {
    633   br label %1
    634 
    635 ; <label>:1                                       ; preds = %1, %0
    636   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
    637   %2 = getelementptr inbounds [1024 x float], [1024 x float]* @fa, i64 0, i64 %indvars.iv
    638   %3 = load float, float* %2, align 4
    639   %4 = getelementptr inbounds [1024 x float], [1024 x float]* @fb, i64 0, i64 %indvars.iv
    640   %5 = load float, float* %4, align 4
    641   %6 = fcmp olt float %3, %5
    642   %x.y = select i1 %6, i16 %x, i16 %y
    643   %7 = sext i16 %x.y to i32
    644   %8 = getelementptr inbounds [1024 x i32], [1024 x i32]* @ic, i64 0, i64 %indvars.iv
    645   store i32 %7, i32* %8, align 4
    646   %indvars.iv.next = add i64 %indvars.iv, 1
    647   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    648   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    649   br i1 %exitcond, label %9, label %1
    650 
    651 ; <label>:9                                       ; preds = %1
    652   ret void
    653 }
    654 
    655 ;CHECK-LABEL: @example25(
    656 ;CHECK: and <4 x i1>
    657 ;CHECK: zext <4 x i1>
    658 ;CHECK: ret void
    659 define void @example25() nounwind uwtable ssp {
    660   br label %1
    661 
    662 ; <label>:1                                       ; preds = %1, %0
    663   %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
    664   %2 = getelementptr inbounds [1024 x float], [1024 x float]* @da, i64 0, i64 %indvars.iv
    665   %3 = load float, float* %2, align 4
    666   %4 = getelementptr inbounds [1024 x float], [1024 x float]* @db, i64 0, i64 %indvars.iv
    667   %5 = load float, float* %4, align 4
    668   %6 = fcmp olt float %3, %5
    669   %7 = getelementptr inbounds [1024 x float], [1024 x float]* @dc, i64 0, i64 %indvars.iv
    670   %8 = load float, float* %7, align 4
    671   %9 = getelementptr inbounds [1024 x float], [1024 x float]* @dd, i64 0, i64 %indvars.iv
    672   %10 = load float, float* %9, align 4
    673   %11 = fcmp olt float %8, %10
    674   %12 = and i1 %6, %11
    675   %13 = zext i1 %12 to i32
    676   %14 = getelementptr inbounds [1024 x i32], [1024 x i32]* @dj, i64 0, i64 %indvars.iv
    677   store i32 %13, i32* %14, align 4
    678   %indvars.iv.next = add i64 %indvars.iv, 1
    679   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    680   %exitcond = icmp eq i32 %lftr.wideiv, 1024
    681   br i1 %exitcond, label %15, label %1
    682 
    683 ; <label>:15                                      ; preds = %1
    684   ret void
    685 }
    686 
    687