Skip to content

Commit 3c9429f

Browse files
authored
[X86] Remove redundant test after setzucc (#129506)
Patch #96594 substitutes setcc + zext pair with setzucc, but it results in redundant test because X86FlagsCopyLowering doesn't recognize it. This patch removes redundant test by reverting setzucc to setcc (optimized) + zext.
1 parent 6abe148 commit 3c9429f

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

llvm/lib/Target/X86/X86FlagsCopyLowering.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ bool X86FlagsCopyLoweringPass::runOnMachineFunction(MachineFunction &MF) {
615615
MRI->replaceRegWith(MI.getOperand(0).getReg(),
616616
CopyDefI.getOperand(0).getReg());
617617
MI.eraseFromParent();
618-
} else if (X86::isSETCC(Opc)) {
618+
} else if (X86::isSETCC(Opc) || X86::isSETZUCC(Opc)) {
619619
rewriteSetCC(*TestMBB, TestPos, TestLoc, MI, CondRegs);
620620
} else if (isArithmeticOp(Opc)) {
621621
rewriteArithmetic(*TestMBB, TestPos, TestLoc, MI, CondRegs);
@@ -781,6 +781,29 @@ void X86FlagsCopyLoweringPass::rewriteSetCC(MachineBasicBlock &MBB,
781781
if (!CondReg)
782782
CondReg = promoteCondToReg(MBB, Pos, Loc, Cond);
783783

784+
if (X86::isSETZUCC(MI.getOpcode())) {
785+
// SETZUCC is generated for register only for now.
786+
assert(!MI.mayStore() && "Cannot handle memory variants");
787+
assert(MI.getOperand(0).isReg() &&
788+
"Cannot have a non-register defined operand to SETZUcc!");
789+
Register OldReg = MI.getOperand(0).getReg();
790+
// Drop Kill flags on the old register before replacing. CondReg may have
791+
// a longer live range.
792+
MRI->clearKillFlags(OldReg);
793+
for (auto &Use : MRI->use_instructions(OldReg)) {
794+
assert(Use.getOpcode() == X86::INSERT_SUBREG &&
795+
"SETZUCC should be only used by INSERT_SUBREG");
796+
Use.getOperand(2).setReg(CondReg);
797+
// Recover MOV32r0 before INSERT_SUBREG, which removed by SETZUCC.
798+
Register ZeroReg = MRI->createVirtualRegister(&X86::GR32RegClass);
799+
BuildMI(*Use.getParent(), &Use, Use.getDebugLoc(), TII->get(X86::MOV32r0),
800+
ZeroReg);
801+
Use.getOperand(1).setReg(ZeroReg);
802+
}
803+
MI.eraseFromParent();
804+
return;
805+
}
806+
784807
// Rewriting a register def is trivial: we just replace the register and
785808
// remove the setcc.
786809
if (!MI.mayStore()) {

llvm/test/CodeGen/X86/apx/setzucc.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ define i32 @flags_copy_lowering() nounwind {
6060
; CHECK-NEXT: setb %sil
6161
; CHECK-NEXT: adcl $0, %ecx
6262
; CHECK-NEXT: testb %sil, %sil
63-
; CHECK-NEXT: setzune %dl
64-
; CHECK-NEXT: testb %sil, %sil
6563
; CHECK-NEXT: je .LBB4_3
6664
; CHECK-NEXT: # %bb.2: # %bb1
6765
; CHECK-NEXT: # in Loop: Header=BB4_1 Depth=1
66+
; CHECK-NEXT: xorl %edx, %edx
67+
; CHECK-NEXT: movb %sil, %dl
6868
; CHECK-NEXT: testb %al, %al
6969
; CHECK-NEXT: jne .LBB4_1
7070
; CHECK-NEXT: .LBB4_3: # %bb2

0 commit comments

Comments
 (0)