@@ -182,7 +182,108 @@ define i32 @or_and_multiuse_and_multiuse_i32(i32 %x, i32 %y) nounwind {
182182 ret i32 %r
183183}
184184
185+ define i64 @or_build_pair_not (i32 %a0 , i32 %a1 ) {
186+ ; CHECK-LABEL: or_build_pair_not:
187+ ; CHECK: # %bb.0:
188+ ; CHECK-NEXT: # kill: def $esi killed $esi def $rsi
189+ ; CHECK-NEXT: # kill: def $edi killed $edi def $rdi
190+ ; CHECK-NEXT: notl %edi
191+ ; CHECK-NEXT: notl %esi
192+ ; CHECK-NEXT: shlq $32, %rsi
193+ ; CHECK-NEXT: leaq (%rsi,%rdi), %rax
194+ ; CHECK-NEXT: retq
195+ %n0 = xor i32 %a0 , -1
196+ %n1 = xor i32 %a1 , -1
197+ %x0 = zext i32 %n0 to i64
198+ %x1 = zext i32 %n1 to i64
199+ %hi = shl i64 %x1 , 32
200+ %r = or i64 %hi , %x0
201+ ret i64 %r
202+ }
203+
204+ define i64 @PR89533 (<64 x i8 > %a0 ) {
205+ ; SSE-LABEL: PR89533:
206+ ; SSE: # %bb.0:
207+ ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95]
208+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm0
209+ ; SSE-NEXT: pmovmskb %xmm0, %eax
210+ ; SSE-NEXT: xorl $65535, %eax # imm = 0xFFFF
211+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm1
212+ ; SSE-NEXT: pmovmskb %xmm1, %ecx
213+ ; SSE-NEXT: notl %ecx
214+ ; SSE-NEXT: shll $16, %ecx
215+ ; SSE-NEXT: orl %eax, %ecx
216+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm2
217+ ; SSE-NEXT: pmovmskb %xmm2, %edx
218+ ; SSE-NEXT: xorl $65535, %edx # imm = 0xFFFF
219+ ; SSE-NEXT: pcmpeqb %xmm4, %xmm3
220+ ; SSE-NEXT: pmovmskb %xmm3, %eax
221+ ; SSE-NEXT: notl %eax
222+ ; SSE-NEXT: shll $16, %eax
223+ ; SSE-NEXT: orl %edx, %eax
224+ ; SSE-NEXT: shlq $32, %rax
225+ ; SSE-NEXT: orq %rcx, %rax
226+ ; SSE-NEXT: je .LBB11_2
227+ ; SSE-NEXT: # %bb.1: # %cond.false
228+ ; SSE-NEXT: rep bsfq %rax, %rax
229+ ; SSE-NEXT: retq
230+ ; SSE-NEXT: .LBB11_2: # %cond.end
231+ ; SSE-NEXT: movl $64, %eax
232+ ; SSE-NEXT: retq
233+ ;
234+ ; AVX1-LABEL: PR89533:
235+ ; AVX1: # %bb.0:
236+ ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95]
237+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3
238+ ; AVX1-NEXT: vpmovmskb %xmm3, %eax
239+ ; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF
240+ ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
241+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
242+ ; AVX1-NEXT: vpmovmskb %xmm0, %ecx
243+ ; AVX1-NEXT: notl %ecx
244+ ; AVX1-NEXT: shll $16, %ecx
245+ ; AVX1-NEXT: orl %eax, %ecx
246+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm0
247+ ; AVX1-NEXT: vpmovmskb %xmm0, %edx
248+ ; AVX1-NEXT: xorl $65535, %edx # imm = 0xFFFF
249+ ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
250+ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
251+ ; AVX1-NEXT: vpmovmskb %xmm0, %eax
252+ ; AVX1-NEXT: notl %eax
253+ ; AVX1-NEXT: shll $16, %eax
254+ ; AVX1-NEXT: orl %edx, %eax
255+ ; AVX1-NEXT: shlq $32, %rax
256+ ; AVX1-NEXT: orq %rcx, %rax
257+ ; AVX1-NEXT: je .LBB11_2
258+ ; AVX1-NEXT: # %bb.1: # %cond.false
259+ ; AVX1-NEXT: rep bsfq %rax, %rax
260+ ; AVX1-NEXT: vzeroupper
261+ ; AVX1-NEXT: retq
262+ ; AVX1-NEXT: .LBB11_2: # %cond.end
263+ ; AVX1-NEXT: movl $64, %eax
264+ ; AVX1-NEXT: vzeroupper
265+ ; AVX1-NEXT: retq
266+ ;
267+ ; AVX2-LABEL: PR89533:
268+ ; AVX2: # %bb.0:
269+ ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95]
270+ ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
271+ ; AVX2-NEXT: vpmovmskb %ymm0, %eax
272+ ; AVX2-NEXT: notl %eax
273+ ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm0
274+ ; AVX2-NEXT: vpmovmskb %ymm0, %ecx
275+ ; AVX2-NEXT: notl %ecx
276+ ; AVX2-NEXT: shlq $32, %rcx
277+ ; AVX2-NEXT: orq %rax, %rcx
278+ ; AVX2-NEXT: xorl %eax, %eax
279+ ; AVX2-NEXT: tzcntq %rcx, %rax
280+ ; AVX2-NEXT: vzeroupper
281+ ; AVX2-NEXT: retq
282+ %cmp = icmp ne <64 x i8 > %a0 , <i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 , i8 95 >
283+ %mask = bitcast <64 x i1 > %cmp to i64
284+ %tz = tail call i64 @llvm.cttz.i64 (i64 %mask , i1 false )
285+ ret i64 %tz
286+ }
287+
185288declare void @use_i32 (i32 )
186- ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
187- ; AVX1: {{.*}}
188- ; AVX2: {{.*}}
289+
0 commit comments