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