[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