[llvm] [RISCV] Add 2^N + 2^M expanding pattern for mul (PR #137954)

Iris Shi via llvm-commits llvm-commits at lists.llvm.org
Wed May 7 22:39:01 PDT 2025


================
@@ -15520,6 +15520,28 @@ static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG,
   return combineSelectAndUseCommutative(N, DAG, /*AllOnes*/ false, Subtarget);
 }
 
+// 2^N +/- 2^M -> (add/sub (shl X, C1), (shl X, C2))
+static SDValue expandMulToAddOrSubOfShl(SDNode *N, SelectionDAG &DAG,
+                                        uint64_t MulAmt) {
+  uint64_t MulAmtLowBit = MulAmt & (-MulAmt);
+  ISD::NodeType Op;
+  if (isPowerOf2_64(MulAmt + MulAmtLowBit))
+    Op = ISD::SUB;
+  else if (isPowerOf2_64(MulAmt - MulAmtLowBit))
+    Op = ISD::ADD;
+  else
+    return SDValue();
+  uint64_t ShiftAmt1 = MulAmt + MulAmtLowBit;
----------------
el-ev wrote:

You're correct. I missed that change, thank you for pointing out.

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


More information about the llvm-commits mailing list