@@ -5603,40 +5603,39 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
5603
5603
// Look for (X86cmp (and $op, $imm), 0) and see if we can convert it to
5604
5604
// use a smaller encoding.
5605
5605
// 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 () &&
5608
5607
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
+
5612
5612
// We may have looked through a truncate so mask off any bits that
5613
5613
// shouldn't be part of the compare.
5614
+ uint64_t Mask = MaskC->getZExtValue ();
5614
5615
Mask &= maskTrailingOnes<uint64_t >(CmpVT.getScalarSizeInBits ());
5615
5616
5616
5617
// 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
5618
5619
// flag.
5619
5620
if (CmpVT == MVT::i64 && !isInt<32 >(Mask) &&
5620
5621
onlyUsesZeroFlag (SDValue (Node, 0 ))) {
5622
+ unsigned ShiftOpcode = ISD::DELETED_NODE;
5623
+ unsigned ShiftAmt;
5621
5624
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);
5631
5630
}
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);
5640
5639
ReplaceNode (Node, Test);
5641
5640
return ;
5642
5641
}
0 commit comments