@@ -4507,3 +4507,111 @@ define i64 @bzhi64_constant_mask8_load(ptr %val) nounwind {
45074507 %masked = and i64 %val1 , 127
45084508 ret i64 %masked
45094509}
4510+
4511+ ; TODO: Ensure constant hoisting doesn't prevent BEXTR/BZHI instructions in both paths.
4512+ define void @PR111323 (ptr nocapture noundef writeonly %use , i64 noundef %x , i64 noundef %y ) nounwind {
4513+ ; X86-LABEL: PR111323:
4514+ ; X86: # %bb.0: # %entry
4515+ ; X86-NEXT: pushl %edi
4516+ ; X86-NEXT: pushl %esi
4517+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
4518+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
4519+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
4520+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
4521+ ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edi
4522+ ; X86-NEXT: movl %edi, 4(%ecx)
4523+ ; X86-NEXT: movl %esi, (%ecx)
4524+ ; X86-NEXT: movl %edx, %esi
4525+ ; X86-NEXT: orl %eax, %esi
4526+ ; X86-NEXT: je .LBB68_2
4527+ ; X86-NEXT: # %bb.1: # %if.end
4528+ ; X86-NEXT: andl $65535, %eax # imm = 0xFFFF
4529+ ; X86-NEXT: andl $-1, %edx
4530+ ; X86-NEXT: movl %edx, 8(%ecx)
4531+ ; X86-NEXT: movl %eax, 12(%ecx)
4532+ ; X86-NEXT: .LBB68_2: # %return
4533+ ; X86-NEXT: popl %esi
4534+ ; X86-NEXT: popl %edi
4535+ ; X86-NEXT: retl
4536+ ;
4537+ ; X64-NOBMI-LABEL: PR111323:
4538+ ; X64-NOBMI: # %bb.0: # %entry
4539+ ; X64-NOBMI-NEXT: movabsq $281474976710655, %rax # imm = 0xFFFFFFFFFFFF
4540+ ; X64-NOBMI-NEXT: andq %rax, %rsi
4541+ ; X64-NOBMI-NEXT: movq %rsi, (%rdi)
4542+ ; X64-NOBMI-NEXT: testq %rdx, %rdx
4543+ ; X64-NOBMI-NEXT: je .LBB68_2
4544+ ; X64-NOBMI-NEXT: # %bb.1: # %if.end
4545+ ; X64-NOBMI-NEXT: andq %rax, %rdx
4546+ ; X64-NOBMI-NEXT: movq %rdx, 8(%rdi)
4547+ ; X64-NOBMI-NEXT: .LBB68_2: # %return
4548+ ; X64-NOBMI-NEXT: retq
4549+ ;
4550+ ; X64-BMI1NOTBM-LABEL: PR111323:
4551+ ; X64-BMI1NOTBM: # %bb.0: # %entry
4552+ ; X64-BMI1NOTBM-NEXT: movl $12288, %eax # imm = 0x3000
4553+ ; X64-BMI1NOTBM-NEXT: bextrq %rax, %rsi, %rax
4554+ ; X64-BMI1NOTBM-NEXT: movq %rax, (%rdi)
4555+ ; X64-BMI1NOTBM-NEXT: testq %rdx, %rdx
4556+ ; X64-BMI1NOTBM-NEXT: je .LBB68_2
4557+ ; X64-BMI1NOTBM-NEXT: # %bb.1: # %if.end
4558+ ; X64-BMI1NOTBM-NEXT: movabsq $281474976710655, %rax # imm = 0xFFFFFFFFFFFF
4559+ ; X64-BMI1NOTBM-NEXT: andq %rax, %rdx
4560+ ; X64-BMI1NOTBM-NEXT: movq %rdx, 8(%rdi)
4561+ ; X64-BMI1NOTBM-NEXT: .LBB68_2: # %return
4562+ ; X64-BMI1NOTBM-NEXT: retq
4563+ ;
4564+ ; X64-BMI1TBM-LABEL: PR111323:
4565+ ; X64-BMI1TBM: # %bb.0: # %entry
4566+ ; X64-BMI1TBM-NEXT: bextrq $12288, %rsi, %rax # imm = 0x3000
4567+ ; X64-BMI1TBM-NEXT: movq %rax, (%rdi)
4568+ ; X64-BMI1TBM-NEXT: testq %rdx, %rdx
4569+ ; X64-BMI1TBM-NEXT: je .LBB68_2
4570+ ; X64-BMI1TBM-NEXT: # %bb.1: # %if.end
4571+ ; X64-BMI1TBM-NEXT: movabsq $281474976710655, %rax # imm = 0xFFFFFFFFFFFF
4572+ ; X64-BMI1TBM-NEXT: andq %rax, %rdx
4573+ ; X64-BMI1TBM-NEXT: movq %rdx, 8(%rdi)
4574+ ; X64-BMI1TBM-NEXT: .LBB68_2: # %return
4575+ ; X64-BMI1TBM-NEXT: retq
4576+ ;
4577+ ; X64-BMI2TBM-LABEL: PR111323:
4578+ ; X64-BMI2TBM: # %bb.0: # %entry
4579+ ; X64-BMI2TBM-NEXT: bextrq $12288, %rsi, %rax # imm = 0x3000
4580+ ; X64-BMI2TBM-NEXT: movq %rax, (%rdi)
4581+ ; X64-BMI2TBM-NEXT: testq %rdx, %rdx
4582+ ; X64-BMI2TBM-NEXT: je .LBB68_2
4583+ ; X64-BMI2TBM-NEXT: # %bb.1: # %if.end
4584+ ; X64-BMI2TBM-NEXT: movabsq $281474976710655, %rax # imm = 0xFFFFFFFFFFFF
4585+ ; X64-BMI2TBM-NEXT: andq %rax, %rdx
4586+ ; X64-BMI2TBM-NEXT: movq %rdx, 8(%rdi)
4587+ ; X64-BMI2TBM-NEXT: .LBB68_2: # %return
4588+ ; X64-BMI2TBM-NEXT: retq
4589+ ;
4590+ ; X64-BMI2NOTBM-LABEL: PR111323:
4591+ ; X64-BMI2NOTBM: # %bb.0: # %entry
4592+ ; X64-BMI2NOTBM-NEXT: movb $48, %al
4593+ ; X64-BMI2NOTBM-NEXT: bzhiq %rax, %rsi, %rax
4594+ ; X64-BMI2NOTBM-NEXT: movq %rax, (%rdi)
4595+ ; X64-BMI2NOTBM-NEXT: testq %rdx, %rdx
4596+ ; X64-BMI2NOTBM-NEXT: je .LBB68_2
4597+ ; X64-BMI2NOTBM-NEXT: # %bb.1: # %if.end
4598+ ; X64-BMI2NOTBM-NEXT: movabsq $281474976710655, %rax # imm = 0xFFFFFFFFFFFF
4599+ ; X64-BMI2NOTBM-NEXT: andq %rax, %rdx
4600+ ; X64-BMI2NOTBM-NEXT: movq %rdx, 8(%rdi)
4601+ ; X64-BMI2NOTBM-NEXT: .LBB68_2: # %return
4602+ ; X64-BMI2NOTBM-NEXT: retq
4603+ entry:
4604+ %and = and i64 %x , 281474976710655
4605+ store i64 %and , ptr %use , align 8
4606+ %cmp = icmp eq i64 %y , 0
4607+ br i1 %cmp , label %return , label %if.end
4608+
4609+ if.end:
4610+ %and1 = and i64 %y , 281474976710655
4611+ %arrayidx2 = getelementptr inbounds i8 , ptr %use , i64 8
4612+ store i64 %and1 , ptr %arrayidx2 , align 8
4613+ br label %return
4614+
4615+ return:
4616+ ret void
4617+ }
0 commit comments