diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -1091,6 +1091,8 @@ unsigned OldShiftOpcode, unsigned NewShiftOpcode, SelectionDAG &DAG) const override; + bool preferScalarizeSplat(unsigned Opc) const override; + bool shouldFoldConstantShiftPairToMask(const SDNode *N, CombineLevel Level) const override; diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6012,6 +6012,10 @@ return NewShiftOpcode == ISD::SHL; } +bool X86TargetLowering::preferScalarizeSplat(unsigned Opc) const { + return Opc != ISD::FP_EXTEND; +} + bool X86TargetLowering::shouldFoldConstantShiftPairToMask( const SDNode *N, CombineLevel Level) const { assert(((N->getOpcode() == ISD::SHL && diff --git a/llvm/test/CodeGen/X86/prefer-fpext-splat.ll b/llvm/test/CodeGen/X86/prefer-fpext-splat.ll --- a/llvm/test/CodeGen/X86/prefer-fpext-splat.ll +++ b/llvm/test/CodeGen/X86/prefer-fpext-splat.ll @@ -4,9 +4,7 @@ define <4 x double> @prefer(float* %p) { ; CHECK-LABEL: prefer: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; CHECK-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0 -; CHECK-NEXT: vbroadcastsd %xmm0, %ymm0 +; CHECK-NEXT: vcvtps2pd (%rdi){1to4}, %ymm0 ; CHECK-NEXT: retq entry: %0 = load float, float* %p, align 4