[llvm] [SLP]Delete combined subnodes together with the trimmed combined root (PR #219180)

via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 27 04:17:08 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Alexey Bataev (alexey-bataev)

<details>
<summary>Changes</summary>

Skipping CombinedVectorize entries in subtree-cost aggregation also
dropped them from the ancestors' subtree node lists, so trimming a
combined root left its combined subnodes live but never vectorized.


---
Full diff: https://github.com/llvm/llvm-project/pull/219180.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp (+3-4) 
- (added) llvm/test/Transforms/SLPVectorizer/X86/trim-root-with-combined-node.ll (+35) 


``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index e5211a198acdd..358901da42266 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -19517,10 +19517,9 @@ BoUpSLP::calculateTreeCostAndTrimNonProfitable(ArrayRef<Value *> VectorizedVals,
       };
   for (const std::unique_ptr<TreeEntry> &Ptr : VectorizableTree) {
     TreeEntry &TE = *Ptr;
-    // Combined subnodes are not costed on their own, only as a whole combined
-    // node, so only the root nodes are considered.
-    if (TE.State == TreeEntry::CombinedVectorize)
-      continue;
+    // Combined subnodes are not costed on their own (their cost is 0), but
+    // must be included into the ancestors' subtree node lists, so that they
+    // get deleted together with the trimmed combined root.
     InstructionCost C = NodesCosts.at(&TE);
     InstructionCost ExtractCost = ExtractCosts.lookup(&TE);
     std::get<0>(SubtreeCosts[TE.Idx]) += C + ExtractCost;
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/trim-root-with-combined-node.ll b/llvm/test/Transforms/SLPVectorizer/X86/trim-root-with-combined-node.ll
new file mode 100644
index 0000000000000..c5281bfbff04e
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/trim-root-with-combined-node.ll
@@ -0,0 +1,35 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
+
+define void @test(ptr %this, double %0) {
+; CHECK-LABEL: define void @test(
+; CHECK-SAME: ptr [[THIS:%.*]], double [[TMP0:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[TMP0]], i64 0
+; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x double> [[TMP1]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP3:%.*]] = fmul <2 x double> [[TMP2]], zeroinitializer
+; CHECK-NEXT:    [[PIXEL00_LOC:%.*]] = getelementptr i8, ptr [[THIS]], i64 144
+; CHECK-NEXT:    [[MUL23_I:%.*]] = fmul contract double [[TMP0]], 0.000000e+00
+; CHECK-NEXT:    [[TMP4:%.*]] = fadd contract <2 x double> [[TMP3]], <double -0.000000e+00, double 0.000000e+00>
+; CHECK-NEXT:    [[TMP5:%.*]] = fsub <2 x double> zeroinitializer, [[TMP4]]
+; CHECK-NEXT:    [[TMP6:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> poison, <2 x i32> <i32 1, i32 poison>
+; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x double> [[TMP6]], double [[MUL23_I]], i64 1
+; CHECK-NEXT:    [[TMP8:%.*]] = fsub <2 x double> [[TMP5]], [[TMP7]]
+; CHECK-NEXT:    store <2 x double> [[TMP8]], ptr [[PIXEL00_LOC]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  %mul.i.i141 = fmul double %0, 0.000000e+00
+  %sub.i148 = fsub double 0.000000e+00, %mul.i.i141
+  %mul12.i = fmul contract double %0, 0.000000e+00
+  %sub18.i = fadd contract double %mul12.i, 0.000000e+00
+  %sub.i165 = fsub double %sub.i148, %sub18.i
+  %pixel00_loc = getelementptr i8, ptr %this, i64 144
+  store double %sub.i165, ptr %pixel00_loc, align 8
+  %sub7.i151 = fsub double 0.000000e+00, %sub18.i
+  %mul23.i = fmul contract double %0, 0.000000e+00
+  %sub7.i168 = fsub double %sub7.i151, %mul23.i
+  %ref.tmp43.sroa.4.0.pixel00_loc.sroa_idx = getelementptr i8, ptr %this, i64 152
+  store double %sub7.i168, ptr %ref.tmp43.sroa.4.0.pixel00_loc.sroa_idx, align 8
+  ret void
+}

``````````

</details>


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


More information about the llvm-commits mailing list