diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -21708,9 +21708,13 @@ // EXTRACT_VECTOR_ELT may widen the extracted vector. SDValue InOp = VecOp.getOperand(0); if (InOp.getValueType() != ScalarVT) { - assert(InOp.getValueType().isInteger() && ScalarVT.isInteger() && - InOp.getValueType().bitsGT(ScalarVT)); - return DAG.getNode(ISD::TRUNCATE, DL, ScalarVT, InOp); + assert(InOp.getValueType().isInteger() && ScalarVT.isInteger()); + if (InOp.getValueType().bitsGT(ScalarVT)) + return DAG.getNode(ISD::TRUNCATE, DL, ScalarVT, InOp); + else if (InOp.getValueType().bitsLE(ScalarVT)) + return DAG.getNode(ISD::ANY_EXTEND, DL, ScalarVT, InOp); + else + llvm_unreachable("Insert and extract types should have different bits"); } return InOp; } diff --git a/llvm/test/CodeGen/X86/pr64323.ll b/llvm/test/CodeGen/X86/pr64323.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/pr64323.ll @@ -0,0 +1,21 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 + +; RUN: llc < %s -mtriple=x86_64 -mcpu=icelake-server | FileCheck %s + +define <1 x i1> @f(<1 x float> %0) { +; CHECK-LABEL: f: +; CHECK: # %bb.0: +; CHECK-NEXT: pushq %rax +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: vcmpeqss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k0 +; CHECK-NEXT: kmovd %k0, %edi +; CHECK-NEXT: callq g@PLT +; CHECK-NEXT: popq %rcx +; CHECK-NEXT: .cfi_def_cfa_offset 8 +; CHECK-NEXT: retq + %A = fcmp oeq <1 x float> %0, + %B = call <1 x i1> @g(<1 x i1> %A) + ret <1 x i1> %B +} + +declare <1 x i1> @g(<1 x i1> %0)