@@ -4069,40 +4069,41 @@ static SDValue getShiftForReduction(unsigned ShiftOpc, SDValue LHS, SDValue RHS,
4069
4069
" Expected shift Opcode." );
4070
4070
4071
4071
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
+
4106
4107
return SDValue ();
4107
4108
}
4108
4109
0 commit comments