[SLP][NFC]Add an extra check for fmul to fmuladd promotion, NFC

Reviewers: 

Pull Request: https://github.com/llvm/llvm-project/pull/213361
This commit is contained in:
Alexey Bataev 2026-07-31 17:38:16 -04:00 committed by GitHub
parent 96c356ab71
commit 36187ce08a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,6 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; 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 -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 ; 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
; RUN: opt -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=COST
declare float @llvm.fmuladd.f32(float, float, float) declare float @llvm.fmuladd.f32(float, float, float)
@ -59,6 +60,27 @@ define <4 x float> @buildvec_fmul_absorb(float %p, float %q, float %r, float %s,
; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP19]], <4 x float> [[TMP20]], <4 x i32> <i32 0, i32 1, i32 4, i32 5> ; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP19]], <4 x float> [[TMP20]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
; DISABLED-NEXT: ret <4 x float> [[V31]] ; DISABLED-NEXT: ret <4 x float> [[V31]]
; ;
; COST-LABEL: define <4 x float> @buildvec_fmul_absorb(
; COST-SAME: float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[N:%.*]], float [[M:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]], ptr [[SRCB:%.*]]) {
; COST-NEXT: [[ENTRY:.*:]]
; COST-NEXT: [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
; COST-NEXT: [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
; COST-NEXT: [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
; COST-NEXT: [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
; COST-NEXT: [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
; COST-NEXT: [[X:%.*]] = fmul float [[T]], [[U]]
; COST-NEXT: [[Z:%.*]] = fmul float [[N]], [[M]]
; COST-NEXT: [[C0:%.*]] = fadd float [[E]], [[F]]
; COST-NEXT: [[C1:%.*]] = fsub float [[G]], [[H]]
; COST-NEXT: [[TMP5:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
; COST-NEXT: [[TMP6:%.*]] = insertelement <2 x float> poison, float [[C0]], i64 0
; COST-NEXT: [[TMP7:%.*]] = insertelement <2 x float> [[TMP6]], float [[C1]], i64 1
; COST-NEXT: [[TMP8:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP5]], <2 x float> [[TMP7]])
; COST-NEXT: [[TMP9:%.*]] = shufflevector <2 x float> [[TMP8]], <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
; COST-NEXT: [[V2:%.*]] = insertelement <4 x float> [[TMP9]], float [[X]], i32 2
; COST-NEXT: [[V3:%.*]] = insertelement <4 x float> [[V2]], float [[Z]], i32 3
; COST-NEXT: ret <4 x float> [[V3]]
;
entry: entry:
%a0 = fmul float %p, %q %a0 = fmul float %p, %q
%a1 = fmul float %r, %s %a1 = fmul float %r, %s
@ -146,6 +168,33 @@ define void @storechain_1fmul(ptr %dst, ptr %srcB, float %p, float %q, float %r,
; DISABLED-NEXT: store float [[FMA2]], ptr [[D3]], align 4 ; DISABLED-NEXT: store float [[FMA2]], ptr [[D3]], align 4
; DISABLED-NEXT: ret void ; DISABLED-NEXT: ret void
; ;
; COST-LABEL: define void @storechain_1fmul(
; COST-SAME: ptr [[DST:%.*]], ptr [[SRCB:%.*]], float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[N:%.*]], float [[M:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]], float [[I:%.*]], float [[J:%.*]], float [[K:%.*]], float [[L:%.*]]) {
; COST-NEXT: [[ENTRY:.*:]]
; COST-NEXT: [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
; COST-NEXT: [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
; COST-NEXT: [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
; COST-NEXT: [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
; COST-NEXT: [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
; COST-NEXT: [[A2:%.*]] = fmul float [[I]], [[J]]
; COST-NEXT: [[X:%.*]] = fmul float [[T]], [[U]]
; COST-NEXT: [[C0:%.*]] = fadd float [[E]], [[F]]
; COST-NEXT: [[C1:%.*]] = fsub float [[G]], [[H]]
; COST-NEXT: [[C2:%.*]] = fadd float [[K]], [[L]]
; COST-NEXT: [[GEPB2:%.*]] = getelementptr float, ptr [[SRCB]], i32 2
; COST-NEXT: [[B2:%.*]] = load float, ptr [[GEPB2]], align 4
; COST-NEXT: [[FMA2:%.*]] = call float @llvm.fmuladd.f32(float [[A2]], float [[B2]], float [[C2]])
; COST-NEXT: [[D1:%.*]] = getelementptr float, ptr [[DST]], i32 1
; COST-NEXT: [[TMP5:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
; COST-NEXT: [[TMP6:%.*]] = insertelement <2 x float> poison, float [[C0]], i64 0
; COST-NEXT: [[TMP7:%.*]] = insertelement <2 x float> [[TMP6]], float [[C1]], i64 1
; COST-NEXT: [[TMP8:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP5]], <2 x float> [[TMP7]])
; COST-NEXT: store float [[X]], ptr [[DST]], align 4
; COST-NEXT: store <2 x float> [[TMP8]], ptr [[D1]], align 4
; COST-NEXT: [[D3:%.*]] = getelementptr float, ptr [[DST]], i32 3
; COST-NEXT: store float [[FMA2]], ptr [[D3]], align 4
; COST-NEXT: ret void
;
entry: entry:
%a0 = fmul float %p, %q %a0 = fmul float %p, %q
%a1 = fmul float %r, %s %a1 = fmul float %r, %s
@ -231,6 +280,28 @@ define <4 x float> @buildvec_fmul_absorb_rev(float %p, float %q, float %r, float
; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP19]], <4 x float> [[TMP20]], <4 x i32> <i32 0, i32 1, i32 4, i32 5> ; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP19]], <4 x float> [[TMP20]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
; DISABLED-NEXT: ret <4 x float> [[V31]] ; DISABLED-NEXT: ret <4 x float> [[V31]]
; ;
; COST-LABEL: define <4 x float> @buildvec_fmul_absorb_rev(
; COST-SAME: float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[N:%.*]], float [[M:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]], ptr [[SRCB:%.*]]) {
; COST-NEXT: [[ENTRY:.*:]]
; COST-NEXT: [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
; COST-NEXT: [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
; COST-NEXT: [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
; COST-NEXT: [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
; COST-NEXT: [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
; COST-NEXT: [[X:%.*]] = fmul float [[T]], [[U]]
; COST-NEXT: [[Z:%.*]] = fmul float [[N]], [[M]]
; COST-NEXT: [[C0:%.*]] = fadd float [[E]], [[F]]
; COST-NEXT: [[C1:%.*]] = fsub float [[G]], [[H]]
; COST-NEXT: [[TMP5:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
; COST-NEXT: [[TMP6:%.*]] = insertelement <2 x float> poison, float [[C0]], i64 0
; COST-NEXT: [[TMP7:%.*]] = insertelement <2 x float> [[TMP6]], float [[C1]], i64 1
; COST-NEXT: [[TMP8:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP5]], <2 x float> [[TMP7]])
; COST-NEXT: [[V0:%.*]] = insertelement <4 x float> poison, float [[X]], i32 0
; COST-NEXT: [[V1:%.*]] = insertelement <4 x float> [[V0]], float [[Z]], i32 1
; COST-NEXT: [[TMP9:%.*]] = shufflevector <2 x float> [[TMP8]], <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
; COST-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[V1]], <4 x float> [[TMP9]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
; COST-NEXT: ret <4 x float> [[V31]]
;
entry: entry:
%a0 = fmul float %p, %q %a0 = fmul float %p, %q
%a1 = fmul float %r, %s %a1 = fmul float %r, %s
@ -317,6 +388,30 @@ define <4 x float> @buildvec_fmul_no_absorb_multiuse_rev(float %p, float %q, flo
; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP21]], <4 x float> [[TMP22]], <4 x i32> <i32 0, i32 1, i32 4, i32 5> ; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP21]], <4 x float> [[TMP22]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
; DISABLED-NEXT: ret <4 x float> [[V31]] ; DISABLED-NEXT: ret <4 x float> [[V31]]
; ;
; COST-LABEL: define <4 x float> @buildvec_fmul_no_absorb_multiuse_rev(
; COST-SAME: float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[N:%.*]], float [[M:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]], ptr [[SRCB:%.*]], ptr [[DST2:%.*]]) {
; COST-NEXT: [[ENTRY:.*:]]
; COST-NEXT: [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
; COST-NEXT: [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
; COST-NEXT: [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
; COST-NEXT: [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
; COST-NEXT: [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
; COST-NEXT: [[X:%.*]] = fmul float [[T]], [[U]]
; COST-NEXT: [[Z:%.*]] = fmul float [[N]], [[M]]
; COST-NEXT: [[C0:%.*]] = fadd float [[E]], [[F]]
; COST-NEXT: [[C1:%.*]] = fsub float [[G]], [[H]]
; COST-NEXT: [[TMP5:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
; COST-NEXT: [[TMP6:%.*]] = insertelement <2 x float> poison, float [[C0]], i64 0
; COST-NEXT: [[TMP7:%.*]] = insertelement <2 x float> [[TMP6]], float [[C1]], i64 1
; COST-NEXT: [[TMP8:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP5]], <2 x float> [[TMP7]])
; COST-NEXT: store float [[X]], ptr [[DST2]], align 4
; COST-NEXT: store float [[Z]], ptr [[DST2]], align 4
; COST-NEXT: [[V0:%.*]] = insertelement <4 x float> poison, float [[X]], i32 0
; COST-NEXT: [[V1:%.*]] = insertelement <4 x float> [[V0]], float [[Z]], i32 1
; COST-NEXT: [[TMP9:%.*]] = shufflevector <2 x float> [[TMP8]], <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
; COST-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[V1]], <4 x float> [[TMP9]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
; COST-NEXT: ret <4 x float> [[V31]]
;
entry: entry:
%a0 = fmul float %p, %q %a0 = fmul float %p, %q
%a1 = fmul float %r, %s %a1 = fmul float %r, %s
@ -391,6 +486,26 @@ define <4 x float> @buildvec_fmul_absorb_const(float %p, float %q, float %r, flo
; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP17]], <4 x float> [[TMP18]], <4 x i32> <i32 0, i32 1, i32 4, i32 5> ; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP17]], <4 x float> [[TMP18]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
; DISABLED-NEXT: ret <4 x float> [[V31]] ; DISABLED-NEXT: ret <4 x float> [[V31]]
; ;
; COST-LABEL: define <4 x float> @buildvec_fmul_absorb_const(
; COST-SAME: float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]], ptr [[SRCB:%.*]]) {
; COST-NEXT: [[ENTRY:.*:]]
; COST-NEXT: [[A0:%.*]] = fmul float [[P]], [[Q]]
; COST-NEXT: [[A1:%.*]] = fmul float [[R]], [[S]]
; COST-NEXT: [[C0:%.*]] = fadd float [[E]], [[F]]
; COST-NEXT: [[C1:%.*]] = fsub float [[G]], [[H]]
; COST-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
; COST-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[U]], i64 2
; COST-NEXT: [[TMP2:%.*]] = insertelement <4 x float> [[TMP1]], float [[A0]], i64 0
; COST-NEXT: [[TMP3:%.*]] = insertelement <4 x float> [[TMP2]], float [[A1]], i64 1
; COST-NEXT: [[TMP4:%.*]] = shufflevector <4 x float> [[TMP3]], <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 2>
; COST-NEXT: [[TMP5:%.*]] = shufflevector <2 x float> [[TMP0]], <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
; COST-NEXT: [[TMP6:%.*]] = shufflevector <4 x float> <float poison, float poison, float 1.000000e+00, float 1.000000e+00>, <4 x float> [[TMP5]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>
; COST-NEXT: [[TMP7:%.*]] = insertelement <4 x float> <float poison, float poison, float -0.000000e+00, float -0.000000e+00>, float [[C0]], i64 0
; COST-NEXT: [[TMP8:%.*]] = insertelement <4 x float> [[TMP7]], float [[C1]], i64 1
; COST-NEXT: [[TMP9:%.*]] = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> [[TMP4]], <4 x float> [[TMP6]], <4 x float> [[TMP8]])
; COST-NEXT: [[TMP10:%.*]] = fmul <4 x float> [[TMP9]], <float 1.000000e+00, float 1.000000e+00, float 2.000000e+00, float 4.000000e+00>
; COST-NEXT: ret <4 x float> [[TMP10]]
;
entry: entry:
%a0 = fmul float %p, %q %a0 = fmul float %p, %q
%a1 = fmul float %r, %s %a1 = fmul float %r, %s
@ -473,6 +588,29 @@ define <4 x float> @buildvec_fmul_no_absorb_multiuse(float %p, float %q, float %
; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP21]], <4 x float> [[TMP22]], <4 x i32> <i32 0, i32 1, i32 4, i32 5> ; DISABLED-NEXT: [[V31:%.*]] = shufflevector <4 x float> [[TMP21]], <4 x float> [[TMP22]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
; DISABLED-NEXT: ret <4 x float> [[V31]] ; DISABLED-NEXT: ret <4 x float> [[V31]]
; ;
; COST-LABEL: define <4 x float> @buildvec_fmul_no_absorb_multiuse(
; COST-SAME: float [[P:%.*]], float [[Q:%.*]], float [[R:%.*]], float [[S:%.*]], float [[T:%.*]], float [[U:%.*]], float [[N:%.*]], float [[M:%.*]], float [[E:%.*]], float [[F:%.*]], float [[G:%.*]], float [[H:%.*]], ptr [[SRCB:%.*]], ptr [[DST2:%.*]]) {
; COST-NEXT: [[ENTRY:.*:]]
; COST-NEXT: [[TMP0:%.*]] = insertelement <2 x float> poison, float [[P]], i64 0
; COST-NEXT: [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[R]], i64 1
; COST-NEXT: [[TMP2:%.*]] = insertelement <2 x float> poison, float [[Q]], i64 0
; COST-NEXT: [[TMP3:%.*]] = insertelement <2 x float> [[TMP2]], float [[S]], i64 1
; COST-NEXT: [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP3]]
; COST-NEXT: [[X:%.*]] = fmul float [[T]], [[U]]
; COST-NEXT: [[Z:%.*]] = fmul float [[N]], [[M]]
; COST-NEXT: [[C0:%.*]] = fadd float [[E]], [[F]]
; COST-NEXT: [[C1:%.*]] = fsub float [[G]], [[H]]
; COST-NEXT: [[TMP5:%.*]] = load <2 x float>, ptr [[SRCB]], align 4
; COST-NEXT: [[TMP6:%.*]] = insertelement <2 x float> poison, float [[C0]], i64 0
; COST-NEXT: [[TMP7:%.*]] = insertelement <2 x float> [[TMP6]], float [[C1]], i64 1
; COST-NEXT: [[TMP8:%.*]] = call <2 x float> @llvm.fmuladd.v2f32(<2 x float> [[TMP4]], <2 x float> [[TMP5]], <2 x float> [[TMP7]])
; COST-NEXT: store float [[X]], ptr [[DST2]], align 4
; COST-NEXT: store float [[Z]], ptr [[DST2]], align 4
; COST-NEXT: [[TMP9:%.*]] = shufflevector <2 x float> [[TMP8]], <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
; COST-NEXT: [[V2:%.*]] = insertelement <4 x float> [[TMP9]], float [[X]], i32 2
; COST-NEXT: [[V3:%.*]] = insertelement <4 x float> [[V2]], float [[Z]], i32 3
; COST-NEXT: ret <4 x float> [[V3]]
;
entry: entry:
%a0 = fmul float %p, %q %a0 = fmul float %p, %q
%a1 = fmul float %r, %s %a1 = fmul float %r, %s