1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
2 ; Make sure that ARM backend with NEON handles vselect.
4 define void @vmax_v4i32(<4 x i32>* %m, <4 x i32> %a, <4 x i32> %b) {
5 ; CHECK: vcgt.s32 [[QR:q[0-9]+]], [[Q1:q[0-9]+]], [[Q2:q[0-9]+]]
6 ; CHECK: vbsl [[QR]], [[Q1]], [[Q2]]
7 %cmpres = icmp sgt <4 x i32> %a, %b
8 %maxres = select <4 x i1> %cmpres, <4 x i32> %a, <4 x i32> %b
9 store <4 x i32> %maxres, <4 x i32>* %m
13 ; We adjusted the cost model of the following selects. When we improve code
14 ; lowering we also need to adjust the cost.
15 ; RUN: opt < %s -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -march=arm -mcpu=cortex-a8 | FileCheck %s --check-prefix=COST
19 define void @func_blend3(%T0_3* %loadaddr, %T0_3* %loadaddr2,
20 %T1_3* %blend, %T0_3* %storeaddr) {
26 %v0 = load %T0_3* %loadaddr
27 %v1 = load %T0_3* %loadaddr2
28 %c = load %T1_3* %blend
30 ; COST: cost of 10 {{.*}} select
31 %r = select %T1_3 %c, %T0_3 %v0, %T0_3 %v1
32 store %T0_3 %r, %T0_3* %storeaddr
38 define void @func_blend4(%T0_4* %loadaddr, %T0_4* %loadaddr2,
39 %T1_4* %blend, %T0_4* %storeaddr) {
40 %v0 = load %T0_4* %loadaddr
41 %v1 = load %T0_4* %loadaddr2
42 %c = load %T1_4* %blend
49 ; COST: cost of 17 {{.*}} select
50 %r = select %T1_4 %c, %T0_4 %v0, %T0_4 %v1
51 store %T0_4 %r, %T0_4* %storeaddr
54 %T0_5 = type <16 x i8>
55 %T1_5 = type <16 x i1>
57 define void @func_blend5(%T0_5* %loadaddr, %T0_5* %loadaddr2,
58 %T1_5* %blend, %T0_5* %storeaddr) {
59 %v0 = load %T0_5* %loadaddr
60 %v1 = load %T0_5* %loadaddr2
61 %c = load %T1_5* %blend
68 ; COST: cost of 33 {{.*}} select
69 %r = select %T1_5 %c, %T0_5 %v0, %T0_5 %v1
70 store %T0_5 %r, %T0_5* %storeaddr
73 %T0_8 = type <4 x i16>
76 define void @func_blend8(%T0_8* %loadaddr, %T0_8* %loadaddr2,
77 %T1_8* %blend, %T0_8* %storeaddr) {
78 %v0 = load %T0_8* %loadaddr
79 %v1 = load %T0_8* %loadaddr2
80 %c = load %T1_8* %blend
87 ; COST: cost of 9 {{.*}} select
88 %r = select %T1_8 %c, %T0_8 %v0, %T0_8 %v1
89 store %T0_8 %r, %T0_8* %storeaddr
92 %T0_9 = type <8 x i16>
95 define void @func_blend9(%T0_9* %loadaddr, %T0_9* %loadaddr2,
96 %T1_9* %blend, %T0_9* %storeaddr) {
97 %v0 = load %T0_9* %loadaddr
98 %v1 = load %T0_9* %loadaddr2
99 %c = load %T1_9* %blend
106 ; COST: cost of 17 {{.*}} select
107 %r = select %T1_9 %c, %T0_9 %v0, %T0_9 %v1
108 store %T0_9 %r, %T0_9* %storeaddr
111 %T0_10 = type <16 x i16>
112 %T1_10 = type <16 x i1>
113 ; CHECK: func_blend10:
114 define void @func_blend10(%T0_10* %loadaddr, %T0_10* %loadaddr2,
115 %T1_10* %blend, %T0_10* %storeaddr) {
116 %v0 = load %T0_10* %loadaddr
117 %v1 = load %T0_10* %loadaddr2
118 %c = load %T1_10* %blend
125 ; COST: cost of 40 {{.*}} select
126 %r = select %T1_10 %c, %T0_10 %v0, %T0_10 %v1
127 store %T0_10 %r, %T0_10* %storeaddr
130 %T0_14 = type <8 x i32>
131 %T1_14 = type <8 x i1>
132 ; CHECK: func_blend14:
133 define void @func_blend14(%T0_14* %loadaddr, %T0_14* %loadaddr2,
134 %T1_14* %blend, %T0_14* %storeaddr) {
135 %v0 = load %T0_14* %loadaddr
136 %v1 = load %T0_14* %loadaddr2
137 %c = load %T1_14* %blend
143 ; COST: cost of 41 {{.*}} select
144 %r = select %T1_14 %c, %T0_14 %v0, %T0_14 %v1
145 store %T0_14 %r, %T0_14* %storeaddr
148 %T0_15 = type <16 x i32>
149 %T1_15 = type <16 x i1>
150 ; CHECK: func_blend15:
151 define void @func_blend15(%T0_15* %loadaddr, %T0_15* %loadaddr2,
152 %T1_15* %blend, %T0_15* %storeaddr) {
153 %v0 = load %T0_15* %loadaddr
154 %v1 = load %T0_15* %loadaddr2
155 %c = load %T1_15* %blend
161 ; COST: cost of 82 {{.*}} select
162 %r = select %T1_15 %c, %T0_15 %v0, %T0_15 %v1
163 store %T0_15 %r, %T0_15* %storeaddr
166 %T0_18 = type <4 x i64>
167 %T1_18 = type <4 x i1>
168 ; CHECK: func_blend18:
169 define void @func_blend18(%T0_18* %loadaddr, %T0_18* %loadaddr2,
170 %T1_18* %blend, %T0_18* %storeaddr) {
171 %v0 = load %T0_18* %loadaddr
172 %v1 = load %T0_18* %loadaddr2
173 %c = load %T1_18* %blend
179 ; COST: cost of 19 {{.*}} select
180 %r = select %T1_18 %c, %T0_18 %v0, %T0_18 %v1
181 store %T0_18 %r, %T0_18* %storeaddr
184 %T0_19 = type <8 x i64>
185 %T1_19 = type <8 x i1>
186 ; CHECK: func_blend19:
187 define void @func_blend19(%T0_19* %loadaddr, %T0_19* %loadaddr2,
188 %T1_19* %blend, %T0_19* %storeaddr) {
189 %v0 = load %T0_19* %loadaddr
190 %v1 = load %T0_19* %loadaddr2
191 %c = load %T1_19* %blend
197 ; COST: cost of 50 {{.*}} select
198 %r = select %T1_19 %c, %T0_19 %v0, %T0_19 %v1
199 store %T0_19 %r, %T0_19* %storeaddr
202 %T0_20 = type <16 x i64>
203 %T1_20 = type <16 x i1>
204 ; CHECK: func_blend20:
205 define void @func_blend20(%T0_20* %loadaddr, %T0_20* %loadaddr2,
206 %T1_20* %blend, %T0_20* %storeaddr) {
207 %v0 = load %T0_20* %loadaddr
208 %v1 = load %T0_20* %loadaddr2
209 %c = load %T1_20* %blend
215 ; COST: cost of 100 {{.*}} select
216 %r = select %T1_20 %c, %T0_20 %v0, %T0_20 %v1
217 store %T0_20 %r, %T0_20* %storeaddr