1; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -verify-machineinstrs \
2; RUN:   -aarch64-enable-atomic-cfg-tidy=0 -disable-cgp -disable-branch-fold \
3; RUN:   < %s | FileCheck %s
4
5;
6; Verify that we don't mess up vector comparisons in fast-isel.
7;
8
9define <2 x i32> @icmp_v2i32(<2 x i32> %a) {
10; CHECK-LABEL: icmp_v2i32:
11; CHECK:      ; %bb.0:
12; CHECK-NEXT:  cmeq.2s [[CMP:v[0-9]+]], v0, #0
13; CHECK-NEXT: ; %bb.1:
14; CHECK-NEXT:  movi.2s [[MASK:v[0-9]+]], #1
15; CHECK-NEXT:  and.8b v0, [[CMP]], [[MASK]]
16; CHECK-NEXT:  ret
17  %c = icmp eq <2 x i32> %a, zeroinitializer
18  br label %bb2
19bb2:
20  %z = zext <2 x i1> %c to <2 x i32>
21  ret <2 x i32> %z
22}
23
24define <2 x i32> @icmp_constfold_v2i32(<2 x i32> %a) {
25; CHECK-LABEL: icmp_constfold_v2i32:
26; CHECK:      ; %bb.0:
27; CHECK-NEXT:  movi d[[CMP:[0-9]+]], #0xffffffffffffffff
28; CHECK-NEXT: ; %bb.1:
29; CHECK-NEXT:  movi.2s [[MASK:v[0-9]+]], #1
30; CHECK-NEXT:  and.8b v0, v[[CMP]], [[MASK]]
31; CHECK-NEXT:  ret
32  %1 = icmp eq <2 x i32> %a, %a
33  br label %bb2
34bb2:
35  %2 = zext <2 x i1> %1 to <2 x i32>
36  ret <2 x i32> %2
37}
38
39define <4 x i32> @icmp_v4i32(<4 x i32> %a) {
40; CHECK-LABEL: icmp_v4i32:
41; CHECK:      ; %bb.0:
42; CHECK-NEXT:  cmeq.4s [[CMP:v[0-9]+]], v0, #0
43; CHECK-NEXT:  xtn.4h [[CMPV4I16:v[0-9]+]], [[CMP]]
44; CHECK-NEXT: ; %bb.1:
45; CHECK-NEXT:  movi.4h [[MASK:v[0-9]+]], #1
46; CHECK-NEXT:  and.8b [[ZEXT:v[0-9]+]], [[CMPV4I16]], [[MASK]]
47; CHECK-NEXT:  ushll.4s v0, [[ZEXT]], #0
48; CHECK-NEXT:  ret
49  %c = icmp eq <4 x i32> %a, zeroinitializer
50  br label %bb2
51bb2:
52  %z = zext <4 x i1> %c to <4 x i32>
53  ret <4 x i32> %z
54}
55
56define <4 x i32> @icmp_constfold_v4i32(<4 x i32> %a) {
57; CHECK-LABEL: icmp_constfold_v4i32:
58; CHECK:      ; %bb.0:
59; CHECK-NEXT:  movi d[[CMP:[0-9]+]], #0xffffffffffffffff
60; CHECK-NEXT: ; %bb.1:
61; CHECK-NEXT:  movi.4h [[MASK:v[0-9]+]], #1
62; CHECK-NEXT:  and.8b [[ZEXT:v[0-9]+]], v[[CMP]], [[MASK]]
63; CHECK-NEXT:  ushll.4s v0, [[ZEXT]], #0
64; CHECK-NEXT:  ret
65  %1 = icmp eq <4 x i32> %a, %a
66  br label %bb2
67bb2:
68  %2 = zext <4 x i1> %1 to <4 x i32>
69  ret <4 x i32> %2
70}
71
72define <16 x i8> @icmp_v16i8(<16 x i8> %a) {
73; CHECK-LABEL: icmp_v16i8:
74; CHECK:      ; %bb.0:
75; CHECK-NEXT:  cmeq.16b [[CMP:v[0-9]+]], v0, #0
76; CHECK-NEXT: ; %bb.1:
77; CHECK-NEXT:  movi.16b [[MASK:v[0-9]+]], #1
78; CHECK-NEXT:  and.16b v0, [[CMP]], [[MASK]]
79; CHECK-NEXT:  ret
80  %c = icmp eq <16 x i8> %a, zeroinitializer
81  br label %bb2
82bb2:
83  %z = zext <16 x i1> %c to <16 x i8>
84  ret <16 x i8> %z
85}
86
87define <16 x i8> @icmp_constfold_v16i8(<16 x i8> %a) {
88; CHECK-LABEL: icmp_constfold_v16i8:
89; CHECK:      ; %bb.0:
90; CHECK-NEXT:  movi.2d [[CMP:v[0-9]+]], #0xffffffffffffffff
91; CHECK-NEXT: ; %bb.1:
92; CHECK-NEXT:  movi.16b [[MASK:v[0-9]+]], #1
93; CHECK-NEXT:  and.16b v0, [[CMP]], [[MASK]]
94; CHECK-NEXT:  ret
95  %1 = icmp eq <16 x i8> %a, %a
96  br label %bb2
97bb2:
98  %2 = zext <16 x i1> %1 to <16 x i8>
99  ret <16 x i8> %2
100}
101