Skip to content

Commit ba96d63

Browse files
committed
Tidy up getShiftForReduction()
1 parent 332c8b9 commit ba96d63

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4070,40 +4070,41 @@ static SDValue getShiftForReduction(unsigned ShiftOpc, SDValue LHS, SDValue RHS,
40704070
"Expected shift Opcode.");
40714071

40724072
SDLoc SL = SDLoc(RHS);
4073-
if (RHS->getOpcode() == ISD::EXTRACT_VECTOR_ELT) {
4074-
SDValue VAND = RHS.getOperand(0);
4075-
if (ConstantSDNode *CRRHS = dyn_cast<ConstantSDNode>(RHS->getOperand(1))) {
4076-
uint64_t AndIndex = RHS->getConstantOperandVal(1);
4077-
if (VAND->getOpcode() == ISD::AND && CRRHS) {
4078-
SDValue LHSAND = VAND.getOperand(0);
4079-
SDValue RHSAND = VAND.getOperand(1);
4080-
if (RHSAND->getOpcode() == ISD::BUILD_VECTOR) {
4081-
ConstantSDNode *CANDL =
4082-
dyn_cast<ConstantSDNode>(RHSAND->getOperand(0));
4083-
ConstantSDNode *CANDR =
4084-
dyn_cast<ConstantSDNode>(RHSAND->getOperand(1));
4085-
if (CANDL && CANDR && RHSAND->getConstantOperandVal(0) == 0x1f &&
4086-
RHSAND->getConstantOperandVal(1) == 0x1f) {
4087-
// Get the non-const AND operands and produce scalar AND
4088-
const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
4089-
const SDValue One = DAG.getConstant(1, SL, MVT::i32);
4090-
SDValue Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32,
4091-
LHSAND, Zero);
4092-
SDValue Hi =
4093-
DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, LHSAND, One);
4094-
SDValue AndMask = DAG.getConstant(0x1f, SL, MVT::i32);
4095-
SDValue LoAnd = DAG.getNode(ISD::AND, SL, MVT::i32, Lo, AndMask);
4096-
SDValue HiAnd = DAG.getNode(ISD::AND, SL, MVT::i32, Hi, AndMask);
4097-
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MVT::i32, LHS);
4098-
if (AndIndex == 0 || AndIndex == 1)
4099-
return DAG.getNode(ShiftOpc, SL, MVT::i32, Trunc,
4100-
AndIndex == 0 ? LoAnd : HiAnd,
4101-
RHS->getFlags());
4102-
}
4103-
}
4104-
}
4105-
}
4106-
}
4073+
if (RHS->getOpcode() != ISD::EXTRACT_VECTOR_ELT)
4074+
return SDValue();
4075+
4076+
SDValue VAND = RHS.getOperand(0);
4077+
if (VAND->getOpcode() != ISD::AND)
4078+
return SDValue();
4079+
4080+
ConstantSDNode *CRRHS = dyn_cast<ConstantSDNode>(RHS->getOperand(1));
4081+
if (!CRRHS)
4082+
return SDValue();
4083+
4084+
SDValue LHSAND = VAND.getOperand(0);
4085+
SDValue RHSAND = VAND.getOperand(1);
4086+
if (RHSAND->getOpcode() != ISD::BUILD_VECTOR)
4087+
return SDValue();
4088+
4089+
ConstantSDNode *CANDL = dyn_cast<ConstantSDNode>(RHSAND->getOperand(0));
4090+
ConstantSDNode *CANDR = dyn_cast<ConstantSDNode>(RHSAND->getOperand(1));
4091+
if (!CANDL || !CANDR || RHSAND->getConstantOperandVal(0) != 0x1f ||
4092+
RHSAND->getConstantOperandVal(1) != 0x1f)
4093+
return SDValue();
4094+
// Get the non-const AND operands and produce scalar AND
4095+
const SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
4096+
const SDValue One = DAG.getConstant(1, SL, MVT::i32);
4097+
SDValue Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, LHSAND, Zero);
4098+
SDValue Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::i32, LHSAND, One);
4099+
SDValue AndMask = DAG.getConstant(0x1f, SL, MVT::i32);
4100+
SDValue LoAnd = DAG.getNode(ISD::AND, SL, MVT::i32, Lo, AndMask);
4101+
SDValue HiAnd = DAG.getNode(ISD::AND, SL, MVT::i32, Hi, AndMask);
4102+
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MVT::i32, LHS);
4103+
uint64_t AndIndex = RHS->getConstantOperandVal(1);
4104+
if (AndIndex == 0 || AndIndex == 1)
4105+
return DAG.getNode(ShiftOpc, SL, MVT::i32, Trunc,
4106+
AndIndex == 0 ? LoAnd : HiAnd, RHS->getFlags());
4107+
41074108
return SDValue();
41084109
}
41094110

0 commit comments

Comments
 (0)