[llvm] 0c0d9ff - [SLP][NFC]Add a test with fmuladd copyables candidates, NFC

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 20 08:47:56 PDT 2026


Author: Alexey Bataev
Date: 2026-07-20T11:47:50-04:00
New Revision: 0c0d9ff3b01b5709bda34198a01da2f19b88650e

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

LOG: [SLP][NFC]Add a test with fmuladd copyables candidates, NFC



Reviewers: 

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

Added: 
    llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-add-part.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-add-part.ll b/llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-add-part.ll
new file mode 100644
index 0000000000000..3cdbff46e83c5
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-add-part.ll
@@ -0,0 +1,119 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=slp-vectorizer -slp-threshold=-99999 -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,ENABLED
+; RUN: opt -passes=slp-vectorizer -slp-threshold=-99999 -slp-copyable-elements=false -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,DISABLED
+
+declare double @llvm.fmuladd.f64(double, double, double)
+
+define void @test_main_opcode(ptr %dst, ptr %srcA, ptr %srcB, ptr %srcC) {
+; CHECK-LABEL: define void @test_main_opcode(
+; CHECK-SAME: ptr [[DST:%.*]], ptr [[SRCA:%.*]], ptr [[SRCB:%.*]], ptr [[SRCC:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[GEPC2:%.*]] = getelementptr double, ptr [[SRCC]], i32 2
+; CHECK-NEXT:    [[D2:%.*]] = getelementptr double, ptr [[DST]], i32 2
+; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr [[GEPC2]], align 8
+; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[SRCA]], align 8
+; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x double>, ptr [[SRCB]], align 8
+; CHECK-NEXT:    [[TMP3:%.*]] = load <2 x double>, ptr [[SRCC]], align 8
+; CHECK-NEXT:    [[TMP4:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP1]], <2 x double> [[TMP2]], <2 x double> [[TMP3]])
+; CHECK-NEXT:    store <2 x double> [[TMP4]], ptr [[DST]], align 8
+; CHECK-NEXT:    store <2 x double> [[TMP0]], ptr [[D2]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  %a0 = load double, ptr %srcA, align 8
+  %gepA1 = getelementptr double, ptr %srcA, i32 1
+  %a1 = load double, ptr %gepA1, align 8
+  %b0 = load double, ptr %srcB, align 8
+  %gepB1 = getelementptr double, ptr %srcB, i32 1
+  %b1 = load double, ptr %gepB1, align 8
+  %c0 = load double, ptr %srcC, align 8
+  %gepC1 = getelementptr double, ptr %srcC, i32 1
+  %c1 = load double, ptr %gepC1, align 8
+  %gepC2 = getelementptr double, ptr %srcC, i32 2
+  %x = load double, ptr %gepC2, align 8
+  %gepC3 = getelementptr double, ptr %srcC, i32 3
+  %y = load double, ptr %gepC3, align 8
+  %fma0 = call double @llvm.fmuladd.f64(double %a0, double %b0, double %c0)
+  %fma1 = call double @llvm.fmuladd.f64(double %a1, double %b1, double %c1)
+  store double %fma0, ptr %dst, align 8
+  %d1 = getelementptr double, ptr %dst, i32 1
+  store double %fma1, ptr %d1, align 8
+  %d2 = getelementptr double, ptr %dst, i32 2
+  store double %x, ptr %d2, align 8
+  %d3 = getelementptr double, ptr %dst, i32 3
+  store double %y, ptr %d3, align 8
+  ret void
+}
+
+define void @test_main_opcode_fadd_copyable(ptr %dst, ptr %srcA, ptr %srcB, ptr %srcC, double %p, double %q) {
+; ENABLED-LABEL: define void @test_main_opcode_fadd_copyable(
+; ENABLED-SAME: ptr [[DST:%.*]], ptr [[SRCA:%.*]], ptr [[SRCB:%.*]], ptr [[SRCC:%.*]], double [[P:%.*]], double [[Q:%.*]]) {
+; ENABLED-NEXT:  [[ENTRY:.*:]]
+; ENABLED-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr [[SRCA]], align 8
+; ENABLED-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[SRCB]], align 8
+; ENABLED-NEXT:    [[TMP2:%.*]] = load <2 x double>, ptr [[SRCC]], align 8
+; ENABLED-NEXT:    [[TMP3:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]], <2 x double> [[TMP2]])
+; ENABLED-NEXT:    store <2 x double> [[TMP3]], ptr [[DST]], align 8
+; ENABLED-NEXT:    [[D2:%.*]] = getelementptr double, ptr [[DST]], i32 2
+; ENABLED-NEXT:    [[TMP4:%.*]] = insertelement <2 x double> <double poison, double -0.000000e+00>, double [[P]], i64 0
+; ENABLED-NEXT:    [[TMP5:%.*]] = insertelement <2 x double> poison, double [[Q]], i64 0
+; ENABLED-NEXT:    [[TMP6:%.*]] = shufflevector <2 x double> [[TMP5]], <2 x double> poison, <2 x i32> zeroinitializer
+; ENABLED-NEXT:    [[TMP7:%.*]] = fadd <2 x double> [[TMP4]], [[TMP6]]
+; ENABLED-NEXT:    store <2 x double> [[TMP7]], ptr [[D2]], align 8
+; ENABLED-NEXT:    ret void
+;
+; DISABLED-LABEL: define void @test_main_opcode_fadd_copyable(
+; DISABLED-SAME: ptr [[DST:%.*]], ptr [[SRCA:%.*]], ptr [[SRCB:%.*]], ptr [[SRCC:%.*]], double [[P:%.*]], double [[Q:%.*]]) {
+; DISABLED-NEXT:  [[ENTRY:.*:]]
+; DISABLED-NEXT:    [[FADD:%.*]] = fadd double [[P]], [[Q]]
+; DISABLED-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr [[SRCA]], align 8
+; DISABLED-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[SRCB]], align 8
+; DISABLED-NEXT:    [[TMP2:%.*]] = load <2 x double>, ptr [[SRCC]], align 8
+; DISABLED-NEXT:    [[TMP3:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP0]], <2 x double> [[TMP1]], <2 x double> [[TMP2]])
+; DISABLED-NEXT:    store <2 x double> [[TMP3]], ptr [[DST]], align 8
+; DISABLED-NEXT:    [[D2:%.*]] = getelementptr double, ptr [[DST]], i32 2
+; DISABLED-NEXT:    store double [[FADD]], ptr [[D2]], align 8
+; DISABLED-NEXT:    [[D3:%.*]] = getelementptr double, ptr [[DST]], i32 3
+; DISABLED-NEXT:    store double [[Q]], ptr [[D3]], align 8
+; DISABLED-NEXT:    ret void
+;
+entry:
+  %a0 = load double, ptr %srcA, align 8
+  %gepA1 = getelementptr double, ptr %srcA, i32 1
+  %a1 = load double, ptr %gepA1, align 8
+  %b0 = load double, ptr %srcB, align 8
+  %gepB1 = getelementptr double, ptr %srcB, i32 1
+  %b1 = load double, ptr %gepB1, align 8
+  %c0 = load double, ptr %srcC, align 8
+  %gepC1 = getelementptr double, ptr %srcC, i32 1
+  %c1 = load double, ptr %gepC1, align 8
+  %fadd = fadd double %p, %q
+  %fma0 = call double @llvm.fmuladd.f64(double %a0, double %b0, double %c0)
+  %fma1 = call double @llvm.fmuladd.f64(double %a1, double %b1, double %c1)
+  store double %fma0, ptr %dst, align 8
+  %d1 = getelementptr double, ptr %dst, i32 1
+  store double %fma1, ptr %d1, align 8
+  %d2 = getelementptr double, ptr %dst, i32 2
+  store double %fadd, ptr %d2, align 8
+  %d3 = getelementptr double, ptr %dst, i32 3
+  store double %q, ptr %d3, align 8
+  ret void
+}
+
+define void @test_two_lanes(ptr %dst, double %a0, double %b0, double %c0, double %x) {
+; CHECK-LABEL: define void @test_two_lanes(
+; CHECK-SAME: ptr [[DST:%.*]], double [[A0:%.*]], double [[B0:%.*]], double [[C0:%.*]], double [[X:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[FMA0:%.*]] = call double @llvm.fmuladd.f64(double [[A0]], double [[B0]], double [[C0]])
+; CHECK-NEXT:    store double [[FMA0]], ptr [[DST]], align 8
+; CHECK-NEXT:    [[D1:%.*]] = getelementptr double, ptr [[DST]], i32 1
+; CHECK-NEXT:    store double [[X]], ptr [[D1]], align 8
+; CHECK-NEXT:    ret void
+;
+entry:
+  %fma0 = call double @llvm.fmuladd.f64(double %a0, double %b0, double %c0)
+  store double %fma0, ptr %dst, align 8
+  %d1 = getelementptr double, ptr %dst, i32 1
+  store double %x, ptr %d1, align 8
+  ret void
+}


        


More information about the llvm-commits mailing list