================ @@ -12112,18 +12138,36 @@ void SelectionDAGBuilder::lowerWorkItem(SwitchWorkListItem W, Value *Cond, const APInt &SmallValue = Small.Low->getValue(); const APInt &BigValue = Big.Low->getValue(); + // Incoming IR is switch table.Identify SRL/IPM/CC sequence for SystemZ + // and we want to avoid splitting condition code sequence across basic + // block for cases like (CC == 0) || (CC == 2) || (CC == 3), or + // (CC == 0) || (CC == 1) ^ (CC == 3), there could potentially be + // more cases like this. + const TargetLowering &TLI = DAG.getTargetLoweringInfo(); + bool IsSrlIPM = false; + if (NodeMap.count(Cond) && NodeMap[Cond].getNode()) + IsSrlIPM = TLI.canLowerSRL_IPM_Switch(getValue(Cond)); // Check that there is only one bit different. APInt CommonBit = BigValue ^ SmallValue; - if (CommonBit.isPowerOf2()) { + if (CommonBit.isPowerOf2() || IsSrlIPM) { SDValue CondLHS = getValue(Cond); EVT VT = CondLHS.getValueType(); SDLoc DL = getCurSDLoc(); - - SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS, - DAG.getConstant(CommonBit, DL, VT)); - SDValue Cond = DAG.getSetCC( - DL, MVT::i1, Or, DAG.getConstant(BigValue | SmallValue, DL, VT), - ISD::SETEQ); + SDValue Cond; + + if (CommonBit.isPowerOf2()) { + SDValue Or = DAG.getNode(ISD::OR, DL, VT, CondLHS, + DAG.getConstant(CommonBit, DL, VT)); + Cond = DAG.getSetCC(DL, MVT::i1, Or, + DAG.getConstant(BigValue | SmallValue, DL, VT), + ISD::SETEQ); + } else if (IsSrlIPM && BigValue == 3 && SmallValue == 0) { + SDValue SetCC = + DAG.getSetCC(DL, MVT::i32, CondLHS, + DAG.getConstant(SmallValue, DL, VT), ISD::SETEQ); + Cond = DAG.getSetCC(DL, MVT::i32, SetCC, + DAG.getConstant(BigValue, DL, VT), ISD::SETEQ); + } ---------------- uweigand wrote:
Again, this very SystemZ specific optimization shouldn't really be here. Doesn't this just revert the decision to introduce a switch statement that was made above? Could this not handled either by the `visitBr` above via the `getJumpConditionMergingParams` callback; or else fully in SystemZ DAGCombine code? https://github.com/llvm/llvm-project/pull/125970 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits