@@ -8776,8 +8776,6 @@ static bool combineCCMask(SDValue &CCReg, int &CCValid, int &CCMask,
87768776
87778777SmallVector<SDValue, 4 > static simplifyAssumingCCVal (SDValue &Val, SDValue &CC,
87788778 SelectionDAG &DAG) {
8779- if (CC == SDValue ())
8780- return {};
87818779 SDLoc DL (Val);
87828780 auto Opcode = Val.getOpcode ();
87838781 switch (Opcode) {
@@ -8881,16 +8879,13 @@ static bool combineCCMask(SDValue &CCReg, int &CCValid, int &CCMask,
88818879 const auto &&Op1SDVals = simplifyAssumingCCVal (Op1, Op0CC, DAG);
88828880 if (Op0SDVals.empty () || Op1SDVals.empty ())
88838881 return false ;
8884- SmallVector<int , 4 > CCVals;
8885- std::transform (Op0SDVals.begin (), Op0SDVals.end (), Op1SDVals.begin (),
8886- std::back_inserter (CCVals), emulateTMCCMask);
8887- if (std::any_of (CCVals.begin (), CCVals.end (),
8888- [](const auto Val) { return Val < 0 ; }))
8889- return false ;
88908882 int NewCCMask = 0 ;
8891- for (auto CC : CCVals) {
8883+ for (auto CC : {0 , 1 , 2 , 3 }) {
8884+ auto CCVal = emulateTMCCMask (Op0SDVals[CC], Op1SDVals[CC]);
8885+ if (CCVal < 0 )
8886+ return false ;
88928887 NewCCMask <<= 1 ;
8893- NewCCMask |= (CCMask & (1 << (3 - CC ))) != 0 ;
8888+ NewCCMask |= (CCMask & (1 << (3 - CCVal ))) != 0 ;
88948889 }
88958890 NewCCMask &= Op0CCValid;
88968891 CCReg = Op0CC;
@@ -8926,16 +8921,13 @@ static bool combineCCMask(SDValue &CCReg, int &CCValid, int &CCMask,
89268921 return Op0APVal == Op1APVal ? 0 : Op0APVal.slt (Op1APVal) ? 1 : 2 ;
89278922 return Op0APVal == Op1APVal ? 0 : Op0APVal.ult (Op1APVal) ? 1 : 2 ;
89288923 };
8929- SmallVector<int , 4 > CCVals;
8930- std::transform (Op0SDVals.begin (), Op0SDVals.end (), Op1SDVals.begin (),
8931- std::back_inserter (CCVals), compareCCSigned);
8932- if (std::any_of (CCVals.begin (), CCVals.end (),
8933- [](const auto Val) { return Val < 0 ; }))
8934- return false ;
89358924 int NewCCMask = 0 ;
8936- for (auto CC : CCVals) {
8925+ for (auto CC : {0 , 1 , 2 , 3 }) {
8926+ auto CCVal = compareCCSigned (Op0SDVals[CC], Op1SDVals[CC]);
8927+ if (CCVal < 0 )
8928+ return false ;
89378929 NewCCMask <<= 1 ;
8938- NewCCMask |= (( CCMask & (1 << (3 - CC ))) != 0 ) ;
8930+ NewCCMask |= (CCMask & (1 << (3 - CCVal ))) != 0 ;
89398931 }
89408932 NewCCMask &= Op0CCValid;
89418933 CCMask = NewCCMask;
@@ -9018,7 +9010,7 @@ SDValue SystemZTargetLowering::combineSELECT_CCMASK(
90189010 int CCMaskVal = CCMask->getZExtValue ();
90199011 SDValue CCReg = N->getOperand (4 );
90209012
9021- bool UpdatedCCReg = combineCCMask (CCReg, CCValidVal, CCMaskVal, DAG);
9013+ bool IsCombinedCCReg = combineCCMask (CCReg, CCValidVal, CCMaskVal, DAG);
90229014
90239015 // Attempting to optimize TrueVal/FalseVal in outermost select_ccmask either
90249016 // with CCReg found by combineCCMask or original CCReg.
@@ -9031,15 +9023,14 @@ SDValue SystemZTargetLowering::combineSELECT_CCMASK(
90319023 // optimized by combineCCMask, we can not take early exit here, just bypass it
90329024 // and directly create a new SELECT_CCMASK.
90339025 if (!TrueSDVals.empty () && !FalseSDVals.empty ()) {
9034- SmallVector <SDValue, 4 > MergedSDVals ;
9035- CCMaskVal &= CCValidVal;
9026+ SmallSet <SDValue, 4 > MergedSDValsSet ;
9027+ // Ignoring CC values outside CCValiid.
90369028 for (auto CC : {0 , 1 , 2 , 3 }) {
9037- MergedSDVals.emplace_back (((CCMaskVal & (1 << (3 - CC))) != 0 )
9038- ? TrueSDVals[CC]
9039- : FalseSDVals[CC]);
9029+ if ((CCValidVal & ((1 << (3 - CC)))) != 0 )
9030+ MergedSDValsSet.insert (((CCMaskVal & (1 << (3 - CC))) != 0 )
9031+ ? TrueSDVals[CC]
9032+ : FalseSDVals[CC]);
90409033 }
9041- SmallSet<SDValue, 4 > MergedSDValsSet (MergedSDVals.begin (),
9042- MergedSDVals.end ());
90439034 if (MergedSDValsSet.size () == 1 )
90449035 return *MergedSDValsSet.begin ();
90459036 if (MergedSDValsSet.size () == 2 ) {
@@ -9050,19 +9041,19 @@ SDValue SystemZTargetLowering::combineSELECT_CCMASK(
90509041 int NewCCMask = 0 ;
90519042 for (auto CC : {0 , 1 , 2 , 3 }) {
90529043 NewCCMask <<= 1 ;
9053- NewCCMask |= MergedSDVals[CC] == NewTrueVal;
9044+ NewCCMask |= ((CCMaskVal & (1 << (3 - CC))) != 0 )
9045+ ? (TrueSDVals[CC] == NewTrueVal)
9046+ : (FalseSDVals[CC] == NewTrueVal);
90549047 }
90559048 CCMaskVal = NewCCMask;
9049+ CCMaskVal &= CCValidVal;
90569050 TrueVal = NewTrueVal;
90579051 FalseVal = NewFalseVal;
9058- return DAG.getNode (
9059- SystemZISD::SELECT_CCMASK, SDLoc (N), N->getValueType (0 ), TrueVal,
9060- FalseVal, DAG.getTargetConstant (CCValidVal, SDLoc (N), MVT::i32 ),
9061- DAG.getTargetConstant (CCMaskVal, SDLoc (N), MVT::i32 ), CCReg);
9052+ IsCombinedCCReg = true ;
90629053 }
90639054 }
90649055
9065- if (UpdatedCCReg )
9056+ if (IsCombinedCCReg )
90669057 return DAG.getNode (
90679058 SystemZISD::SELECT_CCMASK, SDLoc (N), N->getValueType (0 ), TrueVal,
90689059 FalseVal, DAG.getTargetConstant (CCValidVal, SDLoc (N), MVT::i32 ),
@@ -9396,6 +9387,7 @@ SDValue SystemZTargetLowering::PerformDAGCombine(SDNode *N,
93969387 case ISD::INTRINSIC_VOID:
93979388 return combineINTRINSIC (N, DCI);
93989389 }
9390+
93999391 return SDValue ();
94009392}
94019393
0 commit comments