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 @@ -21703,14 +21703,15 @@ if (DAG.isKnownNeverZero(Index)) return DAG.getUNDEF(ScalarVT); - // Check if the result type doesn't match the inserted element type. A - // SCALAR_TO_VECTOR may truncate the inserted element and the - // EXTRACT_VECTOR_ELT may widen the extracted vector. + // Check if the result type doesn't match the inserted element type. + // The inserted element and extracted element may have mismatched bitwidth. + // As a result, EXTRACT_VECTOR_ELT may extend or truncate 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); + return DAG.getNode(ISD::ANY_EXTEND, DL, ScalarVT, InOp); } 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,19 @@ +; 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) nounwind { +; CHECK-LABEL: f: +; CHECK: # %bb.0: +; CHECK-NEXT: pushq %rax +; 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: 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) nounwind