xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-x86-hadd-hsub.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1b22fa909Smskamp; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2b22fa909Smskamp; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3b22fa909Smskamp
4b22fa909Smskampdefine <4 x i1> @hadd_and_eq_v4i32(<4 x i32> %x, <4 x i32> %y) {
5b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_and_eq_v4i32(
6b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
7b22fa909Smskamp; CHECK-NEXT:  entry:
8b22fa909Smskamp; CHECK-NEXT:    ret <4 x i1> zeroinitializer
9b22fa909Smskamp;
10b22fa909Smskampentry:
11b22fa909Smskamp  %and1 = and <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3>
12b22fa909Smskamp  %and2 = and <4 x i32> %y, <i32 3, i32 3, i32 3, i32 3>
13b22fa909Smskamp  %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2)
14b22fa909Smskamp  %andr = and <4 x i32> %hadd, <i32 -8, i32 -8, i32 -8, i32 -8>
15b22fa909Smskamp  %ret = icmp eq <4 x i32> %andr, <i32 3, i32 4, i32 5, i32 6>
16b22fa909Smskamp  ret <4 x i1> %ret
17b22fa909Smskamp}
18b22fa909Smskamp
19b22fa909Smskampdefine <8 x i1> @hadd_and_eq_v8i16(<8 x i16> %x, <8 x i16> %y) {
20b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hadd_and_eq_v8i16(
21b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) {
22b22fa909Smskamp; CHECK-NEXT:  entry:
23b22fa909Smskamp; CHECK-NEXT:    ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>
24b22fa909Smskamp;
25b22fa909Smskampentry:
26b22fa909Smskamp  %and1 = and <8 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
27b22fa909Smskamp  %and2 = and <8 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
28b22fa909Smskamp  %hadd = tail call <8 x i16> @llvm.x86.ssse3.phadd.w.128(<8 x i16> %and1, <8 x i16> %and2)
29b22fa909Smskamp  %andr = and <8 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>
30b22fa909Smskamp  %ret = icmp eq <8 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0>
31b22fa909Smskamp  ret <8 x i1> %ret
32b22fa909Smskamp}
33b22fa909Smskamp
34b22fa909Smskampdefine <8 x i1> @hadd_and_eq_v8i16_sat(<8 x i16> %x, <8 x i16> %y) {
35b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hadd_and_eq_v8i16_sat(
36b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) {
37b22fa909Smskamp; CHECK-NEXT:  entry:
38b22fa909Smskamp; CHECK-NEXT:    ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>
39b22fa909Smskamp;
40b22fa909Smskampentry:
41b22fa909Smskamp  %and1 = and <8 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
42b22fa909Smskamp  %and2 = and <8 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
43b22fa909Smskamp  %hadd = tail call <8 x i16> @llvm.x86.ssse3.phadd.sw.128(<8 x i16> %and1, <8 x i16> %and2)
44b22fa909Smskamp  %andr = and <8 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>
45b22fa909Smskamp  %ret = icmp eq <8 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0>
46b22fa909Smskamp  ret <8 x i1> %ret
47b22fa909Smskamp}
48b22fa909Smskamp
49b22fa909Smskampdefine <8 x i1> @hadd_and_eq_v8i32(<8 x i32> %x, <8 x i32> %y) {
50b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hadd_and_eq_v8i32(
51b22fa909Smskamp; CHECK-SAME: <8 x i32> [[X:%.*]], <8 x i32> [[Y:%.*]]) {
52b22fa909Smskamp; CHECK-NEXT:  entry:
53b22fa909Smskamp; CHECK-NEXT:    ret <8 x i1> zeroinitializer
54b22fa909Smskamp;
55b22fa909Smskampentry:
56b22fa909Smskamp  %and1 = and <8 x i32> %x, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
57b22fa909Smskamp  %and2 = and <8 x i32> %y, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
58b22fa909Smskamp  %hadd = tail call <8 x i32> @llvm.x86.avx2.phadd.d(<8 x i32> %and1, <8 x i32> %and2)
59b22fa909Smskamp  %andr = and <8 x i32> %hadd, <i32 -8, i32 -8, i32 -8, i32 -8, i32 -8, i32 -8, i32 -8, i32 -8>
60b22fa909Smskamp  %ret = icmp eq <8 x i32> %andr, <i32 3, i32 4, i32 5, i32 6, i32 3, i32 4, i32 5, i32 6>
61b22fa909Smskamp  ret <8 x i1> %ret
62b22fa909Smskamp}
63b22fa909Smskamp
64b22fa909Smskampdefine <16 x i1> @hadd_and_eq_v16i16(<16 x i16> %x, <16 x i16> %y) {
65b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hadd_and_eq_v16i16(
66b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) {
67b22fa909Smskamp; CHECK-NEXT:  entry:
68b22fa909Smskamp; CHECK-NEXT:    ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>
69b22fa909Smskamp;
70b22fa909Smskampentry:
71b22fa909Smskamp  %and1 = and <16 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
72b22fa909Smskamp  %and2 = and <16 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
73b22fa909Smskamp  %hadd = tail call <16 x i16> @llvm.x86.avx2.phadd.w(<16 x i16> %and1, <16 x i16> %and2)
74b22fa909Smskamp  %andr = and <16 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>
75b22fa909Smskamp  %ret = icmp eq <16 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0>
76b22fa909Smskamp  ret <16 x i1> %ret
77b22fa909Smskamp}
78b22fa909Smskamp
79b22fa909Smskampdefine <16 x i1> @hadd_and_eq_v16i16_sat(<16 x i16> %x, <16 x i16> %y) {
80b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hadd_and_eq_v16i16_sat(
81b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) {
82b22fa909Smskamp; CHECK-NEXT:  entry:
83b22fa909Smskamp; CHECK-NEXT:    ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>
84b22fa909Smskamp;
85b22fa909Smskampentry:
86b22fa909Smskamp  %and1 = and <16 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
87b22fa909Smskamp  %and2 = and <16 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
88b22fa909Smskamp  %hadd = tail call <16 x i16> @llvm.x86.avx2.phadd.sw(<16 x i16> %and1, <16 x i16> %and2)
89b22fa909Smskamp  %andr = and <16 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8>
90b22fa909Smskamp  %ret = icmp eq <16 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0>
91b22fa909Smskamp  ret <16 x i1> %ret
92b22fa909Smskamp}
93b22fa909Smskamp
94b22fa909Smskampdefine <4 x i1> @hsub_trunc_eq_v4i32(<4 x i32> %x, <4 x i32> %y) {
95b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hsub_trunc_eq_v4i32(
96b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
97b22fa909Smskamp; CHECK-NEXT:  entry:
98b22fa909Smskamp; CHECK-NEXT:    ret <4 x i1> zeroinitializer
99b22fa909Smskamp;
100b22fa909Smskampentry:
101b22fa909Smskamp  %or1 = or <4 x i32> %x, <i32 65535, i32 65535, i32 65535, i32 65535>
102b22fa909Smskamp  %or2 = or <4 x i32> %y, <i32 65535, i32 65535, i32 65535, i32 65535>
103b22fa909Smskamp  %hsub = tail call <4 x i32> @llvm.x86.ssse3.phsub.d.128(<4 x i32> %or1, <4 x i32> %or2)
104b22fa909Smskamp  %conv = trunc <4 x i32> %hsub to <4 x i16>
105b22fa909Smskamp  %ret = icmp eq <4 x i16> %conv, <i16 3, i16 4, i16 5, i16 6>
106b22fa909Smskamp  ret <4 x i1> %ret
107b22fa909Smskamp}
108b22fa909Smskamp
109b22fa909Smskampdefine <8 x i1> @hsub_trunc_eq_v8i16(<8 x i16> %x, <8 x i16> %y) {
110b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hsub_trunc_eq_v8i16(
111b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) {
112b22fa909Smskamp; CHECK-NEXT:  entry:
113b22fa909Smskamp; CHECK-NEXT:    ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>
114b22fa909Smskamp;
115b22fa909Smskampentry:
116b22fa909Smskamp  %or1 = or <8 x i16> %x, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
117b22fa909Smskamp  %or2 = or <8 x i16> %y, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
118b22fa909Smskamp  %hsub = tail call <8 x i16> @llvm.x86.ssse3.phsub.w.128(<8 x i16> %or1, <8 x i16> %or2)
119b22fa909Smskamp  %conv = trunc <8 x i16> %hsub to <8 x i8>
120b22fa909Smskamp  %ret = icmp eq <8 x i8> %conv, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 0>
121b22fa909Smskamp  ret <8 x i1> %ret
122b22fa909Smskamp}
123b22fa909Smskamp
124b22fa909Smskampdefine <8 x i1> @hsub_and_eq_v8i16_sat(<8 x i16> %x, <8 x i16> %y) {
125b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hsub_and_eq_v8i16_sat(
126b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) {
127b22fa909Smskamp; CHECK-NEXT:  entry:
128*38fffa63SPaul Walker; CHECK-NEXT:    ret <8 x i1> splat (i1 true)
129b22fa909Smskamp;
130b22fa909Smskampentry:
131b22fa909Smskamp  %or1 = or <8 x i16> %x, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0>
132b22fa909Smskamp  %or2 = or <8 x i16> %y, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0>
133b22fa909Smskamp  %and1 = and <8 x i16> %or1, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3>
134b22fa909Smskamp  %and2 = and <8 x i16> %or2, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3>
135b22fa909Smskamp  %hsub = tail call <8 x i16> @llvm.x86.ssse3.phsub.sw.128(<8 x i16> %and1, <8 x i16> %and2)
136b22fa909Smskamp  %ret = icmp sle <8 x i16> %hsub, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
137b22fa909Smskamp  ret <8 x i1> %ret
138b22fa909Smskamp}
139b22fa909Smskamp
140b22fa909Smskampdefine <8 x i1> @hsub_trunc_eq_v8i32(<8 x i32> %x, <8 x i32> %y) {
141b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hsub_trunc_eq_v8i32(
142b22fa909Smskamp; CHECK-SAME: <8 x i32> [[X:%.*]], <8 x i32> [[Y:%.*]]) {
143b22fa909Smskamp; CHECK-NEXT:  entry:
144b22fa909Smskamp; CHECK-NEXT:    ret <8 x i1> zeroinitializer
145b22fa909Smskamp;
146b22fa909Smskampentry:
147b22fa909Smskamp  %or1 = or <8 x i32> %x, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
148b22fa909Smskamp  %or2 = or <8 x i32> %y, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
149b22fa909Smskamp  %hsub = tail call <8 x i32> @llvm.x86.avx2.phsub.d(<8 x i32> %or1, <8 x i32> %or2)
150b22fa909Smskamp  %conv = trunc <8 x i32> %hsub to <8 x i16>
151b22fa909Smskamp  %ret = icmp eq <8 x i16> %conv, <i16 3, i16 4, i16 5, i16 6, i16 3, i16 4, i16 5, i16 6>
152b22fa909Smskamp  ret <8 x i1> %ret
153b22fa909Smskamp}
154b22fa909Smskamp
155b22fa909Smskampdefine <16 x i1> @hsub_trunc_eq_v16i16(<16 x i16> %x, <16 x i16> %y) {
156b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hsub_trunc_eq_v16i16(
157b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) {
158b22fa909Smskamp; CHECK-NEXT:  entry:
159b22fa909Smskamp; CHECK-NEXT:    ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>
160b22fa909Smskamp;
161b22fa909Smskampentry:
162b22fa909Smskamp  %or1 = or <16 x i16> %x, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
163b22fa909Smskamp  %or2 = or <16 x i16> %y, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
164b22fa909Smskamp  %hsub = tail call <16 x i16> @llvm.x86.avx2.phsub.w(<16 x i16> %or1, <16 x i16> %or2)
165b22fa909Smskamp  %conv = trunc <16 x i16> %hsub to <16 x i8>
166b22fa909Smskamp  %ret = icmp eq <16 x i8> %conv, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 0>
167b22fa909Smskamp  ret <16 x i1> %ret
168b22fa909Smskamp}
169b22fa909Smskamp
170b22fa909Smskampdefine <16 x i1> @hsub_and_eq_v16i16_sat(<16 x i16> %x, <16 x i16> %y) {
171b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hsub_and_eq_v16i16_sat(
172b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) {
173b22fa909Smskamp; CHECK-NEXT:  entry:
174*38fffa63SPaul Walker; CHECK-NEXT:    ret <16 x i1> splat (i1 true)
175b22fa909Smskamp;
176b22fa909Smskampentry:
177b22fa909Smskamp  %or1 = or <16 x i16> %x, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0>
178b22fa909Smskamp  %or2 = or <16 x i16> %y, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0>
179b22fa909Smskamp  %and1 = and <16 x i16> %or1, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3>
180b22fa909Smskamp  %and2 = and <16 x i16> %or2, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3>
181b22fa909Smskamp  %hsub = tail call <16 x i16> @llvm.x86.avx2.phsub.sw(<16 x i16> %and1, <16 x i16> %and2)
182b22fa909Smskamp  %ret = icmp sle <16 x i16> %hsub, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
183b22fa909Smskamp  ret <16 x i1> %ret
184b22fa909Smskamp}
185b22fa909Smskamp
186b22fa909Smskampdefine <4 x i1> @hadd_shuffle_2st_v4i32(<4 x i32> %x, <4 x i32> %y) {
187b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_2st_v4i32(
188b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
189b22fa909Smskamp; CHECK-NEXT:  entry:
190*38fffa63SPaul Walker; CHECK-NEXT:    ret <4 x i1> splat (i1 true)
191b22fa909Smskamp;
192b22fa909Smskampentry:
193b22fa909Smskamp  %and1 = and <4 x i32> %x, <i32 -1, i32 -1, i32 3, i32 3>
194b22fa909Smskamp  %and2 = and <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1>
195b22fa909Smskamp  %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2)
196b22fa909Smskamp  %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 1, i32 5, i32 6>
197b22fa909Smskamp  %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8>
198b22fa909Smskamp  ret <4 x i1> %ret
199b22fa909Smskamp}
200b22fa909Smskamp
201b22fa909Smskampdefine <4 x i1> @hadd_shuffle_4th_v4i32(<4 x i32> %x, <4 x i32> %y) {
202b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_4th_v4i32(
203b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
204b22fa909Smskamp; CHECK-NEXT:  entry:
205*38fffa63SPaul Walker; CHECK-NEXT:    ret <4 x i1> splat (i1 true)
206b22fa909Smskamp;
207b22fa909Smskampentry:
208b22fa909Smskamp  %and1 = and <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1>
209b22fa909Smskamp  %and2 = and <4 x i32> %y, <i32 -1, i32 -1, i32 3, i32 3>
210b22fa909Smskamp  %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2)
211b22fa909Smskamp  %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 3>
212b22fa909Smskamp  %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8>
213b22fa909Smskamp  ret <4 x i1> %ret
214b22fa909Smskamp}
215b22fa909Smskamp
216b22fa909Smskampdefine <4 x i1> @hadd_shuffle_2st_negative_v4i32(<4 x i32> %x, <4 x i32> %y) {
217b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_2st_negative_v4i32(
218b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
219b22fa909Smskamp; CHECK-NEXT:  entry:
220b22fa909Smskamp; CHECK-NEXT:    [[TMP0:%.*]] = and <4 x i32> [[X]], <i32 3, i32 3, i32 -1, i32 -1>
221*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP1:%.*]] = and <4 x i32> [[Y]], splat (i32 3)
222b22fa909Smskamp; CHECK-NEXT:    [[TMP2:%.*]] = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> [[TMP0]], <4 x i32> [[TMP1]])
223b22fa909Smskamp; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> <i32 0, i32 0, i32 0, i32 poison>, <4 x i32> <i32 4, i32 1, i32 5, i32 6>
224*38fffa63SPaul Walker; CHECK-NEXT:    [[RET:%.*]] = icmp ne <4 x i32> [[TMP3]], splat (i32 8)
225b22fa909Smskamp; CHECK-NEXT:    ret <4 x i1> [[RET]]
226b22fa909Smskamp;
227b22fa909Smskampentry:
228b22fa909Smskamp  %and1 = and <4 x i32> %x, <i32 3, i32 3, i32 -1, i32 -1>
229b22fa909Smskamp  %and2 = and <4 x i32> %y, <i32 3, i32 3, i32 3, i32 3>
230b22fa909Smskamp  %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2)
231b22fa909Smskamp  %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 1, i32 5, i32 6>
232b22fa909Smskamp  %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8>
233b22fa909Smskamp  ret <4 x i1> %ret
234b22fa909Smskamp}
235b22fa909Smskamp
236b22fa909Smskampdefine <4 x i1> @hadd_shuffle_4th_negative_v4i32(<4 x i32> %x, <4 x i32> %y) {
237b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_4th_negative_v4i32(
238b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) {
239b22fa909Smskamp; CHECK-NEXT:  entry:
240*38fffa63SPaul Walker; CHECK-NEXT:    [[TMP0:%.*]] = and <4 x i32> [[X]], splat (i32 3)
241b22fa909Smskamp; CHECK-NEXT:    [[TMP1:%.*]] = and <4 x i32> [[Y]], <i32 3, i32 3, i32 -1, i32 -1>
242b22fa909Smskamp; CHECK-NEXT:    [[TMP2:%.*]] = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> [[TMP0]], <4 x i32> [[TMP1]])
243b22fa909Smskamp; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i32> <i32 0, i32 0, i32 0, i32 poison>, <4 x i32> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>
244*38fffa63SPaul Walker; CHECK-NEXT:    [[RET:%.*]] = icmp ne <4 x i32> [[TMP3]], splat (i32 8)
245b22fa909Smskamp; CHECK-NEXT:    ret <4 x i1> [[RET]]
246b22fa909Smskamp;
247b22fa909Smskampentry:
248b22fa909Smskamp  %and1 = and <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3>
249b22fa909Smskamp  %and2 = and <4 x i32> %y, <i32 3, i32 3, i32 -1, i32 -1>
250b22fa909Smskamp  %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2)
251b22fa909Smskamp  %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 3>
252b22fa909Smskamp  %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8>
253b22fa909Smskamp  ret <4 x i1> %ret
254b22fa909Smskamp}
255