diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 7a816de53dbd3..52e0bb8a9b83d 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -2756,8 +2756,10 @@ X86TargetLowering::getPreferredVectorAction(MVT VT) const { !Subtarget.hasBWI()) return TypeSplitVector; + // Since v8f16 is legal, widen anything over v4f16. if (!VT.isScalableVector() && VT.getVectorNumElements() != 1 && - !Subtarget.hasF16C() && VT.getVectorElementType() == MVT::f16) + VT.getVectorNumElements() <= 4 && !Subtarget.hasF16C() && + VT.getVectorElementType() == MVT::f16) return TypeSplitVector; if (!VT.isScalableVector() && VT.getVectorNumElements() != 1 && diff --git a/llvm/test/CodeGen/X86/pr152150.ll b/llvm/test/CodeGen/X86/pr152150.ll new file mode 100644 index 0000000000000..6db3e555028cc --- /dev/null +++ b/llvm/test/CodeGen/X86/pr152150.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -mtriple=x86_64-unknown-unknown-eabi-elf | FileCheck %s + +; CHECK-LABEL: conv2d +define dso_local void @conv2d() { +.preheader: + br label %0 + +0: ; preds = %0, %.preheader + %1 = phi [4 x <7 x half>] [ zeroinitializer, %.preheader ], [ %4, %0 ] + %2 = extractvalue [4 x <7 x half>] %1, 0 + %3 = extractvalue [4 x <7 x half>] %1, 1 + %4 = insertvalue [4 x <7 x half>] poison, <7 x half> poison, 3 + br label %0 +}