From b99a2aabf58d37bbdcc72b7efcbac9b28fdce8fa Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 18 Nov 2025 14:41:55 -0800 Subject: [PATCH 1/4] Pre-commit tests --- .../InstSimplify/ConstProp/vector-calls.ll | 236 +++++++++++++++++- 1 file changed, 226 insertions(+), 10 deletions(-) diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll b/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll index 848f0d17ff373..dcaef0a85acdf 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll @@ -99,23 +99,23 @@ define <32 x i32> @fold_vector_interleave8() { ret <32 x i32> %1 } -define {<4 x i32>, <4 x i32>} @fold_vector_deinterleave2() { +define { <4 x i32>, <4 x i32> } @fold_vector_deinterleave2() { ; CHECK-LABEL: define { <4 x i32>, <4 x i32> } @fold_vector_deinterleave2() { ; CHECK-NEXT: ret { <4 x i32>, <4 x i32> } { <4 x i32> , <4 x i32> } ; - %1 = call {<4 x i32>, <4 x i32>} @llvm.vector.deinterleave2.v4i32.v8i32(<8 x i32> ) - ret {<4 x i32>, <4 x i32>} %1 + %1 = call { <4 x i32>, <4 x i32> } @llvm.vector.deinterleave2.v4i32.v8i32(<8 x i32> ) + ret { <4 x i32>, <4 x i32> } %1 } -define {, } @fold_scalable_vector_deinterleave2() { +define { , } @fold_scalable_vector_deinterleave2() { ; CHECK-LABEL: define { , } @fold_scalable_vector_deinterleave2() { ; CHECK-NEXT: ret { , } zeroinitializer ; - %1 = call {, } @llvm.vector.deinterleave2.v4i32.v8i32( zeroinitializer) - ret {, } %1 + %1 = call { , } @llvm.vector.deinterleave2.v4i32.v8i32( zeroinitializer) + ret { , } %1 } -define {, } @fold_scalable_vector_deinterleave2_splat() { +define { , } @fold_scalable_vector_deinterleave2_splat() { ; CHECK-LABEL: define { , } @fold_scalable_vector_deinterleave2_splat() { ; CHECK-NEXT: ret { , } { splat (i32 1), splat (i32 1) } ; @@ -123,10 +123,226 @@ define {, } @fold_scalable_vector_deinterlea ret {, } %1 } -define {, } @fold_scalable_vector_deinterleave2_splatfp() { +define { , } @fold_scalable_vector_deinterleave2_splatfp() { ; CHECK-LABEL: define { , } @fold_scalable_vector_deinterleave2_splatfp() { ; CHECK-NEXT: ret { , } { splat (float 1.000000e+00), splat (float 1.000000e+00) } ; - %1 = call {, } @llvm.vector.deinterleave2.v4f32.v8f32( splat (float 1.0)) - ret {, } %1 + %1 = call { , } @llvm.vector.deinterleave2.v4f32.v8f32( splat (float 1.0)) + ret { , } %1 +} + +define { <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave3() { +; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave3() { +; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave3.v12i32(<12 x i32> ) +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; + %1 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave3.v4i32.v12i32(<12 x i32> ) + ret { <4 x i32>, <4 x i32>, <4 x i32> } %1 +} + +define { , , } @fold_scalable_vector_deinterleave3() { +; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , } @llvm.vector.deinterleave3.nxv12i32( zeroinitializer) +; CHECK-NEXT: ret { , , } [[TMP1]] +; + %1 = call { , , } @llvm.vector.deinterleave3.v4i32.v12i32( zeroinitializer) + ret { , , } %1 +} + +define {, , } @fold_scalable_vector_deinterleave3_splat() { +; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3_splat() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , } @llvm.vector.deinterleave3.nxv12i32( splat (i32 1)) +; CHECK-NEXT: ret { , , } [[TMP1]] +; + %1 = call { , , } @llvm.vector.deinterleave3.v4i32.v12i32( splat (i32 1)) + ret {, , } %1 +} + +define {, , } @fold_scalable_vector_deinterleave3_splatfp() { +; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3_splatfp() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , } @llvm.vector.deinterleave3.nxv12f32( splat (float 1.000000e+00)) +; CHECK-NEXT: ret { , , } [[TMP1]] +; + %1 = call { , , } @llvm.vector.deinterleave3.v4f32.v12f32( splat (float 1.0)) + ret { , , } %1 +} + +define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave4() { +; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave4() { +; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave4.v16i32(<16 x i32> ) +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; + %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave4.v4i32.v16i32(<16 x i32> ) + ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 +} + +define { , , , } @fold_scalable_vector_deinterleave4() { +; CHECK-LABEL: define { , , , } @fold_scalable_vector_deinterleave4() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , } @llvm.vector.deinterleave4.nxv16i32( zeroinitializer) +; CHECK-NEXT: ret { , , , } [[TMP1]] +; + %1 = call { , , , } @llvm.vector.deinterleave4.v4i32.v16i32( zeroinitializer) + ret { , , , } %1 +} + +define { , , , } @fold_scalable_vector_deinterleave4_splat() { +; CHECK-LABEL: define { , , , } @fold_scalable_vector_deinterleave4_splat() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , } @llvm.vector.deinterleave4.nxv16i32( splat (i32 1)) +; CHECK-NEXT: ret { , , , } [[TMP1]] +; + %1 = call { , , , } @llvm.vector.deinterleave4.v4i32.v16i32( splat (i32 1)) + ret { , , , } %1 +} + +define { , , , } @fold_scalable_vector_deinterleave4_splatfp() { +; CHECK-LABEL: define { , , , } @fold_scalable_vector_deinterleave4_splatfp() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , } @llvm.vector.deinterleave4.nxv16f32( splat (float 1.000000e+00)) +; CHECK-NEXT: ret { , , , } [[TMP1]] +; + %1 = call { , , , } @llvm.vector.deinterleave4.v4f32.v16f32( splat (float 1.0)) + ret { , , , } %1 +} + +define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave5() { +; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave5() { +; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave5.v20i32(<20 x i32> ) +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; + %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave5.v4i32.v20i32(<20 x i32> ) + ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 +} + +define { , , , , } @fold_scalable_vector_deinterleave5() { +; CHECK-LABEL: define { , , , , } @fold_scalable_vector_deinterleave5() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , } @llvm.vector.deinterleave5.nxv20i32( zeroinitializer) +; CHECK-NEXT: ret { , , , , } [[TMP1]] +; + %1 = call { , , , , } @llvm.vector.deinterleave5.v4i32.v20i32( zeroinitializer) + ret { , , , , } %1 +} + +define { , , , , } @fold_scalable_vector_deinterleave5_splat() { +; CHECK-LABEL: define { , , , , } @fold_scalable_vector_deinterleave5_splat() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , } @llvm.vector.deinterleave5.nxv20i32( splat (i32 1)) +; CHECK-NEXT: ret { , , , , } [[TMP1]] +; + %1 = call { , , , , } @llvm.vector.deinterleave5.v4i32.v20i32( splat (i32 1)) + ret { , , , , } %1 +} + +define { , , , , } @fold_scalable_vector_deinterleave5_splatfp() { +; CHECK-LABEL: define { , , , , } @fold_scalable_vector_deinterleave5_splatfp() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , } @llvm.vector.deinterleave5.nxv20f32( splat (float 1.000000e+00)) +; CHECK-NEXT: ret { , , , , } [[TMP1]] +; + %1 = call { , , , , } @llvm.vector.deinterleave5.v4f32.v20f32( splat (float 1.0)) + ret { , , , , } %1 +} + +define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave6() { +; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave6() { +; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave6.v24i32(<24 x i32> ) +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; + %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave6.v4i32.v24i32(<24 x i32> ) + ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 +} + +define { , , , , , } @fold_scalable_vector_deinterleave6() { +; CHECK-LABEL: define { , , , , , } @fold_scalable_vector_deinterleave6() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , } @llvm.vector.deinterleave6.nxv24i32( zeroinitializer) +; CHECK-NEXT: ret { , , , , , } [[TMP1]] +; + %1 = call { , , , , , } @llvm.vector.deinterleave6.v4i32.v24i32( zeroinitializer) + ret { , , , , , } %1 +} + +define { , , , , , } @fold_scalable_vector_deinterleave6_splat() { +; CHECK-LABEL: define { , , , , , } @fold_scalable_vector_deinterleave6_splat() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , } @llvm.vector.deinterleave6.nxv24i32( splat (i32 1)) +; CHECK-NEXT: ret { , , , , , } [[TMP1]] +; + %1 = call { , , , , , } @llvm.vector.deinterleave6.v4i32.v24i32( splat (i32 1)) + ret { , , , , , } %1 +} + +define { , , , , , } @fold_scalable_vector_deinterleave6_splatfp() { +; CHECK-LABEL: define { , , , , , } @fold_scalable_vector_deinterleave6_splatfp() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , } @llvm.vector.deinterleave6.nxv24f32( splat (float 1.000000e+00)) +; CHECK-NEXT: ret { , , , , , } [[TMP1]] +; + %1 = call { , , , , , } @llvm.vector.deinterleave6.v4f32.v24f32( splat (float 1.0)) + ret { , , , , , } %1 +} + +define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave7() { +; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave7() { +; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave7.v28i32(<28 x i32> ) +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; + %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave7.v4i32.v28i32(<28 x i32> ) + ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 +} + +define { , , , , , , } @fold_scalable_vector_deinterleave7() { +; CHECK-LABEL: define { , , , , , , } @fold_scalable_vector_deinterleave7() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , } @llvm.vector.deinterleave7.nxv28i32( zeroinitializer) +; CHECK-NEXT: ret { , , , , , , } [[TMP1]] +; + %1 = call { , , , , , , } @llvm.vector.deinterleave7.v4i32.v28i32( zeroinitializer) + ret { , , , , , , } %1 +} + +define { , , , , , , } @fold_scalable_vector_deinterleave7_splat() { +; CHECK-LABEL: define { , , , , , , } @fold_scalable_vector_deinterleave7_splat() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , } @llvm.vector.deinterleave7.nxv28i32( splat (i32 1)) +; CHECK-NEXT: ret { , , , , , , } [[TMP1]] +; + %1 = call { , , , , , , } @llvm.vector.deinterleave7.v4i32.v28i32( splat (i32 1)) + ret { , , , , , , } %1 +} + +define { , , , , , , } @fold_scalable_vector_deinterleave7_splatfp() { +; CHECK-LABEL: define { , , , , , , } @fold_scalable_vector_deinterleave7_splatfp() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , } @llvm.vector.deinterleave7.nxv28f32( splat (float 1.000000e+00)) +; CHECK-NEXT: ret { , , , , , , } [[TMP1]] +; + %1 = call { , , , , , , } @llvm.vector.deinterleave7.v4f32.v28f32( splat (float 1.0)) + ret { , , , , , , } %1 +} + +define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave8() { +; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave8() { +; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave8.v32i32(<32 x i32> ) +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; + %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave8.v4i32.v32i32(<32 x i32> ) + ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 +} + +define { , , , , , , , } @fold_scalable_vector_deinterleave8() { +; CHECK-LABEL: define { , , , , , , , } @fold_scalable_vector_deinterleave8() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , , } @llvm.vector.deinterleave8.nxv32i32( zeroinitializer) +; CHECK-NEXT: ret { , , , , , , , } [[TMP1]] +; + %1 = call { , , , , , , , } @llvm.vector.deinterleave8.v4i32.v32i32( zeroinitializer) + ret { , , , , , , , } %1 +} + +define { , , , , , , , } @fold_scalable_vector_deinterleave8_splat() { +; CHECK-LABEL: define { , , , , , , , } @fold_scalable_vector_deinterleave8_splat() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , , } @llvm.vector.deinterleave8.nxv32i32( splat (i32 1)) +; CHECK-NEXT: ret { , , , , , , , } [[TMP1]] +; + %1 = call { , , , , , , , } @llvm.vector.deinterleave8.v4i32.v32i32( splat (i32 1)) + ret { , , , , , , , } %1 +} + +define { , , , , , , , } @fold_scalable_vector_deinterleave8_splatfp() { +; CHECK-LABEL: define { , , , , , , , } @fold_scalable_vector_deinterleave8_splatfp() { +; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , , } @llvm.vector.deinterleave8.nxv32f32( splat (float 1.000000e+00)) +; CHECK-NEXT: ret { , , , , , , , } [[TMP1]] +; + %1 = call { , , , , , , , } @llvm.vector.deinterleave8.v4f32.v32f32( splat (float 1.0)) + ret { , , , , , , , } %1 } From 72eac44b4317b4dd535f9f2cd5330094bf49df61 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 18 Nov 2025 16:32:32 -0800 Subject: [PATCH 2/4] [ConstantFolding] Generalize constant folding for vector_deinterleave2 to deinterleave3-8. --- llvm/lib/Analysis/ConstantFolding.cpp | 45 ++++++++---- .../InstSimplify/ConstProp/vector-calls.ll | 72 +++++++------------ 2 files changed, 55 insertions(+), 62 deletions(-) mode change 100755 => 100644 llvm/lib/Analysis/ConstantFolding.cpp diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp old mode 100755 new mode 100644 index a13df6c5bf552..c5eed99027cb0 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -1666,6 +1666,12 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) { case Intrinsic::vector_interleave7: case Intrinsic::vector_interleave8: case Intrinsic::vector_deinterleave2: + case Intrinsic::vector_deinterleave3: + case Intrinsic::vector_deinterleave4: + case Intrinsic::vector_deinterleave5: + case Intrinsic::vector_deinterleave6: + case Intrinsic::vector_deinterleave7: + case Intrinsic::vector_deinterleave8: // Target intrinsics case Intrinsic::amdgcn_perm: case Intrinsic::amdgcn_wave_reduce_umin: @@ -4425,31 +4431,42 @@ ConstantFoldStructCall(StringRef Name, Intrinsic::ID IntrinsicID, return nullptr; return ConstantStruct::get(StTy, SinResult, CosResult); } - case Intrinsic::vector_deinterleave2: { + case Intrinsic::vector_deinterleave2: + case Intrinsic::vector_deinterleave3: + case Intrinsic::vector_deinterleave4: + case Intrinsic::vector_deinterleave5: + case Intrinsic::vector_deinterleave6: + case Intrinsic::vector_deinterleave7: + case Intrinsic::vector_deinterleave8: { + unsigned NumResults = StTy->getNumElements(); auto *Vec = Operands[0]; auto *VecTy = cast(Vec->getType()); if (auto *EltC = Vec->getSplatValue()) { - ElementCount HalfEC = VecTy->getElementCount().divideCoefficientBy(2); + ElementCount HalfEC = + VecTy->getElementCount().divideCoefficientBy(NumResults); auto *HalfVec = ConstantVector::getSplat(HalfEC, EltC); - return ConstantStruct::get(StTy, HalfVec, HalfVec); + SmallVector Results(NumResults, HalfVec); + return ConstantStruct::get(StTy, Results); } if (!isa(Vec->getType())) return nullptr; - unsigned NumElements = VecTy->getElementCount().getFixedValue() / 2; - SmallVector Res0(NumElements), Res1(NumElements); - for (unsigned I = 0; I < NumElements; ++I) { - Constant *Elt0 = Vec->getAggregateElement(2 * I); - Constant *Elt1 = Vec->getAggregateElement(2 * I + 1); - if (!Elt0 || !Elt1) - return nullptr; - Res0[I] = Elt0; - Res1[I] = Elt1; + unsigned NumElements = + VecTy->getElementCount().getFixedValue() / NumResults; + SmallVector Results(NumResults); + SmallVector Elements(NumElements); + for (unsigned I = 0; I != NumResults; ++I) { + for (unsigned J = 0; J != NumElements; ++J) { + Constant *Elt = Vec->getAggregateElement(J * NumResults + I); + if (!Elt) + return nullptr; + Elements[J] = Elt; + } + Results[I] = ConstantVector::get(Elements); } - return ConstantStruct::get(StTy, ConstantVector::get(Res0), - ConstantVector::get(Res1)); + return ConstantStruct::get(StTy, Results); } default: // TODO: Constant folding of vector intrinsics that fall through here does diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll b/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll index dcaef0a85acdf..4b6ee87c296f4 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll @@ -133,8 +133,7 @@ define { , } @fold_scalable_vector_dein define { <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave3() { ; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave3() { -; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave3.v12i32(<12 x i32> ) -; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32> } { <4 x i32> , <4 x i32> , <4 x i32> } ; %1 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave3.v4i32.v12i32(<12 x i32> ) ret { <4 x i32>, <4 x i32>, <4 x i32> } %1 @@ -142,8 +141,7 @@ define { <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave3() { define { , , } @fold_scalable_vector_deinterleave3() { ; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , } @llvm.vector.deinterleave3.nxv12i32( zeroinitializer) -; CHECK-NEXT: ret { , , } [[TMP1]] +; CHECK-NEXT: ret { , , } zeroinitializer ; %1 = call { , , } @llvm.vector.deinterleave3.v4i32.v12i32( zeroinitializer) ret { , , } %1 @@ -151,8 +149,7 @@ define { , , } @fold_scal define {, , } @fold_scalable_vector_deinterleave3_splat() { ; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3_splat() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , } @llvm.vector.deinterleave3.nxv12i32( splat (i32 1)) -; CHECK-NEXT: ret { , , } [[TMP1]] +; CHECK-NEXT: ret { , , } { splat (i32 1), splat (i32 1), splat (i32 1) } ; %1 = call { , , } @llvm.vector.deinterleave3.v4i32.v12i32( splat (i32 1)) ret {, , } %1 @@ -160,8 +157,7 @@ define {, , } @fold_scalab define {, , } @fold_scalable_vector_deinterleave3_splatfp() { ; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3_splatfp() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , } @llvm.vector.deinterleave3.nxv12f32( splat (float 1.000000e+00)) -; CHECK-NEXT: ret { , , } [[TMP1]] +; CHECK-NEXT: ret { , , } { splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00) } ; %1 = call { , , } @llvm.vector.deinterleave3.v4f32.v12f32( splat (float 1.0)) ret { , , } %1 @@ -169,8 +165,7 @@ define {, , } @fold_ define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave4() { ; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave4() { -; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave4.v16i32(<16 x i32> ) -; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } { <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> } ; %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave4.v4i32.v16i32(<16 x i32> ) ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 @@ -178,8 +173,7 @@ define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave4 define { , , , } @fold_scalable_vector_deinterleave4() { ; CHECK-LABEL: define { , , , } @fold_scalable_vector_deinterleave4() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , } @llvm.vector.deinterleave4.nxv16i32( zeroinitializer) -; CHECK-NEXT: ret { , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , } zeroinitializer ; %1 = call { , , , } @llvm.vector.deinterleave4.v4i32.v16i32( zeroinitializer) ret { , , , } %1 @@ -187,8 +181,7 @@ define { , , , , , , } @fold_scalable_vector_deinterleave4_splat() { ; CHECK-LABEL: define { , , , } @fold_scalable_vector_deinterleave4_splat() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , } @llvm.vector.deinterleave4.nxv16i32( splat (i32 1)) -; CHECK-NEXT: ret { , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , } { splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1) } ; %1 = call { , , , } @llvm.vector.deinterleave4.v4i32.v16i32( splat (i32 1)) ret { , , , } %1 @@ -196,8 +189,7 @@ define { , , , , , , } @fold_scalable_vector_deinterleave4_splatfp() { ; CHECK-LABEL: define { , , , } @fold_scalable_vector_deinterleave4_splatfp() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , } @llvm.vector.deinterleave4.nxv16f32( splat (float 1.000000e+00)) -; CHECK-NEXT: ret { , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , } { splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00) } ; %1 = call { , , , } @llvm.vector.deinterleave4.v4f32.v16f32( splat (float 1.0)) ret { , , , } %1 @@ -205,8 +197,7 @@ define { , , , , <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave5() { ; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave5() { -; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave5.v20i32(<20 x i32> ) -; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } { <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> } ; %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave5.v4i32.v20i32(<20 x i32> ) ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 @@ -214,8 +205,7 @@ define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_de define { , , , , } @fold_scalable_vector_deinterleave5() { ; CHECK-LABEL: define { , , , , } @fold_scalable_vector_deinterleave5() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , } @llvm.vector.deinterleave5.nxv20i32( zeroinitializer) -; CHECK-NEXT: ret { , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , } zeroinitializer ; %1 = call { , , , , } @llvm.vector.deinterleave5.v4i32.v20i32( zeroinitializer) ret { , , , , } %1 @@ -223,8 +213,7 @@ define { , , , , , , , } @fold_scalable_vector_deinterleave5_splat() { ; CHECK-LABEL: define { , , , , } @fold_scalable_vector_deinterleave5_splat() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , } @llvm.vector.deinterleave5.nxv20i32( splat (i32 1)) -; CHECK-NEXT: ret { , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , } { splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1) } ; %1 = call { , , , , } @llvm.vector.deinterleave5.v4i32.v20i32( splat (i32 1)) ret { , , , , } %1 @@ -232,8 +221,7 @@ define { , , , , , , , } @fold_scalable_vector_deinterleave5_splatfp() { ; CHECK-LABEL: define { , , , , } @fold_scalable_vector_deinterleave5_splatfp() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , } @llvm.vector.deinterleave5.nxv20f32( splat (float 1.000000e+00)) -; CHECK-NEXT: ret { , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , } { splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00) } ; %1 = call { , , , , } @llvm.vector.deinterleave5.v4f32.v20f32( splat (float 1.0)) ret { , , , , } %1 @@ -241,8 +229,7 @@ define { , , , , <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave6() { ; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave6() { -; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave6.v24i32(<24 x i32> ) -; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } { <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> } ; %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave6.v4i32.v24i32(<24 x i32> ) ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 @@ -250,8 +237,7 @@ define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fol define { , , , , , } @fold_scalable_vector_deinterleave6() { ; CHECK-LABEL: define { , , , , , } @fold_scalable_vector_deinterleave6() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , } @llvm.vector.deinterleave6.nxv24i32( zeroinitializer) -; CHECK-NEXT: ret { , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , } zeroinitializer ; %1 = call { , , , , , } @llvm.vector.deinterleave6.v4i32.v24i32( zeroinitializer) ret { , , , , , } %1 @@ -259,8 +245,7 @@ define { , , , , , , , , } @fold_scalable_vector_deinterleave6_splat() { ; CHECK-LABEL: define { , , , , , } @fold_scalable_vector_deinterleave6_splat() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , } @llvm.vector.deinterleave6.nxv24i32( splat (i32 1)) -; CHECK-NEXT: ret { , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , } { splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1) } ; %1 = call { , , , , , } @llvm.vector.deinterleave6.v4i32.v24i32( splat (i32 1)) ret { , , , , , } %1 @@ -268,8 +253,7 @@ define { , , , , , , , , } @fold_scalable_vector_deinterleave6_splatfp() { ; CHECK-LABEL: define { , , , , , } @fold_scalable_vector_deinterleave6_splatfp() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , } @llvm.vector.deinterleave6.nxv24f32( splat (float 1.000000e+00)) -; CHECK-NEXT: ret { , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , } { splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00) } ; %1 = call { , , , , , } @llvm.vector.deinterleave6.v4f32.v24f32( splat (float 1.0)) ret { , , , , , } %1 @@ -277,8 +261,7 @@ define { , , , , <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave7() { ; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave7() { -; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave7.v28i32(<28 x i32> ) -; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } { <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> } ; %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave7.v4i32.v28i32(<28 x i32> ) ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 @@ -286,8 +269,7 @@ define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x define { , , , , , , } @fold_scalable_vector_deinterleave7() { ; CHECK-LABEL: define { , , , , , , } @fold_scalable_vector_deinterleave7() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , } @llvm.vector.deinterleave7.nxv28i32( zeroinitializer) -; CHECK-NEXT: ret { , , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , , } zeroinitializer ; %1 = call { , , , , , , } @llvm.vector.deinterleave7.v4i32.v28i32( zeroinitializer) ret { , , , , , , } %1 @@ -295,8 +277,7 @@ define { , , , , , , , , , } @fold_scalable_vector_deinterleave7_splat() { ; CHECK-LABEL: define { , , , , , , } @fold_scalable_vector_deinterleave7_splat() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , } @llvm.vector.deinterleave7.nxv28i32( splat (i32 1)) -; CHECK-NEXT: ret { , , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , , } { splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1) } ; %1 = call { , , , , , , } @llvm.vector.deinterleave7.v4i32.v28i32( splat (i32 1)) ret { , , , , , , } %1 @@ -304,8 +285,7 @@ define { , , , , , , , , , } @fold_scalable_vector_deinterleave7_splatfp() { ; CHECK-LABEL: define { , , , , , , } @fold_scalable_vector_deinterleave7_splatfp() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , } @llvm.vector.deinterleave7.nxv28f32( splat (float 1.000000e+00)) -; CHECK-NEXT: ret { , , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , , } { splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00) } ; %1 = call { , , , , , , } @llvm.vector.deinterleave7.v4f32.v28f32( splat (float 1.0)) ret { , , , , , , } %1 @@ -313,8 +293,7 @@ define { , , , , <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave8() { ; CHECK-LABEL: define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @fold_vector_deinterleave8() { -; CHECK-NEXT: [[TMP1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave8.v32i32(<32 x i32> ) -; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[TMP1]] +; CHECK-NEXT: ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } { <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> , <4 x i32> } ; %1 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.vector.deinterleave8.v4i32.v32i32(<32 x i32> ) ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %1 @@ -322,8 +301,7 @@ define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x define { , , , , , , , } @fold_scalable_vector_deinterleave8() { ; CHECK-LABEL: define { , , , , , , , } @fold_scalable_vector_deinterleave8() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , , } @llvm.vector.deinterleave8.nxv32i32( zeroinitializer) -; CHECK-NEXT: ret { , , , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , , , } zeroinitializer ; %1 = call { , , , , , , , } @llvm.vector.deinterleave8.v4i32.v32i32( zeroinitializer) ret { , , , , , , , } %1 @@ -331,8 +309,7 @@ define { , , , , , , , , , , } @fold_scalable_vector_deinterleave8_splat() { ; CHECK-LABEL: define { , , , , , , , } @fold_scalable_vector_deinterleave8_splat() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , , } @llvm.vector.deinterleave8.nxv32i32( splat (i32 1)) -; CHECK-NEXT: ret { , , , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , , , } { splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1), splat (i32 1) } ; %1 = call { , , , , , , , } @llvm.vector.deinterleave8.v4i32.v32i32( splat (i32 1)) ret { , , , , , , , } %1 @@ -340,8 +317,7 @@ define { , , , , , , , , , , } @fold_scalable_vector_deinterleave8_splatfp() { ; CHECK-LABEL: define { , , , , , , , } @fold_scalable_vector_deinterleave8_splatfp() { -; CHECK-NEXT: [[TMP1:%.*]] = call { , , , , , , , } @llvm.vector.deinterleave8.nxv32f32( splat (float 1.000000e+00)) -; CHECK-NEXT: ret { , , , , , , , } [[TMP1]] +; CHECK-NEXT: ret { , , , , , , , } { splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00) } ; %1 = call { , , , , , , , } @llvm.vector.deinterleave8.v4f32.v32f32( splat (float 1.0)) ret { , , , , , , , } %1 From 664b3ad3e305ef70380f3e82aa1d7c2ecc4480b7 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 18 Nov 2025 21:01:40 -0800 Subject: [PATCH 3/4] fixup! address review comment --- llvm/lib/Analysis/ConstantFolding.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index c5eed99027cb0..4bece85d3cfbf 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -4442,19 +4442,19 @@ ConstantFoldStructCall(StringRef Name, Intrinsic::ID IntrinsicID, auto *Vec = Operands[0]; auto *VecTy = cast(Vec->getType()); + ElementCount ResultEC = + VecTy->getElementCount().divideCoefficientBy(NumResults); + if (auto *EltC = Vec->getSplatValue()) { - ElementCount HalfEC = - VecTy->getElementCount().divideCoefficientBy(NumResults); - auto *HalfVec = ConstantVector::getSplat(HalfEC, EltC); - SmallVector Results(NumResults, HalfVec); + auto *ResultVec = ConstantVector::getSplat(ResultEC, EltC); + SmallVector Results(NumResults, ResultVec); return ConstantStruct::get(StTy, Results); } - if (!isa(Vec->getType())) + if (!ResultEC.isFixed()) return nullptr; - unsigned NumElements = - VecTy->getElementCount().getFixedValue() / NumResults; + unsigned NumElements = ResultEC.getFixedValue(); SmallVector Results(NumResults); SmallVector Elements(NumElements); for (unsigned I = 0; I != NumResults; ++I) { From 4b055076c05b24f2b26d7b84677a6f0d8ba1fc66 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 19 Nov 2025 11:08:16 -0800 Subject: [PATCH 4/4] fixup! formatting --- llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll b/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll index f76aad41c1127..5d9ed867c5e68 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll @@ -147,15 +147,15 @@ define { , , } @fold_scal ret { , , } %1 } -define {, , } @fold_scalable_vector_deinterleave3_splat() { +define { , , } @fold_scalable_vector_deinterleave3_splat() { ; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3_splat() { ; CHECK-NEXT: ret { , , } { splat (i32 1), splat (i32 1), splat (i32 1) } ; %1 = call { , , } @llvm.vector.deinterleave3.v4i32.v12i32( splat (i32 1)) - ret {, , } %1 + ret { , , } %1 } -define {, , } @fold_scalable_vector_deinterleave3_splatfp() { +define { , , } @fold_scalable_vector_deinterleave3_splatfp() { ; CHECK-LABEL: define { , , } @fold_scalable_vector_deinterleave3_splatfp() { ; CHECK-NEXT: ret { , , } { splat (float 1.000000e+00), splat (float 1.000000e+00), splat (float 1.000000e+00) } ;