Skip to content

Commit 9fce696

Browse files
committed
[x86] reduce code duplication for select of X86ISD::CMP; NFC
1 parent 8209ee1 commit 9fce696

File tree

1 file changed

+22
-23
lines changed

1 file changed

+22
-23
lines changed

llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5603,40 +5603,39 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
56035603
// Look for (X86cmp (and $op, $imm), 0) and see if we can convert it to
56045604
// use a smaller encoding.
56055605
// Look past the truncate if CMP is the only use of it.
5606-
if (N0.getOpcode() == ISD::AND &&
5607-
N0.getNode()->hasOneUse() &&
5606+
if (N0.getOpcode() == ISD::AND && N0.getNode()->hasOneUse() &&
56085607
N0.getValueType() != MVT::i8) {
5609-
ConstantSDNode *C = dyn_cast<ConstantSDNode>(N0.getOperand(1));
5610-
if (!C) break;
5611-
uint64_t Mask = C->getZExtValue();
5608+
auto *MaskC = dyn_cast<ConstantSDNode>(N0.getOperand(1));
5609+
if (!MaskC)
5610+
break;
5611+
56125612
// We may have looked through a truncate so mask off any bits that
56135613
// shouldn't be part of the compare.
5614+
uint64_t Mask = MaskC->getZExtValue();
56145615
Mask &= maskTrailingOnes<uint64_t>(CmpVT.getScalarSizeInBits());
56155616

56165617
// Check if we can replace AND+IMM64 with a shift. This is possible for
5617-
// masks/ like 0xFF000000 or 0x00FFFFFF and if we care only about the zero
5618+
// masks like 0xFF000000 or 0x00FFFFFF and if we care only about the zero
56185619
// flag.
56195620
if (CmpVT == MVT::i64 && !isInt<32>(Mask) &&
56205621
onlyUsesZeroFlag(SDValue(Node, 0))) {
5622+
unsigned ShiftOpcode = ISD::DELETED_NODE;
5623+
unsigned ShiftAmt;
56215624
if (isMask_64(~Mask)) {
5622-
unsigned TrailingZeros = countTrailingZeros(Mask);
5623-
SDValue Imm = CurDAG->getTargetConstant(TrailingZeros, dl, MVT::i64);
5624-
SDValue Shift =
5625-
SDValue(CurDAG->getMachineNode(X86::SHR64ri, dl, MVT::i64, MVT::i32,
5626-
N0.getOperand(0), Imm), 0);
5627-
MachineSDNode *Test = CurDAG->getMachineNode(X86::TEST64rr, dl,
5628-
MVT::i32, Shift, Shift);
5629-
ReplaceNode(Node, Test);
5630-
return;
5625+
ShiftOpcode = X86::SHR64ri;
5626+
ShiftAmt = countTrailingZeros(Mask);
5627+
} else if (isMask_64(Mask)) {
5628+
ShiftOpcode = X86::SHL64ri;
5629+
ShiftAmt = countLeadingZeros(Mask);
56315630
}
5632-
if (isMask_64(Mask)) {
5633-
unsigned LeadingZeros = countLeadingZeros(Mask);
5634-
SDValue Imm = CurDAG->getTargetConstant(LeadingZeros, dl, MVT::i64);
5635-
SDValue Shift =
5636-
SDValue(CurDAG->getMachineNode(X86::SHL64ri, dl, MVT::i64, MVT::i32,
5637-
N0.getOperand(0), Imm), 0);
5638-
MachineSDNode *Test = CurDAG->getMachineNode(X86::TEST64rr, dl,
5639-
MVT::i32, Shift, Shift);
5631+
if (ShiftOpcode != ISD::DELETED_NODE) {
5632+
SDValue ShiftC = CurDAG->getTargetConstant(ShiftAmt, dl, MVT::i64);
5633+
SDValue Shift = SDValue(
5634+
CurDAG->getMachineNode(ShiftOpcode, dl, MVT::i64, MVT::i32,
5635+
N0.getOperand(0), ShiftC),
5636+
0);
5637+
MachineSDNode *Test =
5638+
CurDAG->getMachineNode(X86::TEST64rr, dl, MVT::i32, Shift, Shift);
56405639
ReplaceNode(Node, Test);
56415640
return;
56425641
}

0 commit comments

Comments
 (0)