[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / GlobalISel / legalize-add-v256.mir
blob98b38514b7efb4177e5c5e32183fba136ff3e1ba
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+sse2 -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NOT_AVX2 --check-prefix=SSE2
3 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx  -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=NOT_AVX2 --check-prefix=AVX1
4 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx2 -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX2
6 --- |
7   define void @test_add_v32i8() {
8     %ret = add <32 x i8> undef, undef
9     ret void
10   }
12   define void @test_add_v16i16() {
13     %ret = add <16 x i16> undef, undef
14     ret void
15   }
17   define void @test_add_v8i32() {
18     %ret = add <8 x i32> undef, undef
19     ret void
20   }
22   define void @test_add_v4i64() {
23     %ret = add <4 x i64> undef, undef
24     ret void
25   }
27 ...
28 ---
29 name:            test_add_v32i8
30 alignment:       16
31 legalized:       false
32 regBankSelected: false
33 registers:
34   - { id: 0, class: _ }
35   - { id: 1, class: _ }
36   - { id: 2, class: _ }
37 body:             |
38   bb.1 (%ir-block.0):
39     liveins: $ymm0, $ymm1
40     ; SSE2-LABEL: name: test_add_v32i8
41     ; SSE2: [[DEF:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF
42     ; SSE2: [[DEF1:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF
43     ; SSE2: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF]](<32 x s8>)
44     ; SSE2: [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF1]](<32 x s8>)
45     ; SSE2: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV2]]
46     ; SSE2: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV3]]
47     ; SSE2: [[CONCAT_VECTORS:%[0-9]+]]:_(<32 x s8>) = G_CONCAT_VECTORS [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>)
48     ; SSE2: $ymm0 = COPY [[CONCAT_VECTORS]](<32 x s8>)
49     ; SSE2: RET 0
50     ; AVX1-LABEL: name: test_add_v32i8
51     ; AVX1: [[DEF:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF
52     ; AVX1: [[DEF1:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF
53     ; AVX1: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF]](<32 x s8>)
54     ; AVX1: [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF1]](<32 x s8>)
55     ; AVX1: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV2]]
56     ; AVX1: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV3]]
57     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<32 x s8>) = G_CONCAT_VECTORS [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>)
58     ; AVX1: $ymm0 = COPY [[CONCAT_VECTORS]](<32 x s8>)
59     ; AVX1: RET 0
60     ; AVX2-LABEL: name: test_add_v32i8
61     ; AVX2: [[DEF:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF
62     ; AVX2: [[DEF1:%[0-9]+]]:_(<32 x s8>) = IMPLICIT_DEF
63     ; AVX2: [[ADD:%[0-9]+]]:_(<32 x s8>) = G_ADD [[DEF]], [[DEF1]]
64     ; AVX2: $ymm0 = COPY [[ADD]](<32 x s8>)
65     ; AVX2: RET 0
66     %0(<32 x s8>) = IMPLICIT_DEF
67     %1(<32 x s8>) = IMPLICIT_DEF
68     %2(<32 x s8>) = G_ADD %0, %1
69     $ymm0 = COPY %2
70     RET 0
72 ...
73 ---
74 name:            test_add_v16i16
75 alignment:       16
76 legalized:       false
77 regBankSelected: false
78 registers:
79   - { id: 0, class: _ }
80   - { id: 1, class: _ }
81   - { id: 2, class: _ }
82 body:             |
83   bb.1 (%ir-block.0):
84     liveins: $ymm0, $ymm1
85     ; SSE2-LABEL: name: test_add_v16i16
86     ; SSE2: [[DEF:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF
87     ; SSE2: [[DEF1:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF
88     ; SSE2: [[UV:%[0-9]+]]:_(<8 x s16>), [[UV1:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF]](<16 x s16>)
89     ; SSE2: [[UV2:%[0-9]+]]:_(<8 x s16>), [[UV3:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF1]](<16 x s16>)
90     ; SSE2: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV]], [[UV2]]
91     ; SSE2: [[ADD1:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV1]], [[UV3]]
92     ; SSE2: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s16>) = G_CONCAT_VECTORS [[ADD]](<8 x s16>), [[ADD1]](<8 x s16>)
93     ; SSE2: $ymm0 = COPY [[CONCAT_VECTORS]](<16 x s16>)
94     ; SSE2: RET 0
95     ; AVX1-LABEL: name: test_add_v16i16
96     ; AVX1: [[DEF:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF
97     ; AVX1: [[DEF1:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF
98     ; AVX1: [[UV:%[0-9]+]]:_(<8 x s16>), [[UV1:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF]](<16 x s16>)
99     ; AVX1: [[UV2:%[0-9]+]]:_(<8 x s16>), [[UV3:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF1]](<16 x s16>)
100     ; AVX1: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV]], [[UV2]]
101     ; AVX1: [[ADD1:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV1]], [[UV3]]
102     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s16>) = G_CONCAT_VECTORS [[ADD]](<8 x s16>), [[ADD1]](<8 x s16>)
103     ; AVX1: $ymm0 = COPY [[CONCAT_VECTORS]](<16 x s16>)
104     ; AVX1: RET 0
105     ; AVX2-LABEL: name: test_add_v16i16
106     ; AVX2: [[DEF:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF
107     ; AVX2: [[DEF1:%[0-9]+]]:_(<16 x s16>) = IMPLICIT_DEF
108     ; AVX2: [[ADD:%[0-9]+]]:_(<16 x s16>) = G_ADD [[DEF]], [[DEF1]]
109     ; AVX2: $ymm0 = COPY [[ADD]](<16 x s16>)
110     ; AVX2: RET 0
111     %0(<16 x s16>) = IMPLICIT_DEF
112     %1(<16 x s16>) = IMPLICIT_DEF
113     %2(<16 x s16>) = G_ADD %0, %1
114     $ymm0 = COPY %2
115     RET 0
119 name:            test_add_v8i32
120 alignment:       16
121 legalized:       false
122 regBankSelected: false
123 registers:
124   - { id: 0, class: _ }
125   - { id: 1, class: _ }
126   - { id: 2, class: _ }
127 body:             |
128   bb.1 (%ir-block.0):
129     liveins: $ymm0, $ymm1
130     ; SSE2-LABEL: name: test_add_v8i32
131     ; SSE2: [[DEF:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF
132     ; SSE2: [[DEF1:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF
133     ; SSE2: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF]](<8 x s32>)
134     ; SSE2: [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF1]](<8 x s32>)
135     ; SSE2: [[ADD:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV]], [[UV2]]
136     ; SSE2: [[ADD1:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV1]], [[UV3]]
137     ; SSE2: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[ADD]](<4 x s32>), [[ADD1]](<4 x s32>)
138     ; SSE2: $ymm0 = COPY [[CONCAT_VECTORS]](<8 x s32>)
139     ; SSE2: RET 0
140     ; AVX1-LABEL: name: test_add_v8i32
141     ; AVX1: [[DEF:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF
142     ; AVX1: [[DEF1:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF
143     ; AVX1: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF]](<8 x s32>)
144     ; AVX1: [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF1]](<8 x s32>)
145     ; AVX1: [[ADD:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV]], [[UV2]]
146     ; AVX1: [[ADD1:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV1]], [[UV3]]
147     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[ADD]](<4 x s32>), [[ADD1]](<4 x s32>)
148     ; AVX1: $ymm0 = COPY [[CONCAT_VECTORS]](<8 x s32>)
149     ; AVX1: RET 0
150     ; AVX2-LABEL: name: test_add_v8i32
151     ; AVX2: [[DEF:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF
152     ; AVX2: [[DEF1:%[0-9]+]]:_(<8 x s32>) = IMPLICIT_DEF
153     ; AVX2: [[ADD:%[0-9]+]]:_(<8 x s32>) = G_ADD [[DEF]], [[DEF1]]
154     ; AVX2: $ymm0 = COPY [[ADD]](<8 x s32>)
155     ; AVX2: RET 0
156     %0(<8 x s32>) = IMPLICIT_DEF
157     %1(<8 x s32>) = IMPLICIT_DEF
158     %2(<8 x s32>) = G_ADD %0, %1
159     $ymm0 = COPY %2
160     RET 0
164 name:            test_add_v4i64
165 alignment:       16
166 legalized:       false
167 regBankSelected: false
168 registers:
169   - { id: 0, class: _ }
170   - { id: 1, class: _ }
171   - { id: 2, class: _ }
172 body:             |
173   bb.1 (%ir-block.0):
174     liveins: $ymm0, $ymm1
175     ; SSE2-LABEL: name: test_add_v4i64
176     ; SSE2: [[DEF:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF
177     ; SSE2: [[DEF1:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF
178     ; SSE2: [[UV:%[0-9]+]]:_(<2 x s64>), [[UV1:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF]](<4 x s64>)
179     ; SSE2: [[UV2:%[0-9]+]]:_(<2 x s64>), [[UV3:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF1]](<4 x s64>)
180     ; SSE2: [[ADD:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV]], [[UV2]]
181     ; SSE2: [[ADD1:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV1]], [[UV3]]
182     ; SSE2: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s64>) = G_CONCAT_VECTORS [[ADD]](<2 x s64>), [[ADD1]](<2 x s64>)
183     ; SSE2: $ymm0 = COPY [[CONCAT_VECTORS]](<4 x s64>)
184     ; SSE2: RET 0
185     ; AVX1-LABEL: name: test_add_v4i64
186     ; AVX1: [[DEF:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF
187     ; AVX1: [[DEF1:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF
188     ; AVX1: [[UV:%[0-9]+]]:_(<2 x s64>), [[UV1:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF]](<4 x s64>)
189     ; AVX1: [[UV2:%[0-9]+]]:_(<2 x s64>), [[UV3:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF1]](<4 x s64>)
190     ; AVX1: [[ADD:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV]], [[UV2]]
191     ; AVX1: [[ADD1:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV1]], [[UV3]]
192     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s64>) = G_CONCAT_VECTORS [[ADD]](<2 x s64>), [[ADD1]](<2 x s64>)
193     ; AVX1: $ymm0 = COPY [[CONCAT_VECTORS]](<4 x s64>)
194     ; AVX1: RET 0
195     ; AVX2-LABEL: name: test_add_v4i64
196     ; AVX2: [[DEF:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF
197     ; AVX2: [[DEF1:%[0-9]+]]:_(<4 x s64>) = IMPLICIT_DEF
198     ; AVX2: [[ADD:%[0-9]+]]:_(<4 x s64>) = G_ADD [[DEF]], [[DEF1]]
199     ; AVX2: $ymm0 = COPY [[ADD]](<4 x s64>)
200     ; AVX2: RET 0
201     %0(<4 x s64>) = IMPLICIT_DEF
202     %1(<4 x s64>) = IMPLICIT_DEF
203     %2(<4 x s64>) = G_ADD %0, %1
204     $ymm0 = COPY %2
205     RET 0