108 lines · plain
1; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -force-vector-width=4 -S -enable-if-conversion | FileCheck %s2 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"4 5; This is kernel11 from "LivermoreLoops". We can't vectorize it because we6; access both x[k] and x[k-1].7;8; void kernel11(ptr x, ptr y, int n) {9; for ( int k=1 ; k<n ; k++ )10; x[k] = x[k-1] + y[k];11; }12 13; CHECK-LABEL: @kernel11(14; CHECK-NOT: <4 x double>15; CHECK: ret16define i32 @kernel11(ptr %x, ptr %y, i32 %n) nounwind uwtable ssp {17 %1 = alloca ptr, align 818 %2 = alloca ptr, align 819 %3 = alloca i32, align 420 %k = alloca i32, align 421 store ptr %x, ptr %1, align 822 store ptr %y, ptr %2, align 823 store i32 %n, ptr %3, align 424 store i32 1, ptr %k, align 425 br label %426 27; <label>:4 ; preds = %25, %028 %5 = load i32, ptr %k, align 429 %6 = load i32, ptr %3, align 430 %7 = icmp slt i32 %5, %631 br i1 %7, label %8, label %2832 33; <label>:8 ; preds = %434 %9 = load i32, ptr %k, align 435 %10 = sub nsw i32 %9, 136 %11 = sext i32 %10 to i6437 %12 = load ptr, ptr %1, align 838 %13 = getelementptr inbounds double, ptr %12, i64 %1139 %14 = load double, ptr %13, align 840 %15 = load i32, ptr %k, align 441 %16 = sext i32 %15 to i6442 %17 = load ptr, ptr %2, align 843 %18 = getelementptr inbounds double, ptr %17, i64 %1644 %19 = load double, ptr %18, align 845 %20 = fadd double %14, %1946 %21 = load i32, ptr %k, align 447 %22 = sext i32 %21 to i6448 %23 = load ptr, ptr %1, align 849 %24 = getelementptr inbounds double, ptr %23, i64 %2250 store double %20, ptr %24, align 851 br label %2552 53; <label>:25 ; preds = %854 %26 = load i32, ptr %k, align 455 %27 = add nsw i32 %26, 156 store i32 %27, ptr %k, align 457 br label %458 59; <label>:28 ; preds = %460 ret i32 061}62 63 64; A[i*7] is scalarized, and the different scalars can in theory wrap65; around and overwrite other scalar elements. However we can still66; vectorize because we can version the loop to avoid this case.67;68; void foo(int *a) {69; for (int i=0; i<256; ++i) {70; int x = a[i*7];71; if (x>3)72; x = x*x+x*4;73; a[i*7] = x+3;74; }75; }76 77; CHECK-LABEL: @func2(78; CHECK: <4 x i32>79; CHECK: ret80define i32 @func2(ptr nocapture %a) nounwind uwtable ssp {81 br label %182 83; <label>:1 ; preds = %7, %084 %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %7 ]85 %2 = mul nsw i64 %indvars.iv, 786 %3 = getelementptr inbounds i32, ptr %a, i64 %287 %4 = load i32, ptr %3, align 488 %5 = icmp sgt i32 %4, 389 br i1 %5, label %6, label %790 91; <label>:6 ; preds = %192 %tmp = add i32 %4, 493 %tmp1 = mul i32 %tmp, %494 br label %795 96; <label>:7 ; preds = %6, %197 %x.0 = phi i32 [ %tmp1, %6 ], [ %4, %1 ]98 %8 = add nsw i32 %x.0, 399 store i32 %8, ptr %3, align 4100 %indvars.iv.next = add i64 %indvars.iv, 1101 %lftr.wideiv = trunc i64 %indvars.iv.next to i32102 %exitcond = icmp eq i32 %lftr.wideiv, 256103 br i1 %exitcond, label %9, label %1104 105; <label>:9 ; preds = %7106 ret i32 0107}108