[llvm] DAGCombiner: (srl/sra (add nuw/nsw X, c), d) --> (add nuw/nsw (srl/sra X, d), c >> d) (PR #196379)

Jay Foad via llvm-commits llvm-commits at lists.llvm.org
Fri May 8 03:06:03 PDT 2026


================
@@ -11428,6 +11428,24 @@ SDValue DAGCombiner::visitSRA(SDNode *N) {
     }
   }
 
+  // fold (sra (add nsw X, C), D) -> (add nsw (sra X, D), C s>> D)
+  // when C has D trailing zeros (so C s>> D is exact).
+  if (N1C && N0.hasOneUse() && N0.getOpcode() == ISD::ADD &&
+      N0->getFlags().hasNoSignedWrap()) {
+    if (ConstantSDNode *AddC = isConstOrConstSplat(N0.getOperand(1))) {
+      uint64_t ShAmt = N1C->getZExtValue();
----------------
jayfoad wrote:

Being super picky, do you need to do something here to guard against N1C being wildly out of range?

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


More information about the llvm-commits mailing list