[llvm] bcddf2a - [SLP][NFC]Add some extra tests for reductions, NFC

via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 31 05:04:12 PDT 2026


Author: Alexey Bataev
Date: 2026-07-31T08:04:07-04:00
New Revision: bcddf2a29177380c62481ee25362064f99ff07d3

URL: https://github.com/llvm/llvm-project/commit/bcddf2a29177380c62481ee25362064f99ff07d3
DIFF: https://github.com/llvm/llvm-project/commit/bcddf2a29177380c62481ee25362064f99ff07d3.diff

LOG: [SLP][NFC]Add some extra tests for reductions, NFC



Reviewers: 

Pull Request: https://github.com/llvm/llvm-project/pull/213257

Added: 
    llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll b/llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll
new file mode 100644
index 0000000000000..0c629cec2c827
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/reduction-fadd-reassoc.ll
@@ -0,0 +1,142 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S -passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s
+
+; Reassociation is enough to vectorize fadd reductions, nsz is not required.
+
+define double @reassoc_only(ptr %p) {
+; CHECK-LABEL: define double @reassoc_only(
+; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[L0:%.*]] = load double, ptr [[P]], align 8
+; CHECK-NEXT:    [[P1:%.*]] = getelementptr double, ptr [[P]], i64 1
+; CHECK-NEXT:    [[L1:%.*]] = load double, ptr [[P1]], align 8
+; CHECK-NEXT:    [[P2:%.*]] = getelementptr double, ptr [[P]], i64 2
+; CHECK-NEXT:    [[L2:%.*]] = load double, ptr [[P2]], align 8
+; CHECK-NEXT:    [[P3:%.*]] = getelementptr double, ptr [[P]], i64 3
+; CHECK-NEXT:    [[L3:%.*]] = load double, ptr [[P3]], align 8
+; CHECK-NEXT:    [[P4:%.*]] = getelementptr double, ptr [[P]], i64 4
+; CHECK-NEXT:    [[L4:%.*]] = load double, ptr [[P4]], align 8
+; CHECK-NEXT:    [[P5:%.*]] = getelementptr double, ptr [[P]], i64 5
+; CHECK-NEXT:    [[L5:%.*]] = load double, ptr [[P5]], align 8
+; CHECK-NEXT:    [[P6:%.*]] = getelementptr double, ptr [[P]], i64 6
+; CHECK-NEXT:    [[L6:%.*]] = load double, ptr [[P6]], align 8
+; CHECK-NEXT:    [[P7:%.*]] = getelementptr double, ptr [[P]], i64 7
+; CHECK-NEXT:    [[L7:%.*]] = load double, ptr [[P7]], align 8
+; CHECK-NEXT:    [[C1:%.*]] = fadd reassoc double [[L0]], [[L1]]
+; CHECK-NEXT:    [[C2:%.*]] = fadd reassoc double [[C1]], [[L2]]
+; CHECK-NEXT:    [[C3:%.*]] = fadd reassoc double [[C2]], [[L3]]
+; CHECK-NEXT:    [[C4:%.*]] = fadd reassoc double [[C3]], [[L4]]
+; CHECK-NEXT:    [[C5:%.*]] = fadd reassoc double [[C4]], [[L5]]
+; CHECK-NEXT:    [[C6:%.*]] = fadd reassoc double [[C5]], [[L6]]
+; CHECK-NEXT:    [[TMP1:%.*]] = fadd reassoc double [[C6]], [[L7]]
+; CHECK-NEXT:    ret double [[TMP1]]
+;
+entry:
+  %l0 = load double, ptr %p, align 8
+  %p1 = getelementptr double, ptr %p, i64 1
+  %l1 = load double, ptr %p1, align 8
+  %p2 = getelementptr double, ptr %p, i64 2
+  %l2 = load double, ptr %p2, align 8
+  %p3 = getelementptr double, ptr %p, i64 3
+  %l3 = load double, ptr %p3, align 8
+  %p4 = getelementptr double, ptr %p, i64 4
+  %l4 = load double, ptr %p4, align 8
+  %p5 = getelementptr double, ptr %p, i64 5
+  %l5 = load double, ptr %p5, align 8
+  %p6 = getelementptr double, ptr %p, i64 6
+  %l6 = load double, ptr %p6, align 8
+  %p7 = getelementptr double, ptr %p, i64 7
+  %l7 = load double, ptr %p7, align 8
+  %c1 = fadd reassoc double %l0, %l1
+  %c2 = fadd reassoc double %c1, %l2
+  %c3 = fadd reassoc double %c2, %l3
+  %c4 = fadd reassoc double %c3, %l4
+  %c5 = fadd reassoc double %c4, %l5
+  %c6 = fadd reassoc double %c5, %l6
+  %c7 = fadd reassoc double %c6, %l7
+  ret double %c7
+}
+
+; Repeated reduced values are scaled by a multiplier, also with reassoc only.
+
+define double @reassoc_repeated_vals(double %x) {
+; CHECK-LABEL: define double @reassoc_repeated_vals(
+; CHECK-SAME: double [[X:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[C1:%.*]] = fadd reassoc double [[X]], [[X]]
+; CHECK-NEXT:    [[C2:%.*]] = fadd reassoc double [[C1]], [[X]]
+; CHECK-NEXT:    [[C3:%.*]] = fadd reassoc double [[C2]], [[X]]
+; CHECK-NEXT:    [[C4:%.*]] = fadd reassoc double [[C3]], [[X]]
+; CHECK-NEXT:    [[C5:%.*]] = fadd reassoc double [[C4]], [[X]]
+; CHECK-NEXT:    [[C6:%.*]] = fadd reassoc double [[C5]], [[X]]
+; CHECK-NEXT:    [[C7:%.*]] = fadd reassoc double [[C6]], [[X]]
+; CHECK-NEXT:    [[TMP0:%.*]] = fadd reassoc double [[C7]], [[X]]
+; CHECK-NEXT:    ret double [[TMP0]]
+;
+entry:
+  %c1 = fadd reassoc double %x, %x
+  %c2 = fadd reassoc double %c1, %x
+  %c3 = fadd reassoc double %c2, %x
+  %c4 = fadd reassoc double %c3, %x
+  %c5 = fadd reassoc double %c4, %x
+  %c6 = fadd reassoc double %c5, %x
+  %c7 = fadd reassoc double %c6, %x
+  %c8 = fadd reassoc double %c7, %x
+  ret double %c8
+}
+
+; Without reassoc the reduction must keep the sequential order.
+
+define double @no_reassoc(ptr %p) {
+; CHECK-LABEL: define double @no_reassoc(
+; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[L0:%.*]] = load double, ptr [[P]], align 8
+; CHECK-NEXT:    [[P1:%.*]] = getelementptr double, ptr [[P]], i64 1
+; CHECK-NEXT:    [[L1:%.*]] = load double, ptr [[P1]], align 8
+; CHECK-NEXT:    [[P2:%.*]] = getelementptr double, ptr [[P]], i64 2
+; CHECK-NEXT:    [[L2:%.*]] = load double, ptr [[P2]], align 8
+; CHECK-NEXT:    [[P3:%.*]] = getelementptr double, ptr [[P]], i64 3
+; CHECK-NEXT:    [[L3:%.*]] = load double, ptr [[P3]], align 8
+; CHECK-NEXT:    [[P4:%.*]] = getelementptr double, ptr [[P]], i64 4
+; CHECK-NEXT:    [[L4:%.*]] = load double, ptr [[P4]], align 8
+; CHECK-NEXT:    [[P5:%.*]] = getelementptr double, ptr [[P]], i64 5
+; CHECK-NEXT:    [[L5:%.*]] = load double, ptr [[P5]], align 8
+; CHECK-NEXT:    [[P6:%.*]] = getelementptr double, ptr [[P]], i64 6
+; CHECK-NEXT:    [[L6:%.*]] = load double, ptr [[P6]], align 8
+; CHECK-NEXT:    [[P7:%.*]] = getelementptr double, ptr [[P]], i64 7
+; CHECK-NEXT:    [[L7:%.*]] = load double, ptr [[P7]], align 8
+; CHECK-NEXT:    [[C1:%.*]] = fadd double [[L0]], [[L1]]
+; CHECK-NEXT:    [[C2:%.*]] = fadd double [[C1]], [[L2]]
+; CHECK-NEXT:    [[C3:%.*]] = fadd double [[C2]], [[L3]]
+; CHECK-NEXT:    [[C4:%.*]] = fadd double [[C3]], [[L4]]
+; CHECK-NEXT:    [[C5:%.*]] = fadd double [[C4]], [[L5]]
+; CHECK-NEXT:    [[C6:%.*]] = fadd double [[C5]], [[L6]]
+; CHECK-NEXT:    [[C7:%.*]] = fadd double [[C6]], [[L7]]
+; CHECK-NEXT:    ret double [[C7]]
+;
+entry:
+  %l0 = load double, ptr %p, align 8
+  %p1 = getelementptr double, ptr %p, i64 1
+  %l1 = load double, ptr %p1, align 8
+  %p2 = getelementptr double, ptr %p, i64 2
+  %l2 = load double, ptr %p2, align 8
+  %p3 = getelementptr double, ptr %p, i64 3
+  %l3 = load double, ptr %p3, align 8
+  %p4 = getelementptr double, ptr %p, i64 4
+  %l4 = load double, ptr %p4, align 8
+  %p5 = getelementptr double, ptr %p, i64 5
+  %l5 = load double, ptr %p5, align 8
+  %p6 = getelementptr double, ptr %p, i64 6
+  %l6 = load double, ptr %p6, align 8
+  %p7 = getelementptr double, ptr %p, i64 7
+  %l7 = load double, ptr %p7, align 8
+  %c1 = fadd double %l0, %l1
+  %c2 = fadd double %c1, %l2
+  %c3 = fadd double %c2, %l3
+  %c4 = fadd double %c3, %l4
+  %c5 = fadd double %c4, %l5
+  %c6 = fadd double %c5, %l6
+  %c7 = fadd double %c6, %l7
+  ret double %c7
+}


        


More information about the llvm-commits mailing list