[llvm] [SLP][NFC]Add a test with nother candidate for fmuladd copyables, NFC (PR #212802)

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 29 08:44:01 PDT 2026


https://github.com/alexey-bataev created https://github.com/llvm/llvm-project/pull/212802

None

>From 62e269e85482e39e7a4781b9d5e48d2b11e34fa6 Mon Sep 17 00:00:00 2001
From: Alexey Bataev <a.bataev at outlook.com>
Date: Wed, 29 Jul 2026 08:43:49 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.7
---
 .../X86/fmuladd-copyable-mul-part.ll          | 155 ++++++++++++++++++
 1 file changed, 155 insertions(+)
 create mode 100644 llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-mul-part.ll

diff --git a/llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-mul-part.ll b/llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-mul-part.ll
new file mode 100644
index 0000000000000..5fda54820f732
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/fmuladd-copyable-mul-part.ll
@@ -0,0 +1,155 @@
+; 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=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=DISABLED
+
+declare float @llvm.fmuladd.f32(float, float, float)
+
+define void @test_mul_copyable(ptr %dst, ptr %srcB, float %p, float %q, float %r, float %s, float %t, float %u, float %v, float %w, float %e, float %f, float %g, float %h) {
+; ENABLED-LABEL: define void @test_mul_copyable(
+; ENABLED-SAME: ptr [[DST:%.*]], ptr [[SRCB:%.*]], float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[V:%.*]], float [[W:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]]) {
+; ENABLED-NEXT:  [[ENTRY:.*:]]
+; ENABLED-NEXT:    [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
+; ENABLED-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
+; ENABLED-NEXT:    [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
+; ENABLED-NEXT:    [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
+; ENABLED-NEXT:    [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
+; ENABLED-NEXT:    [[TMP5:%.*]] = insertelement <2 x float> poison, float [[T]], i64 0
+; ENABLED-NEXT:    [[TMP6:%.*]] = insertelement <2 x float> [[TMP5]], float [[V]], i64 1
+; ENABLED-NEXT:    [[TMP7:%.*]] = insertelement <2 x float> poison, float [[U]], i64 0
+; ENABLED-NEXT:    [[TMP8:%.*]] = insertelement <2 x float> [[TMP7]], float [[W]], i64 1
+; ENABLED-NEXT:    [[TMP9:%.*]] = fmul <2 x float> [[TMP6]], [[TMP8]]
+; ENABLED-NEXT:    [[TMP10:%.*]] = fdiv <2 x float> [[TMP6]], [[TMP8]]
+; ENABLED-NEXT:    [[TMP11:%.*]] = shufflevector <2 x float> [[TMP9]], <2 x float> [[TMP10]], <2 x i32> <i32 0, i32 3>
+; ENABLED-NEXT:    [[TMP12:%.*]] = insertelement <2 x float> poison, float [[E]], i64 0
+; ENABLED-NEXT:    [[TMP13:%.*]] = insertelement <2 x float> [[TMP12]], float [[G]], i64 1
+; ENABLED-NEXT:    [[TMP14:%.*]] = insertelement <2 x float> poison, float [[F]], i64 0
+; ENABLED-NEXT:    [[TMP15:%.*]] = insertelement <2 x float> [[TMP14]], float [[H]], i64 1
+; ENABLED-NEXT:    [[TMP16:%.*]] = fadd <2 x float> [[TMP13]], [[TMP15]]
+; ENABLED-NEXT:    [[TMP17:%.*]] = fsub <2 x float> [[TMP13]], [[TMP15]]
+; ENABLED-NEXT:    [[TMP18:%.*]] = shufflevector <2 x float> [[TMP16]], <2 x float> [[TMP17]], <2 x i32> <i32 0, i32 3>
+; ENABLED-NEXT:    [[TMP19:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
+; ENABLED-NEXT:    [[TMP20:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP19]], <2 x float> [[TMP18]])
+; ENABLED-NEXT:    store <2 x float> [[TMP20]], ptr [[DST]], align 4
+; ENABLED-NEXT:    [[D2:%.*]] = getelementptr float, ptr [[DST]], i32 2
+; ENABLED-NEXT:    store <2 x float> [[TMP11]], ptr [[D2]], align 4
+; ENABLED-NEXT:    ret void
+;
+; DISABLED-LABEL: define void @test_mul_copyable(
+; DISABLED-SAME: ptr [[DST:%.*]], ptr [[SRCB:%.*]], float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[V:%.*]], float [[W:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]]) {
+; DISABLED-NEXT:  [[ENTRY:.*:]]
+; DISABLED-NEXT:    [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
+; DISABLED-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
+; DISABLED-NEXT:    [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
+; DISABLED-NEXT:    [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
+; DISABLED-NEXT:    [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
+; DISABLED-NEXT:    [[TMP5:%.*]] = insertelement <2 x float> poison, float [[T]], i64 0
+; DISABLED-NEXT:    [[TMP6:%.*]] = insertelement <2 x float> [[TMP5]], float [[V]], i64 1
+; DISABLED-NEXT:    [[TMP7:%.*]] = insertelement <2 x float> poison, float [[U]], i64 0
+; DISABLED-NEXT:    [[TMP8:%.*]] = insertelement <2 x float> [[TMP7]], float [[W]], i64 1
+; DISABLED-NEXT:    [[TMP9:%.*]] = fmul <2 x float> [[TMP6]], [[TMP8]]
+; DISABLED-NEXT:    [[TMP10:%.*]] = fdiv <2 x float> [[TMP6]], [[TMP8]]
+; DISABLED-NEXT:    [[TMP11:%.*]] = shufflevector <2 x float> [[TMP9]], <2 x float> [[TMP10]], <2 x i32> <i32 0, i32 3>
+; DISABLED-NEXT:    [[TMP12:%.*]] = insertelement <2 x float> poison, float [[E]], i64 0
+; DISABLED-NEXT:    [[TMP13:%.*]] = insertelement <2 x float> [[TMP12]], float [[G]], i64 1
+; DISABLED-NEXT:    [[TMP14:%.*]] = insertelement <2 x float> poison, float [[F]], i64 0
+; DISABLED-NEXT:    [[TMP15:%.*]] = insertelement <2 x float> [[TMP14]], float [[H]], i64 1
+; DISABLED-NEXT:    [[TMP16:%.*]] = fadd <2 x float> [[TMP13]], [[TMP15]]
+; DISABLED-NEXT:    [[TMP17:%.*]] = fsub <2 x float> [[TMP13]], [[TMP15]]
+; DISABLED-NEXT:    [[TMP18:%.*]] = shufflevector <2 x float> [[TMP16]], <2 x float> [[TMP17]], <2 x i32> <i32 0, i32 3>
+; DISABLED-NEXT:    [[TMP19:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
+; DISABLED-NEXT:    [[TMP20:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP19]], <2 x float> [[TMP18]])
+; DISABLED-NEXT:    store <2 x float> [[TMP20]], ptr [[DST]], align 4
+; DISABLED-NEXT:    [[D2:%.*]] = getelementptr float, ptr [[DST]], i32 2
+; DISABLED-NEXT:    store <2 x float> [[TMP11]], ptr [[D2]], align 4
+; DISABLED-NEXT:    ret void
+;
+entry:
+  %a0 = fmul float %p, %q
+  %a1 = fmul float %r, %s
+  %x = fmul float %t, %u
+  %y = fdiv float %v, %w
+  %c0 = fadd float %e, %f
+  %c1 = fsub float %g, %h
+  %b0 = load float, ptr %srcB
+  %gepB1 = getelementptr float, ptr %srcB, i32 1
+  %b1 = load float, ptr %gepB1
+  %fma0 = call float @llvm.fmuladd.f32(float %a0, float %b0, float %c0)
+  %fma1 = call float @llvm.fmuladd.f32(float %a1, float %b1, float %c1)
+  store float %fma0, ptr %dst
+  %d1 = getelementptr float, ptr %dst, i32 1
+  store float %fma1, ptr %d1
+  %d2 = getelementptr float, ptr %dst, i32 2
+  store float %x, ptr %d2
+  %d3 = getelementptr float, ptr %dst, i32 3
+  store float %y, ptr %d3
+  ret void
+}
+
+define void @test_mul_copyable_args(ptr %dst, ptr %srcB, float %p, float %q, float %r, float %s, float %x, float %y, float %e, float %f, float %g, float %h) {
+; ENABLED-LABEL: define void @test_mul_copyable_args(
+; ENABLED-SAME: ptr [[DST:%.*]], ptr [[SRCB:%.*]], float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[X:%.*]], float [[Y:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]]) {
+; ENABLED-NEXT:  [[ENTRY:.*:]]
+; ENABLED-NEXT:    [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
+; ENABLED-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
+; ENABLED-NEXT:    [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
+; ENABLED-NEXT:    [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
+; ENABLED-NEXT:    [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
+; ENABLED-NEXT:    [[TMP5:%.*]] = insertelement <2 x float> poison, float [[E]], i64 0
+; ENABLED-NEXT:    [[TMP6:%.*]] = insertelement <2 x float> [[TMP5]], float [[G]], i64 1
+; ENABLED-NEXT:    [[TMP7:%.*]] = insertelement <2 x float> poison, float [[F]], i64 0
+; ENABLED-NEXT:    [[TMP8:%.*]] = insertelement <2 x float> [[TMP7]], float [[H]], i64 1
+; ENABLED-NEXT:    [[TMP9:%.*]] = fadd <2 x float> [[TMP6]], [[TMP8]]
+; ENABLED-NEXT:    [[TMP10:%.*]] = fsub <2 x float> [[TMP6]], [[TMP8]]
+; ENABLED-NEXT:    [[TMP11:%.*]] = shufflevector <2 x float> [[TMP9]], <2 x float> [[TMP10]], <2 x i32> <i32 0, i32 3>
+; ENABLED-NEXT:    [[TMP12:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
+; ENABLED-NEXT:    [[TMP13:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP12]], <2 x float> [[TMP11]])
+; ENABLED-NEXT:    store <2 x float> [[TMP13]], ptr [[DST]], align 4
+; ENABLED-NEXT:    [[D2:%.*]] = getelementptr float, ptr [[DST]], i32 2
+; ENABLED-NEXT:    store float [[X]], ptr [[D2]], align 4
+; ENABLED-NEXT:    [[D3:%.*]] = getelementptr float, ptr [[DST]], i32 3
+; ENABLED-NEXT:    store float [[Y]], ptr [[D3]], align 4
+; ENABLED-NEXT:    ret void
+;
+; DISABLED-LABEL: define void @test_mul_copyable_args(
+; DISABLED-SAME: ptr [[DST:%.*]], ptr [[SRCB:%.*]], float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[X:%.*]], float [[Y:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]]) {
+; DISABLED-NEXT:  [[ENTRY:.*:]]
+; DISABLED-NEXT:    [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
+; DISABLED-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
+; DISABLED-NEXT:    [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
+; DISABLED-NEXT:    [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
+; DISABLED-NEXT:    [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
+; DISABLED-NEXT:    [[TMP5:%.*]] = insertelement <2 x float> poison, float [[E]], i64 0
+; DISABLED-NEXT:    [[TMP6:%.*]] = insertelement <2 x float> [[TMP5]], float [[G]], i64 1
+; DISABLED-NEXT:    [[TMP7:%.*]] = insertelement <2 x float> poison, float [[F]], i64 0
+; DISABLED-NEXT:    [[TMP8:%.*]] = insertelement <2 x float> [[TMP7]], float [[H]], i64 1
+; DISABLED-NEXT:    [[TMP9:%.*]] = fadd <2 x float> [[TMP6]], [[TMP8]]
+; DISABLED-NEXT:    [[TMP10:%.*]] = fsub <2 x float> [[TMP6]], [[TMP8]]
+; DISABLED-NEXT:    [[TMP11:%.*]] = shufflevector <2 x float> [[TMP9]], <2 x float> [[TMP10]], <2 x i32> <i32 0, i32 3>
+; DISABLED-NEXT:    [[TMP12:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
+; DISABLED-NEXT:    [[TMP13:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP12]], <2 x float> [[TMP11]])
+; DISABLED-NEXT:    store <2 x float> [[TMP13]], ptr [[DST]], align 4
+; DISABLED-NEXT:    [[D2:%.*]] = getelementptr float, ptr [[DST]], i32 2
+; DISABLED-NEXT:    store float [[X]], ptr [[D2]], align 4
+; DISABLED-NEXT:    [[D3:%.*]] = getelementptr float, ptr [[DST]], i32 3
+; DISABLED-NEXT:    store float [[Y]], ptr [[D3]], align 4
+; DISABLED-NEXT:    ret void
+;
+entry:
+  %a0 = fmul float %p, %q
+  %a1 = fmul float %r, %s
+  %c0 = fadd float %e, %f
+  %c1 = fsub float %g, %h
+  %b0 = load float, ptr %srcB
+  %gepB1 = getelementptr float, ptr %srcB, i32 1
+  %b1 = load float, ptr %gepB1
+  %fma0 = call float @llvm.fmuladd.f32(float %a0, float %b0, float %c0)
+  %fma1 = call float @llvm.fmuladd.f32(float %a1, float %b1, float %c1)
+  store float %fma0, ptr %dst
+  %d1 = getelementptr float, ptr %dst, i32 1
+  store float %fma1, ptr %d1
+  %d2 = getelementptr float, ptr %dst, i32 2
+  store float %x, ptr %d2
+  %d3 = getelementptr float, ptr %dst, i32 3
+  store float %y, ptr %d3
+  ret void
+}



More information about the llvm-commits mailing list