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