[llvm] [ComplexDeinterleaving] Preserve duplicate reassoc addends in identifyReassocNodes (PR #205578)

Igor Kirillov via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 25 07:35:35 PDT 2026


https://github.com/igogo-x86 updated https://github.com/llvm/llvm-project/pull/205578

>From c8d6141484a35dbd5bf7a088caa5db2330f770cc Mon Sep 17 00:00:00 2001
From: Igor Kirillov <igor.kirillov at arm.com>
Date: Wed, 24 Jun 2026 15:34:23 +0000
Subject: [PATCH] [ComplexDeinterleaving] Preserve duplicate reassoc addends in
 identifyReassocNodes

Fixes #205197
---
 llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp      |  3 ---
 .../complex-deinterleaving-reassoc-duplicates.ll    | 13 +++++++------
 2 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
index 60eb96fc5de1b..60a660557a0f3 100644
--- a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
+++ b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
@@ -1245,11 +1245,8 @@ ComplexDeinterleavingGraph::identifyReassocNodes(Instruction *Real,
   auto Collect = [&Flags](Instruction *Insn, SmallVectorImpl<Product> &Muls,
                           AddendList &Addends) -> bool {
     SmallVector<PointerIntPair<Value *, 1, bool>> Worklist = {{Insn, true}};
-    SmallPtrSet<Value *, 8> Visited;
     while (!Worklist.empty()) {
       auto [V, IsPositive] = Worklist.pop_back_val();
-      if (!Visited.insert(V).second)
-        continue;
 
       Instruction *I = dyn_cast<Instruction>(V);
       if (!I) {
diff --git a/llvm/test/CodeGen/AArch64/complex-deinterleaving-reassoc-duplicates.ll b/llvm/test/CodeGen/AArch64/complex-deinterleaving-reassoc-duplicates.ll
index d29a850916c91..f569b606c6d3f 100644
--- a/llvm/test/CodeGen/AArch64/complex-deinterleaving-reassoc-duplicates.ll
+++ b/llvm/test/CodeGen/AArch64/complex-deinterleaving-reassoc-duplicates.ll
@@ -5,17 +5,18 @@ define <2 x double> @repeated_imaginary_addend(i1 %c) {
 ; CHECK-LABEL: define <2 x double> @repeated_imaginary_addend(
 ; CHECK-SAME: i1 [[C:%.*]]) #[[ATTR0:[0-9]+]] {
 ; CHECK-NEXT:  [[ENTRY:.*]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = call <4 x double> @llvm.vector.interleave2.v4f64(<2 x double> zeroinitializer, <2 x double> zeroinitializer)
 ; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
 ; CHECK:       [[VECTOR_BODY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <4 x double> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[VECTOR_BODY]] ]
-; CHECK-NEXT:    [[TMP2]] = fadd reassoc contract <4 x double> zeroinitializer, [[TMP1]]
+; CHECK-NEXT:    [[ACC_R:%.*]] = phi <2 x double> [ zeroinitializer, %[[ENTRY]] ], [ [[ACC_R_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT:    [[ACC_I:%.*]] = phi <2 x double> [ zeroinitializer, %[[ENTRY]] ], [ [[ACC_I_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; CHECK-NEXT:    [[R_ADDEND:%.*]] = shufflevector <4 x double> zeroinitializer, <4 x double> zeroinitializer, <2 x i32> <i32 0, i32 2>
+; CHECK-NEXT:    [[ACC_R_NEXT]] = fadd reassoc contract <2 x double> [[R_ADDEND]], [[ACC_R]]
+; CHECK-NEXT:    [[I_ADDEND:%.*]] = shufflevector <4 x double> zeroinitializer, <4 x double> zeroinitializer, <2 x i32> <i32 1, i32 3>
+; CHECK-NEXT:    [[ACC_I_TMP:%.*]] = fadd reassoc contract <2 x double> [[ACC_I]], [[I_ADDEND]]
+; CHECK-NEXT:    [[ACC_I_NEXT]] = fadd reassoc contract <2 x double> [[I_ADDEND]], [[ACC_I_TMP]]
 ; CHECK-NEXT:    br i1 [[C]], label %[[EXIT:.*]], label %[[VECTOR_BODY]]
 ; CHECK:       [[EXIT]]:
-; CHECK-NEXT:    [[TMP3:%.*]] = call { <2 x double>, <2 x double> } @llvm.vector.deinterleave2.v4f64(<4 x double> [[TMP2]])
-; CHECK-NEXT:    [[ACC_R_NEXT:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP3]], 0
 ; CHECK-NEXT:    [[REAL_USE:%.*]] = fadd <2 x double> [[ACC_R_NEXT]], zeroinitializer
-; CHECK-NEXT:    [[ACC_I_NEXT:%.*]] = extractvalue { <2 x double>, <2 x double> } [[TMP3]], 1
 ; CHECK-NEXT:    ret <2 x double> [[ACC_I_NEXT]]
 ;
 entry:



More information about the llvm-commits mailing list