[llvm] [AArch64][InstCombine] Combine add with [su]adalp intrinsics (PR #204796)

Gaƫtan Bossu via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 2 04:51:18 PDT 2026


================
@@ -2598,6 +2598,32 @@ instCombineSVEVectorMlaU(InstCombiner &IC, IntrinsicInst &II) {
   return std::nullopt;
 }
 
+static std::optional<Instruction *>
+instCombineSVEPairwiseAddLong(InstCombiner &IC, IntrinsicInst &II) {
+  assert((II.getIntrinsicID() == Intrinsic::aarch64_sve_sadalp ||
+          II.getIntrinsicID() == Intrinsic::aarch64_sve_uadalp) &&
+         "Expected SADALP or UADALP intrinsic");
+
+  // We are looking for add(adalp(%pred, zeroinitializer, %in), %acc)
+  if (!II.hasOneUse() || !match(II.getArgOperand(1), m_Zero()))
+    return std::nullopt;
+
+  auto *User = cast<Instruction>(*II.user_begin());
+  Value *Acc;
+  if (!match(User, m_c_Add(m_Specific(&II), m_Value(Acc))))
+    return std::nullopt;
+
+  IC.Builder.SetInsertPoint(User);
+  Value *PairwiseAddLong = IC.Builder.CreateIntrinsic(
+      II.getIntrinsicID(), {II.getType()},
+      {II.getArgOperand(0), Acc, II.getArgOperand(2)});
+
+  IC.replaceInstUsesWith(*User, PairwiseAddLong);
+  IC.eraseInstFromFunction(*User);
+  IC.eraseInstFromFunction(II);
----------------
gbossu wrote:

If you prefer, I can replace
```
IC.eraseInstFromFunction(II);
return nullptr;
```
with
```
return &II; // II is now trivially dead and will get erased.
```
This is equivalent.

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


More information about the llvm-commits mailing list