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