diff options
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index f77076d7244c..563601b722c8 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -2275,8 +2275,15 @@ SDValue WebAssemblyTargetLowering::LowerBUILD_VECTOR(SDValue Op, return IsConstant(Lane); }; } else { - // Use a splat (which might be selected as a load splat) - Result = DAG.getSplatBuildVector(VecT, DL, SplatValue); + size_t DestLaneSize = VecT.getVectorElementType().getFixedSizeInBits(); + if (NumSplatLanes == 1 && Op->getOperand(0) == SplatValue && + (DestLaneSize == 32 || DestLaneSize == 64)) { + // Could be selected to load_zero. + Result = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VecT, SplatValue); + } else { + // Use a splat (which might be selected as a load splat) + Result = DAG.getSplatBuildVector(VecT, DL, SplatValue); + } IsLaneConstructed = [&SplatValue](size_t _, const SDValue &Lane) { return Lane == SplatValue; }; |
