Skip to content

Commit 7a6fe79

Browse files
committed
Tidy up getShiftForReduction()
1 parent 46786e7 commit 7a6fe79

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
@@ -4069,40 +4069,41 @@ static SDValue getShiftForReduction(unsigned ShiftOpc, SDValue LHS, SDValue RHS,
40694069
"Expected shift Opcode.");
40704070

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

0 commit comments

Comments
 (0)