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