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 @@ -17843,8 +17843,11 @@ Elt = (Idx < (int)NumElts) ? Idx : Idx - (int)NumElts; Index = DAG.getConstant(Elt, DL, Index.getValueType()); } - } else if (VecOp.getOpcode() == ISD::CONCAT_VECTORS && - !BCNumEltsChanged && VecVT.getVectorElementType() == ScalarVT) { + } else if (VecOp.getOpcode() == ISD::CONCAT_VECTORS && !BCNumEltsChanged && + VecVT.getVectorElementType() == ScalarVT && + (!LegalTypes || + TLI.isTypeLegal( + VecOp.getOperand(0).getValueType().getVectorElementType()))) { // extract_vector_elt (concat_vectors v2i16:a, v2i16:b), 0 // -> extract_vector_elt a, 0 // extract_vector_elt (concat_vectors v2i16:a, v2i16:b), 1 diff --git a/llvm/test/CodeGen/AArch64/regress-combine-extract-vectors.ll b/llvm/test/CodeGen/AArch64/regress-combine-extract-vectors.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/regress-combine-extract-vectors.ll @@ -0,0 +1,17 @@ +; RUN: llc -asm-verbose=0 -mtriple aarch64-arm-none-eabi < %s | FileCheck %s + +; The following code previously broke in the DAGCombiner. Specifically, trying to combine: +; extract_vector_elt (concat_vectors v4i16:a, v4i16:b), x +; -> extract_vector_elt a, x + +define half @test_combine_extract_concat_vectors(<4 x i16> %a) nounwind { +entry: + %0 = shufflevector <4 x i16> %a, <4 x i16> undef, <8 x i32> + %1 = bitcast <8 x i16> %0 to <8 x half> + %2 = extractelement <8 x half> %1, i32 3 + ret half %2 +} + +; CHECK-LABEL: test_combine_extract_concat_vectors: +; CHECK-NEXT: mov h0, v0.h[3] +; CHECK-NEXT: ret