[llvm] [SLP]Count splats as single broadcast for in-loop trees (PR #230821)

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 10 11:11:06 PDT 2026


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

The loop-aware instruction-count check scaled the per-lane count of
splat gather entries by the trip count, rejecting profitable trees.
A splat is a single broadcast regardless of the loop scale. Fixes
4-6% RAJAPerf Apps_DIFFUSION3DPA regression on AArch64 introduced
by #211096.


>From dab20c9885ae0f8811a986d52c9792f991ff67b4 Mon Sep 17 00:00:00 2001
From: Alexey Bataev <a.bataev at outlook.com>
Date: Sat, 10 Oct 2026 11:10:54 -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
---
 .../Transforms/Vectorize/SLPVectorizer.cpp    |  5 +-
 .../AArch64/reassociate-fma-pairs.ll          | 49 +++++++++----------
 .../AArch64/loop-splat-inst-count.ll          | 49 ++++++++-----------
 .../splat-gather-subtree-store-chain.ll       | 22 +++++----
 4 files changed, 59 insertions(+), 66 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index bd83d296229d3..2b869a6fec555 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -13637,8 +13637,9 @@ uint64_t BoUpSLP::getNumVectorInsts(bool HasTreeLoop, bool CountExtracts) {
           VecScale = std::max(VecScale, Scale);
         }
       } else {
-        // A splat is a single broadcast.
-        if (HasFusedAlt && isSplat(TE.Scalars))
+        // A splat is a single broadcast. In loops, its per-lane count, scaled
+        // by the trip count, rejects the profitable trees.
+        if ((HasFusedAlt || HasTreeLoop) && isSplat(TE.Scalars))
           Count = !isConstant(TE.Scalars.front());
         else
           Count = TE.Scalars.size() - count_if(TE.Scalars, isConstant);
diff --git a/llvm/test/Transforms/PhaseOrdering/AArch64/reassociate-fma-pairs.ll b/llvm/test/Transforms/PhaseOrdering/AArch64/reassociate-fma-pairs.ll
index c4eab73309c54..2f3259038eafe 100644
--- a/llvm/test/Transforms/PhaseOrdering/AArch64/reassociate-fma-pairs.ll
+++ b/llvm/test/Transforms/PhaseOrdering/AArch64/reassociate-fma-pairs.ll
@@ -16,48 +16,45 @@ define double @md_vdw_energy(ptr nocapture readonly %coeffs, double %energy, dou
 ; CHECK-NEXT:    [[TMP0:%.*]] = fmul fast double [[TABLE_DELTA]], [[TABLE_DELTA]]
 ; CHECK-NEXT:    [[FACTOR_OP_FMUL:%.*]] = fmul fast double [[TMP0]], f0x3FC5555555555555
 ; CHECK-NEXT:    [[FACTOR_OP_FMUL2:%.*]] = fmul fast double [[TABLE_DELTA]], 5.000000e-01
-; CHECK-NEXT:    [[FACTOR_OP_FMUL3:%.*]] = fmul fast double [[FACTOR_OP_FMUL]], [[TABLE_DELTA]]
-; CHECK-NEXT:    [[FACTOR_OP_FMUL4:%.*]] = fmul fast double [[TMP0]], 2.500000e-01
+; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[TMP0]], i64 0
+; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> [[TMP1]], double [[FACTOR_OP_FMUL]], i64 1
+; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <2 x double> <double 2.500000e-01, double poison>, double [[TABLE_DELTA]], i64 1
+; CHECK-NEXT:    [[TMP4:%.*]] = fmul fast <2 x double> [[TMP2]], [[TMP3]]
 ; CHECK-NEXT:    br label %[[LOOP:.*]]
 ; CHECK:       [[LOOP]]:
 ; CHECK-NEXT:    [[I:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[NEXT:%.*]], %[[LOOP]] ]
 ; CHECK-NEXT:    [[ACC2:%.*]] = phi double [ [[ENERGY]], %[[ENTRY]] ], [ [[RESULT1:%.*]], %[[LOOP]] ]
 ; CHECK-NEXT:    [[BASE:%.*]] = getelementptr inbounds [8 x i8], ptr [[COEFFS]], i64 [[I]]
-; CHECK-NEXT:    [[A:%.*]] = load double, ptr [[BASE]], align 8
 ; CHECK-NEXT:    [[B_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 8
-; CHECK-NEXT:    [[B:%.*]] = load double, ptr [[B_PTR]], align 8
-; CHECK-NEXT:    [[TMP5:%.*]] = fmul fast double [[A]], [[SCALE]]
-; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast double [[B]], [[SCALE]]
 ; CHECK-NEXT:    [[C0_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 16
-; CHECK-NEXT:    [[C0:%.*]] = load double, ptr [[C0_PTR]], align 8
-; CHECK-NEXT:    [[C1_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 24
-; CHECK-NEXT:    [[C1:%.*]] = load double, ptr [[C1_PTR]], align 8
-; CHECK-NEXT:    [[P0:%.*]] = fmul fast double [[C0]], [[TMP5]]
-; CHECK-NEXT:    [[Q0:%.*]] = fmul fast double [[C1]], [[TMP6]]
-; CHECK-NEXT:    [[D3_NEG:%.*]] = fsub fast double [[P0]], [[Q0]]
-; CHECK-NEXT:    [[C2_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 32
-; CHECK-NEXT:    [[C2:%.*]] = load double, ptr [[C2_PTR]], align 8
-; CHECK-NEXT:    [[C3_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 40
-; CHECK-NEXT:    [[C3:%.*]] = load double, ptr [[C3_PTR]], align 8
-; CHECK-NEXT:    [[P1:%.*]] = fmul fast double [[C2]], [[TMP5]]
-; CHECK-NEXT:    [[Q1:%.*]] = fmul fast double [[C3]], [[TMP6]]
-; CHECK-NEXT:    [[D1:%.*]] = fsub fast double [[P1]], [[Q1]]
 ; CHECK-NEXT:    [[C4_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 48
 ; CHECK-NEXT:    [[C4:%.*]] = load double, ptr [[C4_PTR]], align 8
 ; CHECK-NEXT:    [[C5_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 56
 ; CHECK-NEXT:    [[C5:%.*]] = load double, ptr [[C5_PTR]], align 8
-; CHECK-NEXT:    [[P2:%.*]] = fmul fast double [[C4]], [[TMP5]]
-; CHECK-NEXT:    [[Q2:%.*]] = fmul fast double [[C5]], [[TMP6]]
-; CHECK-NEXT:    [[D2:%.*]] = fsub fast double [[P2]], [[Q2]]
 ; CHECK-NEXT:    [[C6_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 64
 ; CHECK-NEXT:    [[C6:%.*]] = load double, ptr [[C6_PTR]], align 8
 ; CHECK-NEXT:    [[C7_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 72
 ; CHECK-NEXT:    [[C7:%.*]] = load double, ptr [[C7_PTR]], align 8
-; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast double [[FACTOR_OP_FMUL3]], [[D3_NEG]]
-; CHECK-NEXT:    [[RESULT:%.*]] = fmul fast double [[D1]], [[FACTOR_OP_FMUL4]]
-; CHECK-NEXT:    [[REASS_ADD:%.*]] = fadd fast double [[RESULT]], [[TMP9]]
+; CHECK-NEXT:    [[A:%.*]] = load double, ptr [[BASE]], align 8
+; CHECK-NEXT:    [[B:%.*]] = load double, ptr [[B_PTR]], align 8
+; CHECK-NEXT:    [[TMP5:%.*]] = fmul fast double [[A]], [[SCALE]]
+; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast double [[B]], [[SCALE]]
+; CHECK-NEXT:    [[TMP16:%.*]] = load <4 x double>, ptr [[C0_PTR]], align 8
+; CHECK-NEXT:    [[TMP17:%.*]] = shufflevector <4 x double> [[TMP16]], <4 x double> poison, <2 x i32> <i32 2, i32 0>
+; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x double> poison, double [[TMP5]], i64 0
+; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <2 x double> [[TMP7]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast <2 x double> [[TMP17]], [[TMP8]]
+; CHECK-NEXT:    [[TMP18:%.*]] = shufflevector <4 x double> [[TMP16]], <4 x double> poison, <2 x i32> <i32 3, i32 1>
+; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x double> poison, double [[TMP6]], i64 0
+; CHECK-NEXT:    [[TMP19:%.*]] = shufflevector <2 x double> [[TMP11]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP13:%.*]] = fmul fast <2 x double> [[TMP18]], [[TMP19]]
+; CHECK-NEXT:    [[TMP14:%.*]] = fsub fast <2 x double> [[TMP9]], [[TMP13]]
+; CHECK-NEXT:    [[P2:%.*]] = fmul fast double [[C4]], [[TMP5]]
+; CHECK-NEXT:    [[Q2:%.*]] = fmul fast double [[C5]], [[TMP6]]
+; CHECK-NEXT:    [[D2:%.*]] = fsub fast double [[P2]], [[Q2]]
+; CHECK-NEXT:    [[TMP15:%.*]] = fmul fast <2 x double> [[TMP14]], [[TMP4]]
 ; CHECK-NEXT:    [[T4_REASS:%.*]] = fmul fast double [[D2]], [[FACTOR_OP_FMUL2]]
-; CHECK-NEXT:    [[ACC1:%.*]] = fadd fast double [[REASS_ADD]], [[T4_REASS]]
+; CHECK-NEXT:    [[ACC1:%.*]] = tail call fast double @llvm.vector.reduce.fadd.v2f64(double [[T4_REASS]], <2 x double> [[TMP15]])
 ; CHECK-NEXT:    [[TMP10:%.*]] = fmul fast double [[C6]], [[TMP5]]
 ; CHECK-NEXT:    [[TMP12:%.*]] = fmul fast double [[C7]], [[TMP6]]
 ; CHECK-NEXT:    [[S2_NEG1:%.*]] = fadd fast double [[ACC1]], [[TMP10]]
diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/loop-splat-inst-count.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/loop-splat-inst-count.ll
index daeffdd6f4848..6e6cb3990670d 100644
--- a/llvm/test/Transforms/SLPVectorizer/AArch64/loop-splat-inst-count.ll
+++ b/llvm/test/Transforms/SLPVectorizer/AArch64/loop-splat-inst-count.ll
@@ -10,21 +10,13 @@ define void @test(ptr noalias %a, ptr noalias %b, ptr noalias %c) {
 ; CHECK-NEXT:    [[QZ:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[QZ_NEXT:%.*]], %[[OUTER_LATCH:.*]] ]
 ; CHECK-NEXT:    [[ABASE:%.*]] = mul i64 [[QZ]], 12
 ; CHECK-NEXT:    [[PA00:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[ABASE]]
-; CHECK-NEXT:    [[A00:%.*]] = load double, ptr [[PA00]], align 8
-; CHECK-NEXT:    [[PA01:%.*]] = getelementptr inbounds double, ptr [[PA00]], i64 1
-; CHECK-NEXT:    [[A01:%.*]] = load double, ptr [[PA01]], align 8
 ; CHECK-NEXT:    [[PA10:%.*]] = getelementptr inbounds double, ptr [[PA00]], i64 3
-; CHECK-NEXT:    [[A10:%.*]] = load double, ptr [[PA10]], align 8
-; CHECK-NEXT:    [[PA11:%.*]] = getelementptr inbounds double, ptr [[PA00]], i64 4
-; CHECK-NEXT:    [[A11:%.*]] = load double, ptr [[PA11]], align 8
 ; CHECK-NEXT:    [[PA20:%.*]] = getelementptr inbounds double, ptr [[PA00]], i64 6
-; CHECK-NEXT:    [[A20:%.*]] = load double, ptr [[PA20]], align 8
-; CHECK-NEXT:    [[PA21:%.*]] = getelementptr inbounds double, ptr [[PA00]], i64 7
-; CHECK-NEXT:    [[A21:%.*]] = load double, ptr [[PA21]], align 8
 ; CHECK-NEXT:    [[PA30:%.*]] = getelementptr inbounds double, ptr [[PA00]], i64 9
-; CHECK-NEXT:    [[A30:%.*]] = load double, ptr [[PA30]], align 8
-; CHECK-NEXT:    [[PA31:%.*]] = getelementptr inbounds double, ptr [[PA00]], i64 10
-; CHECK-NEXT:    [[A31:%.*]] = load double, ptr [[PA31]], align 8
+; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x double>, ptr [[PA00]], align 8
+; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x double>, ptr [[PA10]], align 8
+; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x double>, ptr [[PA20]], align 8
+; CHECK-NEXT:    [[TMP3:%.*]] = load <2 x double>, ptr [[PA30]], align 8
 ; CHECK-NEXT:    [[CBASE:%.*]] = mul i64 [[QZ]], 6
 ; CHECK-NEXT:    br label %[[INNER:.*]]
 ; CHECK:       [[INNER]]:
@@ -37,26 +29,25 @@ define void @test(ptr noalias %a, ptr noalias %b, ptr noalias %c) {
 ; CHECK-NEXT:    [[S2:%.*]] = load double, ptr [[PB2]], align 8
 ; CHECK-NEXT:    [[PB3:%.*]] = getelementptr inbounds double, ptr [[PB0]], i64 9
 ; CHECK-NEXT:    [[S3:%.*]] = load double, ptr [[PB3]], align 8
-; CHECK-NEXT:    [[M00:%.*]] = fmul fast double [[A00]], [[S0]]
-; CHECK-NEXT:    [[M10:%.*]] = fmul fast double [[A10]], [[S1]]
-; CHECK-NEXT:    [[U10:%.*]] = fadd fast double [[M10]], [[M00]]
-; CHECK-NEXT:    [[M20:%.*]] = fmul fast double [[A20]], [[S2]]
-; CHECK-NEXT:    [[U20:%.*]] = fadd fast double [[M20]], [[U10]]
-; CHECK-NEXT:    [[M30:%.*]] = fmul fast double [[A30]], [[S3]]
-; CHECK-NEXT:    [[U0:%.*]] = fadd fast double [[M30]], [[U20]]
-; CHECK-NEXT:    [[M01:%.*]] = fmul fast double [[A01]], [[S0]]
-; CHECK-NEXT:    [[M11:%.*]] = fmul fast double [[A11]], [[S1]]
-; CHECK-NEXT:    [[U11:%.*]] = fadd fast double [[M11]], [[M01]]
-; CHECK-NEXT:    [[M21:%.*]] = fmul fast double [[A21]], [[S2]]
-; CHECK-NEXT:    [[U21:%.*]] = fadd fast double [[M21]], [[U11]]
-; CHECK-NEXT:    [[M31:%.*]] = fmul fast double [[A31]], [[S3]]
-; CHECK-NEXT:    [[U1:%.*]] = fadd fast double [[M31]], [[U21]]
 ; CHECK-NEXT:    [[DY2:%.*]] = shl i64 [[DY]], 1
 ; CHECK-NEXT:    [[CIDX:%.*]] = add i64 [[CBASE]], [[DY2]]
 ; CHECK-NEXT:    [[PC0:%.*]] = getelementptr inbounds double, ptr [[C]], i64 [[CIDX]]
-; CHECK-NEXT:    store double [[U0]], ptr [[PC0]], align 8
-; CHECK-NEXT:    [[PC1:%.*]] = getelementptr inbounds double, ptr [[PC0]], i64 1
-; CHECK-NEXT:    store double [[U1]], ptr [[PC1]], align 8
+; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x double> poison, double [[S0]], i64 0
+; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP6:%.*]] = fmul fast <2 x double> [[TMP0]], [[TMP5]]
+; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x double> poison, double [[S1]], i64 0
+; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <2 x double> [[TMP7]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP9:%.*]] = fmul fast <2 x double> [[TMP1]], [[TMP8]]
+; CHECK-NEXT:    [[TMP10:%.*]] = fadd fast <2 x double> [[TMP9]], [[TMP6]]
+; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <2 x double> poison, double [[S2]], i64 0
+; CHECK-NEXT:    [[TMP12:%.*]] = shufflevector <2 x double> [[TMP11]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP13:%.*]] = fmul fast <2 x double> [[TMP2]], [[TMP12]]
+; CHECK-NEXT:    [[TMP14:%.*]] = fadd fast <2 x double> [[TMP13]], [[TMP10]]
+; CHECK-NEXT:    [[TMP15:%.*]] = insertelement <2 x double> poison, double [[S3]], i64 0
+; CHECK-NEXT:    [[TMP16:%.*]] = shufflevector <2 x double> [[TMP15]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP17:%.*]] = fmul fast <2 x double> [[TMP3]], [[TMP16]]
+; CHECK-NEXT:    [[TMP18:%.*]] = fadd fast <2 x double> [[TMP17]], [[TMP14]]
+; CHECK-NEXT:    store <2 x double> [[TMP18]], ptr [[PC0]], align 8
 ; CHECK-NEXT:    [[DY_NEXT]] = add nuw nsw i64 [[DY]], 1
 ; CHECK-NEXT:    [[DY_CMP:%.*]] = icmp ult i64 [[DY_NEXT]], 3
 ; CHECK-NEXT:    br i1 [[DY_CMP]], label %[[INNER]], label %[[OUTER_LATCH]]
diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll
index 39f292874e1c6..fc52470586943 100644
--- a/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll
+++ b/llvm/test/Transforms/SLPVectorizer/AArch64/splat-gather-subtree-store-chain.ll
@@ -9,21 +9,25 @@ define void @test(ptr %matrix, double %0) {
 ; CHECK-LABEL: define void @test(
 ; CHECK-SAME: ptr [[MATRIX:%.*]], double [[TMP0:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> <double poison, double -0.000000e+00>, double [[TMP0]], i64 0
 ; CHECK-NEXT:    br label %[[LOOP:.*]]
 ; CHECK:       [[LOOP]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP0]], double 0.000000e+00, double 0.000000e+00)
 ; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr [[MATRIX]], i64 832
 ; CHECK-NEXT:    [[TMP2:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP0]], double 0.000000e+00, double 0.000000e+00)
-; CHECK-NEXT:    [[TMP3:%.*]] = fadd double [[TMP1]], 0.000000e+00
-; CHECK-NEXT:    [[TMP4:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP0]], double 0.000000e+00, double [[TMP2]])
-; CHECK-NEXT:    [[TMP5:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP4]], double [[TMP2]], double 0.000000e+00)
-; CHECK-NEXT:    [[TMP6:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP1]], double 0.000000e+00, double [[TMP5]])
-; CHECK-NEXT:    [[TMP7:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP4]], double 0.000000e+00, double 0.000000e+00)
-; CHECK-NEXT:    [[TMP8:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP1]], double 0.000000e+00, double [[TMP7]])
+; CHECK-NEXT:    [[TMP6:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP1]], <2 x double> zeroinitializer, <2 x double> zeroinitializer)
+; CHECK-NEXT:    [[TMP3:%.*]] = fadd double [[TMP2]], 0.000000e+00
+; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <2 x double> [[TMP6]], i64 0
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call double @llvm.fmuladd.f64(double [[TMP0]], double 0.000000e+00, double [[TMP5]])
+; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x double> poison, double [[TMP4]], i64 0
+; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <2 x double> [[TMP7]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP14:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP8]], <2 x double> [[TMP6]], <2 x double> zeroinitializer)
+; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <2 x double> poison, double [[TMP2]], i64 0
+; CHECK-NEXT:    [[TMP11:%.*]] = shufflevector <2 x double> [[TMP16]], <2 x double> poison, <2 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP17:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP11]], <2 x double> zeroinitializer, <2 x double> [[TMP14]])
 ; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <4 x double> poison, double [[TMP3]], i64 0
 ; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <4 x double> [[TMP9]], double [[TMP4]], i64 1
-; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <4 x double> [[TMP10]], double [[TMP6]], i64 2
-; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <4 x double> [[TMP11]], double [[TMP8]], i64 3
+; CHECK-NEXT:    [[TMP15:%.*]] = shufflevector <2 x double> [[TMP17]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
+; CHECK-NEXT:    [[TMP12:%.*]] = shufflevector <4 x double> [[TMP10]], <4 x double> [[TMP15]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
 ; CHECK-NEXT:    [[TMP13:%.*]] = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> [[TMP12]], <4 x double> zeroinitializer, <4 x double> zeroinitializer)
 ; CHECK-NEXT:    store <4 x double> [[TMP13]], ptr [[GEP0]], align 8
 ; CHECK-NEXT:    br label %[[LOOP]]



More information about the llvm-commits mailing list