[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