@@ -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