[llvm] [RISCV] Combine `(setcc (riscv_selectcc A, B, ...), Y)` to just `(setcc A, B)` when possible (PR #90538)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 29 20:00:44 PDT 2024


================
@@ -13678,9 +13679,69 @@ static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG,
                                    const RISCVSubtarget &Subtarget) {
   SDValue N0 = N->getOperand(0);
   SDValue N1 = N->getOperand(1);
+  ISD::CondCode Cond = cast<CondCodeSDNode>(N->getOperand(2))->get();
   EVT VT = N->getValueType(0);
   EVT OpVT = N0.getValueType();
+  SDLoc DL(N);
+
+  // Both rules are looking for an equality compare.
+  if (!isIntEqualitySetCC(Cond))
+    return SDValue();
+
+  // Rule 1
+  using namespace SDPatternMatch;
+  auto getSelectCCPattern = [](SDValue Candidate, bool Inverse,
+                               SDValue &Select) -> auto {
+    if (Inverse)
+      return m_AllOf(
+          m_OneUse(m_Node(RISCVISD::SELECT_CC, m_Value(), m_Value(), m_Value(),
+                          /*TrueVal=*/m_Value(),
+                          /*FalseVal=*/m_Specific(Candidate))),
+          m_Value(Select));
+    else
+      return m_AllOf(
+          m_OneUse(m_Node(RISCVISD::SELECT_CC, m_Value(), m_Value(), m_Value(),
+                          /*TrueVal=*/m_Specific(Candidate),
+                          /*FalseVal=*/m_Value())),
+          m_Value(Select));
+  };
+
+  auto buildSetCC = [&](SDValue Select, bool Inverse) -> SDValue {
+    ISD::CondCode NewCC = cast<CondCodeSDNode>(Select->getOperand(2))->get();
+    if (Inverse)
+      NewCC = ISD::getSetCCInverse(NewCC, OpVT);
+    return DAG.getNode(
+        ISD::SETCC, DL, VT,
+        {Select->getOperand(0), Select->getOperand(1), DAG.getCondCode(NewCC)},
+        N->getFlags());
+  };
 
+  SDValue SelectVal;
+  if (sd_match(N0, getSelectCCPattern(N1, false, SelectVal)) ||
+      sd_match(N1, getSelectCCPattern(N0, false, SelectVal))) {
+    if (Cond == ISD::SETEQ) {
+      // (seteq (SELECT_CC LHS, RHS, CC, N1, X), N1) => (setCC LHS, RHS)
----------------
topperc wrote:

Do we need to know that X can't be equal to N1?

https://github.com/llvm/llvm-project/pull/90538


More information about the llvm-commits mailing list