Home | History | Annotate | Download | only in LoopVectorize
      1 ; RUN: opt -S -loop-vectorize < %s | FileCheck %s
      2 
      3 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"
      4 target triple = "x86_64-apple-macosx10.9.0"
      5 
      6 @a = global i32* null, align 8
      7 @b = global i32* null, align 8
      8 @c = global i32* null, align 8
      9 
     10 ; Don't create an exponetial IR for the edge masks needed when if-converting
     11 ; this code.
     12 
     13 ; PR16472
     14 
     15 ; CHECK-NOT: %6000000 =
     16 
     17 define void @_Z3fn4i(i32 %p1) {
     18 entry:
     19   %cmp88 = icmp sgt i32 %p1, 0
     20   br i1 %cmp88, label %for.body.lr.ph, label %for.end
     21 
     22 for.body.lr.ph:
     23   %0 = load i32** @b, align 8  %1 = load i32** @a, align 8  %2 = load i32** @c, align 8  br label %for.body
     24 
     25 for.body:
     26   %indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %_ZL3fn3ii.exit58 ]
     27   %arrayidx = getelementptr inbounds i32* %0, i64 %indvars.iv
     28   %3 = load i32* %arrayidx, align 4  %4 = trunc i64 %indvars.iv to i32
     29   %and.i = and i32 %4, 1
     30   %tobool.i.i = icmp eq i32 %and.i, 0
     31   br i1 %tobool.i.i, label %if.end.i, label %if.then.i
     32 
     33 if.then.i:
     34   %and.i.i = lshr i32 %3, 2
     35   %and.lobit.i.i = and i32 %and.i.i, 1
     36   %5 = xor i32 %and.lobit.i.i, 1
     37   %or.i.i = or i32 %5, %3
     38   %cmp.i = icmp sgt i32 %or.i.i, 0
     39   %conv.i = zext i1 %cmp.i to i32
     40   br label %if.end.i
     41 
     42 if.end.i:
     43   %tobool.i87 = phi i1 [ true, %if.then.i ], [ false, %for.body ]
     44   %p1.addr.0.i = phi i32 [ %conv.i, %if.then.i ], [ %3, %for.body ]
     45   %6 = trunc i64 %indvars.iv to i32
     46   %and1.i = and i32 %6, 7
     47   %tobool2.i = icmp eq i32 %and1.i, 0
     48   br i1 %tobool2.i, label %if.end7.i, label %if.then3.i
     49 
     50 if.then3.i:
     51   %p1.addr.0.lobit.i = lshr i32 %p1.addr.0.i, 31
     52   %and6.i = and i32 %p1.addr.0.i, 1
     53   %or.i = or i32 %p1.addr.0.lobit.i, %and6.i
     54   br label %if.end7.i
     55 
     56 if.end7.i:
     57   %p1.addr.1.i = phi i32 [ %or.i, %if.then3.i ], [ %p1.addr.0.i, %if.end.i ]
     58   br i1 %tobool.i87, label %if.then10.i, label %if.end13.i
     59 
     60 if.then10.i:
     61   %cmp11.i = icmp sgt i32 %p1.addr.1.i, 0
     62   %conv12.i = zext i1 %cmp11.i to i32
     63   br label %if.end13.i
     64 
     65 if.end13.i:
     66   %p1.addr.2.i = phi i32 [ %conv12.i, %if.then10.i ], [ %p1.addr.1.i, %if.end7.i ]
     67   br i1 %tobool.i.i, label %_Z3fn2iii.exit, label %if.then16.i
     68 
     69 if.then16.i:
     70   %and17.i = lshr i32 %p1.addr.2.i, 3
     71   %and17.lobit.i = and i32 %and17.i, 1
     72   br label %_Z3fn2iii.exit
     73 
     74 _Z3fn2iii.exit:
     75   %p1.addr.3.i = phi i32 [ %and17.lobit.i, %if.then16.i ], [ %p1.addr.2.i, %if.end13.i ]
     76   %7 = trunc i64 %indvars.iv to i32
     77   %shr.i = ashr i32 %7, 1
     78   %and.i18.i = and i32 %shr.i, 1
     79   %tobool.i19.i = icmp ne i32 %and.i18.i, 0
     80   br i1 %tobool.i19.i, label %if.then.i20.i, label %if.end.i.i
     81 
     82 if.then.i20.i:
     83   %cmp.i.i = icmp sgt i32 %p1.addr.3.i, 0
     84   %conv.i.i = zext i1 %cmp.i.i to i32
     85   br label %if.end.i.i
     86 
     87 if.end.i.i:
     88   %p1.addr.0.i21.i = phi i32 [ %conv.i.i, %if.then.i20.i ], [ %p1.addr.3.i, %_Z3fn2iii.exit ]
     89   %and1.i.i = and i32 %shr.i, 7
     90   %tobool2.i.i = icmp eq i32 %and1.i.i, 0
     91   br i1 %tobool2.i.i, label %if.end7.i.i, label %if.then3.i.i
     92 
     93 if.then3.i.i:
     94   %p1.addr.0.lobit.i.i = lshr i32 %p1.addr.0.i21.i, 31
     95   %and6.i.i = and i32 %p1.addr.0.i21.i, 1
     96   %or.i22.i = or i32 %p1.addr.0.lobit.i.i, %and6.i.i
     97   br label %if.end7.i.i
     98 
     99 if.end7.i.i:
    100   %p1.addr.1.i.i = phi i32 [ %or.i22.i, %if.then3.i.i ], [ %p1.addr.0.i21.i, %if.end.i.i ]
    101   br i1 %tobool.i19.i, label %if.then10.i.i, label %if.end13.i.i
    102 
    103 if.then10.i.i:
    104   %cmp11.i.i = icmp sgt i32 %p1.addr.1.i.i, 0
    105   %conv12.i.i = zext i1 %cmp11.i.i to i32
    106   br label %if.end13.i.i
    107 
    108 if.end13.i.i:
    109   %p1.addr.2.i.i = phi i32 [ %conv12.i.i, %if.then10.i.i ], [ %p1.addr.1.i.i, %if.end7.i.i ]
    110   %and14.i.i = and i32 %shr.i, 5
    111   %tobool15.i.i = icmp eq i32 %and14.i.i, 0
    112   br i1 %tobool15.i.i, label %_Z3fn2iii.exit.i, label %if.then16.i.i
    113 
    114 if.then16.i.i:
    115   %and17.i.i = lshr i32 %p1.addr.2.i.i, 3
    116   %and17.lobit.i.i = and i32 %and17.i.i, 1
    117   br label %_Z3fn2iii.exit.i
    118 
    119 _Z3fn2iii.exit.i:
    120   %p1.addr.3.i.i = phi i32 [ %and17.lobit.i.i, %if.then16.i.i ], [ %p1.addr.2.i.i, %if.end13.i.i ]
    121   %8 = trunc i64 %indvars.iv to i32
    122   %tobool.i11.i = icmp eq i32 %8, 0
    123   br i1 %tobool.i11.i, label %_ZL3fn3ii.exit, label %if.then.i15.i
    124 
    125 if.then.i15.i:
    126   %and.i12.i = lshr i32 %p1.addr.3.i.i, 2
    127   %and.lobit.i13.i = and i32 %and.i12.i, 1
    128   %9 = xor i32 %and.lobit.i13.i, 1
    129   %or.i14.i = or i32 %9, %p1.addr.3.i.i
    130   br label %_ZL3fn3ii.exit
    131 
    132 _ZL3fn3ii.exit:
    133   %p1.addr.0.i16.i = phi i32 [ %or.i14.i, %if.then.i15.i ], [ %p1.addr.3.i.i, %_Z3fn2iii.exit.i ]
    134   %arrayidx2 = getelementptr inbounds i32* %1, i64 %indvars.iv
    135   store i32 %p1.addr.0.i16.i, i32* %arrayidx2, align 4  %arrayidx4 = getelementptr inbounds i32* %0, i64 %indvars.iv
    136   %10 = load i32* %arrayidx4, align 4  br i1 %tobool.i.i, label %_Z3fn1ii.exit.i26, label %if.then.i.i21
    137 
    138 if.then.i.i21:
    139   %and.i.i18 = lshr i32 %10, 2
    140   %and.lobit.i.i19 = and i32 %and.i.i18, 1
    141   %11 = xor i32 %and.lobit.i.i19, 1
    142   %or.i.i20 = or i32 %11, %10
    143   br label %_Z3fn1ii.exit.i26
    144 
    145 _Z3fn1ii.exit.i26:
    146   %p1.addr.0.i.i22 = phi i32 [ %or.i.i20, %if.then.i.i21 ], [ %10, %_ZL3fn3ii.exit ]
    147   br i1 %tobool.i87, label %if.then.i63, label %if.end.i67
    148 
    149 if.then.i63:
    150   %cmp.i61 = icmp sgt i32 %p1.addr.0.i.i22, 0
    151   %conv.i62 = zext i1 %cmp.i61 to i32
    152   br label %if.end.i67
    153 
    154 if.end.i67:
    155   %p1.addr.0.i64 = phi i32 [ %conv.i62, %if.then.i63 ], [ %p1.addr.0.i.i22, %_Z3fn1ii.exit.i26 ]
    156   br i1 %tobool2.i, label %if.end7.i73, label %if.then3.i71
    157 
    158 if.then3.i71:
    159   %p1.addr.0.lobit.i68 = lshr i32 %p1.addr.0.i64, 31
    160   %and6.i69 = and i32 %p1.addr.0.i64, 1
    161   %or.i70 = or i32 %p1.addr.0.lobit.i68, %and6.i69
    162   br label %if.end7.i73
    163 
    164 if.end7.i73:
    165   %p1.addr.1.i72 = phi i32 [ %or.i70, %if.then3.i71 ], [ %p1.addr.0.i64, %if.end.i67 ]
    166   br i1 %tobool.i87, label %if.then10.i76, label %if.end13.i80
    167 
    168 if.then10.i76:
    169   %cmp11.i74 = icmp sgt i32 %p1.addr.1.i72, 0
    170   %conv12.i75 = zext i1 %cmp11.i74 to i32
    171   br label %if.end13.i80
    172 
    173 if.end13.i80:
    174   %p1.addr.2.i77 = phi i32 [ %conv12.i75, %if.then10.i76 ], [ %p1.addr.1.i72, %if.end7.i73 ]
    175   br i1 %tobool.i.i, label %_Z3fn2iii.exit85, label %if.then16.i83
    176 
    177 if.then16.i83:
    178   %and17.i81 = lshr i32 %p1.addr.2.i77, 3
    179   %and17.lobit.i82 = and i32 %and17.i81, 1
    180   br label %_Z3fn2iii.exit85
    181 
    182 _Z3fn2iii.exit85:
    183   %p1.addr.3.i84 = phi i32 [ %and17.lobit.i82, %if.then16.i83 ], [ %p1.addr.2.i77, %if.end13.i80 ]
    184   br i1 %tobool.i19.i, label %if.then.i20.i29, label %if.end.i.i33
    185 
    186 if.then.i20.i29:
    187   %cmp.i.i27 = icmp sgt i32 %p1.addr.3.i84, 0
    188   %conv.i.i28 = zext i1 %cmp.i.i27 to i32
    189   br label %if.end.i.i33
    190 
    191 if.end.i.i33:
    192   %p1.addr.0.i21.i30 = phi i32 [ %conv.i.i28, %if.then.i20.i29 ], [ %p1.addr.3.i84, %_Z3fn2iii.exit85 ]
    193   br i1 %tobool2.i.i, label %if.end7.i.i39, label %if.then3.i.i37
    194 
    195 if.then3.i.i37:
    196   %p1.addr.0.lobit.i.i34 = lshr i32 %p1.addr.0.i21.i30, 31
    197   %and6.i.i35 = and i32 %p1.addr.0.i21.i30, 1
    198   %or.i22.i36 = or i32 %p1.addr.0.lobit.i.i34, %and6.i.i35
    199   br label %if.end7.i.i39
    200 
    201 if.end7.i.i39:
    202   %p1.addr.1.i.i38 = phi i32 [ %or.i22.i36, %if.then3.i.i37 ], [ %p1.addr.0.i21.i30, %if.end.i.i33 ]
    203   br i1 %tobool.i19.i, label %if.then10.i.i42, label %if.end13.i.i46
    204 
    205 if.then10.i.i42:
    206   %cmp11.i.i40 = icmp sgt i32 %p1.addr.1.i.i38, 0
    207   %conv12.i.i41 = zext i1 %cmp11.i.i40 to i32
    208   br label %if.end13.i.i46
    209 
    210 if.end13.i.i46:
    211   %p1.addr.2.i.i43 = phi i32 [ %conv12.i.i41, %if.then10.i.i42 ], [ %p1.addr.1.i.i38, %if.end7.i.i39 ]
    212   br i1 %tobool15.i.i, label %_Z3fn2iii.exit.i52, label %if.then16.i.i49
    213 
    214 if.then16.i.i49:
    215   %and17.i.i47 = lshr i32 %p1.addr.2.i.i43, 3
    216   %and17.lobit.i.i48 = and i32 %and17.i.i47, 1
    217   br label %_Z3fn2iii.exit.i52
    218 
    219 _Z3fn2iii.exit.i52:
    220   %p1.addr.3.i.i50 = phi i32 [ %and17.lobit.i.i48, %if.then16.i.i49 ], [ %p1.addr.2.i.i43, %if.end13.i.i46 ]
    221   br i1 %tobool.i11.i, label %_ZL3fn3ii.exit58, label %if.then.i15.i56
    222 
    223 if.then.i15.i56:
    224   %and.i12.i53 = lshr i32 %p1.addr.3.i.i50, 2
    225   %and.lobit.i13.i54 = and i32 %and.i12.i53, 1
    226   %12 = xor i32 %and.lobit.i13.i54, 1
    227   %or.i14.i55 = or i32 %12, %p1.addr.3.i.i50
    228   br label %_ZL3fn3ii.exit58
    229 
    230 _ZL3fn3ii.exit58:
    231   %p1.addr.0.i16.i57 = phi i32 [ %or.i14.i55, %if.then.i15.i56 ], [ %p1.addr.3.i.i50, %_Z3fn2iii.exit.i52 ]
    232   %arrayidx7 = getelementptr inbounds i32* %2, i64 %indvars.iv
    233   store i32 %p1.addr.0.i16.i57, i32* %arrayidx7, align 4  %indvars.iv.next = add i64 %indvars.iv, 1
    234   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
    235   %exitcond = icmp ne i32 %lftr.wideiv, %p1
    236   br i1 %exitcond, label %for.body, label %for.cond.for.end_crit_edge
    237 
    238 for.cond.for.end_crit_edge:
    239   br label %for.end
    240 
    241 for.end:
    242   ret void
    243 }
    244