[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