[llvm] [DAG] foldShiftToAvg - recognize sub(x, xor(y, -1)) >> 1 as avgceil[su] (PR #182616)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 2 05:48:54 PDT 2026
================
@@ -12441,20 +12471,37 @@ SDValue DAGCombiner::foldShiftToAvg(SDNode *N, const SDLoc &DL) {
EVT VT = N->getValueType(0);
bool IsUnsigned = Opcode == ISD::SRL;
- // Captured values.
- SDValue A, B;
+ SDValue X, Y, XorRHS;
+ // Fold (sra/srl (x - (y ^ -1)), 1) -> avgceil[su](x, y)
+ // Since (y ^ -1) == ~y and (x - ~y) == (x + y + 1)
+ if (sd_match(N, m_BinOp(Opcode,
+ m_Sub(m_Value(X), m_Xor(m_Value(Y), m_Value(XorRHS))),
----------------
RKSimon wrote:
```suggestion
m_Sub(m_Value(X), m_Not(m_Value(Y))),
```
https://github.com/llvm/llvm-project/pull/182616
More information about the llvm-commits
mailing list