@@ -4507,3 +4507,111 @@ define i64 @bzhi64_constant_mask8_load(ptr %val) nounwind {
4507
4507
%masked = and i64 %val1 , 127
4508
4508
ret i64 %masked
4509
4509
}
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