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 @@ -21008,8 +21008,8 @@ if (N0.isUndef() && N1.getOpcode() == ISD::BITCAST && N1.getOperand(0).getOpcode() == ISD::EXTRACT_SUBVECTOR && N1.getOperand(0).getOperand(1) == N2 && - N1.getOperand(0).getOperand(0).getValueType().getVectorNumElements() == - VT.getVectorNumElements() && + N1.getOperand(0).getOperand(0).getValueType().getVectorElementCount() == + VT.getVectorElementCount() && N1.getOperand(0).getOperand(0).getValueType().getSizeInBits() == VT.getSizeInBits()) { return DAG.getBitcast(VT, N1.getOperand(0).getOperand(0)); @@ -21026,7 +21026,7 @@ EVT CN1VT = CN1.getValueType(); if (CN0VT.isVector() && CN1VT.isVector() && CN0VT.getVectorElementType() == CN1VT.getVectorElementType() && - CN0VT.getVectorNumElements() == VT.getVectorNumElements()) { + CN0VT.getVectorElementCount() == VT.getVectorElementCount()) { SDValue NewINSERT = DAG.getNode(ISD::INSERT_SUBVECTOR, SDLoc(N), CN0.getValueType(), CN0, CN1, N2); return DAG.getBitcast(VT, NewINSERT); @@ -21107,8 +21107,10 @@ // If the input vector is a concatenation, and the insert replaces // one of the pieces, we can optimize into a single concat_vectors. if (N0.getOpcode() == ISD::CONCAT_VECTORS && N0.hasOneUse() && - N0.getOperand(0).getValueType() == N1.getValueType()) { - unsigned Factor = N1.getValueType().getVectorNumElements(); + N0.getOperand(0).getValueType() == N1.getValueType() && + N0.getOperand(0).getValueType().isScalableVector() == + N1.getValueType().isScalableVector()) { + unsigned Factor = N1.getValueType().getVectorMinNumElements(); SmallVector Ops(N0->op_begin(), N0->op_end()); Ops[InsIdx / Factor] = N1; return DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(N), VT, Ops); diff --git a/llvm/test/CodeGen/AArch64/dag-combine-insert-subvector.ll b/llvm/test/CodeGen/AArch64/dag-combine-insert-subvector.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/dag-combine-insert-subvector.ll @@ -0,0 +1,28 @@ +; RUN: llc < %s -o /dev/null 2>&1 | FileCheck --allow-empty %s + +; This regression test is defending against a ElementCount warning 'Possible incorrect use of +; EVT::getVectorNumElements() for scalable vector'. This warning appeared in +; DAGCombiner::visitINSERT_SUBVECTOR because of the use of getVectorNumElements() on scalable +; types. + +; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it. +; CHECK-NOT: warning: + +target triple = "aarch64-unknown-linux-gnu" +attributes #0 = {"target-features"="+sve"} + +declare <16 x float> @llvm.experimental.vector.extract.v16f32.nxv4f32(, i64) +declare @llvm.experimental.vector.insert.nxv2f64.v8f64(, <8 x double>, i64) + +define @reproducer_one( %vec_a) #0 { + %a = call <16 x float> @llvm.experimental.vector.extract.v16f32.nxv4f32( %vec_a, i64 0) + %b = bitcast <16 x float> %a to <8 x double> + %retval = call @llvm.experimental.vector.insert.nxv2f64.v8f64( undef, <8 x double> %b, i64 0) + ret %retval +} + +define @reproducer_two(<4 x double> %a, <4 x double> %b) #0 { + %concat = shufflevector <4 x double> %a, <4 x double> %b, <8 x i32> + %retval = call @llvm.experimental.vector.insert.nxv2f64.v8f64( undef, <8 x double> %concat, i64 0) + ret %retval +}