[LoopVectorizer] Refine loop vectorizer's register usage calculator by ignoring speci...
[oota-llvm.git] / test / Transforms / LoopVectorize / X86 / metadata-enable.ll
1 ; RUN: opt < %s -mcpu=corei7 -O1 -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=O1
2 ; RUN: opt < %s -mcpu=corei7 -O2 -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=O2
3 ; RUN: opt < %s -mcpu=corei7 -O3 -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=O3
4 ; RUN: opt < %s -mcpu=corei7 -Os -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=Os
5 ; RUN: opt < %s -mcpu=corei7 -Oz -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=Oz
6 ; RUN: opt < %s -mcpu=corei7 -O1 -vectorize-loops -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=O1VEC
7 ; RUN: opt < %s -mcpu=corei7 -Oz -vectorize-loops -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=OzVEC
8 ; RUN: opt < %s -mcpu=corei7 -O1 -loop-vectorize -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=O1VEC2
9 ; RUN: opt < %s -mcpu=corei7 -Oz -loop-vectorize -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=OzVEC2
10 ; RUN: opt < %s -mcpu=corei7 -O3 -disable-loop-vectorization -S -unroll-allow-partial=0 | FileCheck %s --check-prefix=O3DIS
11
12 ; This file tests the llvm.loop.vectorize.enable metadata forcing
13 ; vectorization even when optimization levels are too low, or when
14 ; vectorization is disabled.
15
16 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"
17 target triple = "x86_64-unknown-linux-gnu"
18
19 ; O1-LABEL: @enabled(
20 ; O1: store <4 x i32>
21 ; O1: ret i32
22 ; O2-LABEL: @enabled(
23 ; O2: store <4 x i32>
24 ; O2: ret i32
25 ; O3-LABEL: @enabled(
26 ; O3: store <4 x i32>
27 ; O3: ret i32
28 ; Pragma always wins!
29 ; O3DIS-LABEL: @enabled(
30 ; O3DIS: store <4 x i32>
31 ; O3DIS: ret i32
32 ; Os-LABEL: @enabled(
33 ; Os: store <4 x i32>
34 ; Os: ret i32
35 ; Oz-LABEL: @enabled(
36 ; Oz: store <4 x i32>
37 ; Oz: ret i32
38 ; O1VEC-LABEL: @enabled(
39 ; O1VEC: store <4 x i32>
40 ; O1VEC: ret i32
41 ; OzVEC-LABEL: @enabled(
42 ; OzVEC: store <4 x i32>
43 ; OzVEC: ret i32
44 ; O1VEC2-LABEL: @enabled(
45 ; O1VEC2: store <4 x i32>
46 ; O1VEC2: ret i32
47 ; OzVEC2-LABEL: @enabled(
48 ; OzVEC2: store <4 x i32>
49 ; OzVEC2: ret i32
50
51 define i32 @enabled(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32 %N) {
52 entry:
53   br label %for.body
54
55 for.body:                                         ; preds = %for.body, %entry
56   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
57   %arrayidx = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
58   %0 = load i32, i32* %arrayidx, align 4
59   %add = add nsw i32 %0, %N
60   %arrayidx2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
61   store i32 %add, i32* %arrayidx2, align 4
62   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
63   %exitcond = icmp eq i64 %indvars.iv.next, 64
64   br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !0
65
66 for.end:                                          ; preds = %for.body
67   %1 = load i32, i32* %a, align 4
68   ret i32 %1
69 }
70
71 ; O1-LABEL: @nopragma(
72 ; O1-NOT: store <4 x i32>
73 ; O1: ret i32
74 ; O2-LABEL: @nopragma(
75 ; O2: store <4 x i32>
76 ; O2: ret i32
77 ; O3-LABEL: @nopragma(
78 ; O3: store <4 x i32>
79 ; O3: ret i32
80 ; O3DIS-LABEL: @nopragma(
81 ; O3DIS-NOT: store <4 x i32>
82 ; O3DIS: ret i32
83 ; Os-LABEL: @nopragma(
84 ; Os: store <4 x i32>
85 ; Os: ret i32
86 ; Oz-LABEL: @nopragma(
87 ; Oz-NOT: store <4 x i32>
88 ; Oz: ret i32
89 ; O1VEC-LABEL: @nopragma(
90 ; O1VEC: store <4 x i32>
91 ; O1VEC: ret i32
92 ; OzVEC-LABEL: @nopragma(
93 ; OzVEC: store <4 x i32>
94 ; OzVEC: ret i32
95 ; O1VEC2-LABEL: @nopragma(
96 ; O1VEC2: store <4 x i32>
97 ; O1VEC2: ret i32
98 ; OzVEC2-LABEL: @nopragma(
99 ; OzVEC2: store <4 x i32>
100 ; OzVEC2: ret i32
101
102 define i32 @nopragma(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32 %N) {
103 entry:
104   br label %for.body
105
106 for.body:                                         ; preds = %for.body, %entry
107   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
108   %arrayidx = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
109   %0 = load i32, i32* %arrayidx, align 4
110   %add = add nsw i32 %0, %N
111   %arrayidx2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
112   store i32 %add, i32* %arrayidx2, align 4
113   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
114   %exitcond = icmp eq i64 %indvars.iv.next, 64
115   br i1 %exitcond, label %for.end, label %for.body
116
117 for.end:                                          ; preds = %for.body
118   %1 = load i32, i32* %a, align 4
119   ret i32 %1
120 }
121
122 ; O1-LABEL: @disabled(
123 ; O1-NOT: store <4 x i32>
124 ; O1: ret i32
125 ; O2-LABEL: @disabled(
126 ; O2-NOT: store <4 x i32>
127 ; O2: ret i32
128 ; O3-LABEL: @disabled(
129 ; O3-NOT: store <4 x i32>
130 ; O3: ret i32
131 ; O3DIS-LABEL: @disabled(
132 ; O3DIS-NOT: store <4 x i32>
133 ; O3DIS: ret i32
134 ; Os-LABEL: @disabled(
135 ; Os-NOT: store <4 x i32>
136 ; Os: ret i32
137 ; Oz-LABEL: @disabled(
138 ; Oz-NOT: store <4 x i32>
139 ; Oz: ret i32
140 ; O1VEC-LABEL: @disabled(
141 ; O1VEC-NOT: store <4 x i32>
142 ; O1VEC: ret i32
143 ; OzVEC-LABEL: @disabled(
144 ; OzVEC-NOT: store <4 x i32>
145 ; OzVEC: ret i32
146 ; O1VEC2-LABEL: @disabled(
147 ; O1VEC2-NOT: store <4 x i32>
148 ; O1VEC2: ret i32
149 ; OzVEC2-LABEL: @disabled(
150 ; OzVEC2-NOT: store <4 x i32>
151 ; OzVEC2: ret i32
152
153 define i32 @disabled(i32* noalias nocapture %a, i32* noalias nocapture readonly %b, i32 %N) {
154 entry:
155   br label %for.body
156
157 for.body:                                         ; preds = %for.body, %entry
158   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
159   %arrayidx = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
160   %0 = load i32, i32* %arrayidx, align 4
161   %add = add nsw i32 %0, %N
162   %arrayidx2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
163   store i32 %add, i32* %arrayidx2, align 4
164   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
165   %exitcond = icmp eq i64 %indvars.iv.next, 64
166   br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !2
167
168 for.end:                                          ; preds = %for.body
169   %1 = load i32, i32* %a, align 4
170   ret i32 %1
171 }
172
173 !0 = !{!0, !1}
174 !1 = !{!"llvm.loop.vectorize.enable", i1 1}
175 !2 = !{!2, !3}
176 !3 = !{!"llvm.loop.vectorize.enable", i1 0}