[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