brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 802ed14 Raw
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