[llvm] Fold (select_cc (select cond, x, y), x, a, b, eq) to (select cond, a, b) (PR #199688)
Krzysztof Drewniak via llvm-commits
llvm-commits at lists.llvm.org
Tue May 26 11:58:31 PDT 2026
================
@@ -13013,6 +13013,72 @@ SDValue DAGCombiner::foldSelectToUMin(SDValue LHS, SDValue RHS, SDValue True,
return SDValue();
}
+/// Fold:
+/// select_cc (select C, TV, FV), CmpC, TrueV, FalseV, seteq
+/// -> select C, TrueV, FalseV
+/// select_cc (select C, TV, FV), CmpC, TrueV, FalseV, setne
+/// -> select C, FalseV, TrueV
+/// and the same with CmpC on the LHS of the comparison. TV and FV must be
+/// distinct integer constants. Also used for select (setcc ...).
+static SDValue foldSelectOfSelectCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
+ SDValue TrueV, SDValue FalseV,
+ const SDLoc &DL, EVT VT, SelectionDAG &DAG,
+ SDNodeFlags Flags) {
+ if (CC != ISD::SETEQ && CC != ISD::SETNE)
+ return SDValue();
+
+ SDValue InnerSel;
+ SDValue CmpC;
+ if (LHS.getOpcode() == ISD::SELECT) {
+ InnerSel = LHS;
+ CmpC = RHS;
+ } else if (RHS.getOpcode() == ISD::SELECT) {
+ InnerSel = RHS;
+ CmpC = LHS;
+ } else
+ return SDValue();
+
+ SDValue Cond = InnerSel.getOperand(0);
+ SDValue InnerTV = InnerSel.getOperand(1);
+ SDValue InnerFV = InnerSel.getOperand(2);
+
+ auto *CTV = dyn_cast<ConstantSDNode>(InnerTV);
+ auto *CFV = dyn_cast<ConstantSDNode>(InnerFV);
+ auto *CCnst = dyn_cast<ConstantSDNode>(CmpC);
+ if (!CTV || !CFV || !CCnst)
+ return SDValue();
+
+ // If one of the constants is opaque, the SDNodes may differ while the values
----------------
krzysz00 wrote:
General question: why is this limited to constants?
Also, would a small test showing the impact of this pattern in isolation be possible?
https://github.com/llvm/llvm-project/pull/199688
More information about the llvm-commits
mailing list