Remove unused function attributes.
[oota-llvm.git] / test / Transforms / SLPVectorizer / X86 / diamond.ll
1 ; RUN: opt < %s -basicaa -slp-vectorizer -dce -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | 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.8.0"
5
6 ; int foo(int * restrict B,  int * restrict A, int n, int m) {
7 ;   B[0] = n * A[0] + m * A[0];
8 ;   B[1] = n * A[1] + m * A[1];
9 ;   B[2] = n * A[2] + m * A[2];
10 ;   B[3] = n * A[3] + m * A[3];
11 ;   return 0;
12 ; }
13
14 ; CHECK: @foo
15 ; CHECK: load <4 x i32>
16 ; CHECK: mul <4 x i32>
17 ; CHECK: store <4 x i32>
18 ; CHECK: ret
19 define i32 @foo(i32* noalias nocapture %B, i32* noalias nocapture %A, i32 %n, i32 %m) #0 {
20 entry:
21   %0 = load i32* %A, align 4
22   %mul238 = add i32 %m, %n
23   %add = mul i32 %0, %mul238
24   store i32 %add, i32* %B, align 4
25   %arrayidx4 = getelementptr inbounds i32* %A, i64 1
26   %1 = load i32* %arrayidx4, align 4
27   %add8 = mul i32 %1, %mul238
28   %arrayidx9 = getelementptr inbounds i32* %B, i64 1
29   store i32 %add8, i32* %arrayidx9, align 4
30   %arrayidx10 = getelementptr inbounds i32* %A, i64 2
31   %2 = load i32* %arrayidx10, align 4
32   %add14 = mul i32 %2, %mul238
33   %arrayidx15 = getelementptr inbounds i32* %B, i64 2
34   store i32 %add14, i32* %arrayidx15, align 4
35   %arrayidx16 = getelementptr inbounds i32* %A, i64 3
36   %3 = load i32* %arrayidx16, align 4
37   %add20 = mul i32 %3, %mul238
38   %arrayidx21 = getelementptr inbounds i32* %B, i64 3
39   store i32 %add20, i32* %arrayidx21, align 4
40   ret i32 0
41 }
42
43
44 ; int foo_fail(int * restrict B,  int * restrict A, int n, int m) {
45 ;   B[0] = n * A[0] + m * A[0];
46 ;   B[1] = n * A[1] + m * A[1];
47 ;   B[2] = n * A[2] + m * A[2];
48 ;   B[3] = n * A[3] + m * A[3];
49 ;   return A[0];
50 ; }
51
52 ; CHECK: @foo_fail
53 ; CHECK-NOT: load <4 x i32>
54 ; CHECK: ret
55 define i32 @foo_fail(i32* noalias nocapture %B, i32* noalias nocapture %A, i32 %n, i32 %m) {
56 entry:
57   %0 = load i32* %A, align 4
58   %mul238 = add i32 %m, %n
59   %add = mul i32 %0, %mul238
60   store i32 %add, i32* %B, align 4
61   %arrayidx4 = getelementptr inbounds i32* %A, i64 1
62   %1 = load i32* %arrayidx4, align 4
63   %add8 = mul i32 %1, %mul238
64   %arrayidx9 = getelementptr inbounds i32* %B, i64 1
65   store i32 %add8, i32* %arrayidx9, align 4
66   %arrayidx10 = getelementptr inbounds i32* %A, i64 2
67   %2 = load i32* %arrayidx10, align 4
68   %add14 = mul i32 %2, %mul238
69   %arrayidx15 = getelementptr inbounds i32* %B, i64 2
70   store i32 %add14, i32* %arrayidx15, align 4
71   %arrayidx16 = getelementptr inbounds i32* %A, i64 3
72   %3 = load i32* %arrayidx16, align 4
73   %add20 = mul i32 %3, %mul238
74   %arrayidx21 = getelementptr inbounds i32* %B, i64 3
75   store i32 %add20, i32* %arrayidx21, align 4
76   ret i32 %0  ;<--------- This value has multiple users and can't be vectorized.
77 }
78