Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / GlobalISel / legalize-mul-scalar.mir
blobdeff2ba439a470a821a4e3a6e767c9e54c1ac87d
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -O0 -mtriple=x86_64-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,X64
3 # RUN: llc -O0 -mtriple=i386-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,X86
5 --- |
6   define void @test_mul_i1() { ret void }
8   define i8 @test_mul_i8(i8 %arg1, i8 %arg2) {
9     %ret = mul i8 %arg1, %arg2
10     ret i8 %ret
11   }
13   define i16 @test_mul_i16(i16 %arg1, i16 %arg2) {
14     %ret = mul i16 %arg1, %arg2
15     ret i16 %ret
16   }
18   define i27 @test_mul_i27(i27 %arg1, i27 %arg2) {
19     %ret = mul i27 %arg1, %arg2
20     ret i27 %ret
21   }
23   define i32 @test_mul_i32(i32 %arg1, i32 %arg2) {
24     %ret = mul i32 %arg1, %arg2
25     ret i32 %ret
26   }
28   define i42 @test_mul_i42(i42 %arg1, i42 %arg2) {
29     %ret = mul i42 %arg1, %arg2
30     ret i42 %ret
31   }
33   define i64 @test_mul_i64(i64 %arg1, i64 %arg2) {
34     %ret = mul i64 %arg1, %arg2
35     ret i64 %ret
36   }
37 ...
38 ---
39 name:            test_mul_i1
40 alignment:       16
41 legalized:       false
42 regBankSelected: false
43 registers:
44   - { id: 0, class: _, preferred-register: '' }
45   - { id: 1, class: _, preferred-register: '' }
46   - { id: 2, class: _, preferred-register: '' }
47 body:             |
48   bb.1 (%ir-block.0):
50     ; CHECK-LABEL: name: test_mul_i1
51     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edx
52     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)
53     ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32)
54     ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s8) = G_MUL [[TRUNC]], [[TRUNC1]]
55     ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(p0) = G_IMPLICIT_DEF
56     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 1
57     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s8) = G_AND [[MUL]], [[C]]
58     ; CHECK-NEXT: G_STORE [[AND]](s8), [[DEF]](p0) :: (store (s1))
59     ; CHECK-NEXT: RET 0
60     %0(s32) = COPY $edx
61     %1(s1) = G_TRUNC %0(s32)
62     %2(s1) = G_MUL %1, %1
63     %3:_(p0) = G_IMPLICIT_DEF
64     G_STORE %2, %3 :: (store (s1))
65     RET 0
66 ...
67 ---
68 name:            test_mul_i8
69 alignment:       16
70 legalized:       false
71 regBankSelected: false
72 registers:
73   - { id: 0, class: _ }
74   - { id: 1, class: _ }
75   - { id: 2, class: _ }
76 body:             |
77   bb.1 (%ir-block.0):
78     liveins: $edi, $esi
80     ; CHECK-LABEL: name: test_mul_i8
81     ; CHECK: liveins: $edi, $esi
82     ; CHECK-NEXT: {{  $}}
83     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY $dl
84     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s8) = COPY $sil
85     ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s8) = G_MUL [[COPY]], [[COPY1]]
86     ; CHECK-NEXT: $al = COPY [[MUL]](s8)
87     ; CHECK-NEXT: RET 0, implicit $al
88     %0(s8) = COPY $dl
89     %1(s8) = COPY $sil
90     %2(s8) = G_MUL %0, %1
91     $al = COPY %2(s8)
92     RET 0, implicit $al
93 ...
94 ---
95 name:            test_mul_i16
96 alignment:       16
97 legalized:       false
98 regBankSelected: false
99 registers:
100   - { id: 0, class: _ }
101   - { id: 1, class: _ }
102   - { id: 2, class: _ }
103 body:             |
104   bb.1 (%ir-block.0):
105     liveins: $edi, $esi
107     ; CHECK-LABEL: name: test_mul_i16
108     ; CHECK: liveins: $edi, $esi
109     ; CHECK-NEXT: {{  $}}
110     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $di
111     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s16) = COPY $si
112     ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s16) = G_MUL [[COPY]], [[COPY1]]
113     ; CHECK-NEXT: $ax = COPY [[MUL]](s16)
114     ; CHECK-NEXT: RET 0, implicit $ax
115     %0(s16) = COPY $di
116     %1(s16) = COPY $si
117     %2(s16) = G_MUL %0, %1
118     $ax = COPY %2(s16)
119     RET 0, implicit $ax
122 name:            test_mul_i27
123 alignment:       16
124 legalized:       false
125 regBankSelected: false
126 registers:
127   - { id: 0, class: _ }
128   - { id: 1, class: _ }
129   - { id: 2, class: _ }
130 body:             |
131   bb.1 (%ir-block.0):
133     ;
134     ;
135     ; CHECK-LABEL: name: test_mul_i27
136     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edx
137     ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY]]
138     ; CHECK-NEXT: $eax = COPY [[MUL]](s32)
139     ; CHECK-NEXT: RET 0
140     %0(s32) = COPY $edx
141     %1(s27) = G_TRUNC %0(s32)
142     %2(s27) = G_MUL %1, %1
143     %3:_(s32) = G_ANYEXT %2
144     $eax = COPY %3
145     RET 0
149 name:            test_mul_i32
150 alignment:       16
151 legalized:       false
152 regBankSelected: false
153 registers:
154   - { id: 0, class: _ }
155   - { id: 1, class: _ }
156   - { id: 2, class: _ }
157 body:             |
158   bb.1 (%ir-block.0):
159     liveins: $edi, $esi
161     ; CHECK-LABEL: name: test_mul_i32
162     ; CHECK: liveins: $edi, $esi
163     ; CHECK-NEXT: {{  $}}
164     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
165     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $esi
166     ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY1]]
167     ; CHECK-NEXT: $eax = COPY [[MUL]](s32)
168     ; CHECK-NEXT: RET 0, implicit $eax
169     %0(s32) = COPY $edi
170     %1(s32) = COPY $esi
171     %2(s32) = G_MUL %0, %1
172     $eax = COPY %2(s32)
173     RET 0, implicit $eax
176 name:            test_mul_i42
177 alignment:       16
178 legalized:       false
179 regBankSelected: false
180 registers:
181   - { id: 0, class: _ }
182   - { id: 1, class: _ }
183   - { id: 2, class: _ }
184 body:             |
185   bb.1 (%ir-block.0):
186     liveins: $rdi, $rsi
188     ; X64-LABEL: name: test_mul_i42
189     ; X64: liveins: $rdi, $rsi
190     ; X64-NEXT: {{  $}}
191     ; X64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $rdx
192     ; X64-NEXT: [[MUL:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY]]
193     ; X64-NEXT: $rax = COPY [[MUL]](s64)
194     ; X64-NEXT: RET 0
195     ; X86-LABEL: name: test_mul_i42
196     ; X86: liveins: $rdi, $rsi
197     ; X86-NEXT: {{  $}}
198     ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $rdx
199     ; X86-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64)
200     ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64)
201     ; X86-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV2]]
202     ; X86-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[UV1]], [[UV2]]
203     ; X86-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV3]]
204     ; X86-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[UV]], [[UV2]]
205     ; X86-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL1]], [[MUL2]]
206     ; X86-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[UMULH]]
207     ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[MUL]](s32), [[ADD1]](s32)
208     ; X86-NEXT: $rax = COPY [[MV]](s64)
209     ; X86-NEXT: RET 0
210     %0(s64) = COPY $rdx
211     %1(s42) = G_TRUNC %0(s64)
212     %2(s42) = G_MUL %1, %1
213     %3:_(s64) = G_ANYEXT %2
214     $rax = COPY %3
215     RET 0
218 name:            test_mul_i64
219 alignment:       16
220 legalized:       false
221 regBankSelected: false
222 registers:
223   - { id: 0, class: _ }
224   - { id: 1, class: _ }
225   - { id: 2, class: _ }
226 body:             |
227   bb.1 (%ir-block.0):
228     liveins: $rdi, $rsi
230     ; X64-LABEL: name: test_mul_i64
231     ; X64: liveins: $rdi, $rsi
232     ; X64-NEXT: {{  $}}
233     ; X64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $rdi
234     ; X64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $rsi
235     ; X64-NEXT: [[MUL:%[0-9]+]]:_(s64) = G_MUL [[COPY]], [[COPY1]]
236     ; X64-NEXT: $rax = COPY [[MUL]](s64)
237     ; X64-NEXT: RET 0, implicit $rax
238     ; X86-LABEL: name: test_mul_i64
239     ; X86: liveins: $rdi, $rsi
240     ; X86-NEXT: {{  $}}
241     ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $rdi
242     ; X86-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $rsi
243     ; X86-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64)
244     ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64)
245     ; X86-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV2]]
246     ; X86-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[UV1]], [[UV2]]
247     ; X86-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV3]]
248     ; X86-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[UV]], [[UV2]]
249     ; X86-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL1]], [[MUL2]]
250     ; X86-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[UMULH]]
251     ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[MUL]](s32), [[ADD1]](s32)
252     ; X86-NEXT: $rax = COPY [[MV]](s64)
253     ; X86-NEXT: RET 0, implicit $rax
254     %0(s64) = COPY $rdi
255     %1(s64) = COPY $rsi
256     %2(s64) = G_MUL %0, %1
257     $rax = COPY %2(s64)
258     RET 0, implicit $rax