Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -18278,6 +18278,9 @@ return SDValue(); SDValue ExtractedFromVec = Op.getOperand(0); + if (ExtractedFromVec.getValueType().isScalableVector()) + return SDValue(); + const APInt &ExtractIdx = Op.getConstantOperandAPInt(1); if (ExtractIdx.uge(ExtractedFromVec.getValueType().getVectorNumElements())) return SDValue(); Index: llvm/test/CodeGen/AArch64/sve-merging-stores.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AArch64/sve-merging-stores.ll @@ -0,0 +1,32 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s + +%"complex" = type { { double, double } } + +; Function Attrs: argmemonly nounwind readonly +declare @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64(, i32 immarg) #3 + +; Function Attrs: argmemonly nounwind readonly +declare @llvm.aarch64.sve.ld2.nxv4f64.nxv2i1(, double*) #3 + +; Function Attrs: nounwind readnone +declare double @llvm.aarch64.sve.faddv.nxv2f64(, ) #2 + +define void @foo1(%"complex"* %outval, %pred, double *%inptr) { +; CHECK-LABEL: foo1: +; CHECK: ld2d { z0.d, z1.d }, p0/z, [x1] +; CHECK-NEXT: faddv d2, p0, z0.d +; CHECK-NEXT: faddv d0, p0, z1.d +; CHECK-NEXT: mov v2.d[1], v0.d[0] +; CHECK-NEXT: str q2, [x0] + %realp = getelementptr inbounds %"complex", %"complex"* %outval, i64 0, i32 0, i32 0 + %imagp = getelementptr inbounds %"complex", %"complex"* %outval, i64 0, i32 0, i32 1 + %1 = call @llvm.aarch64.sve.ld2.nxv4f64.nxv2i1( %pred, double* nonnull %inptr) + %2 = call @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64( %1, i32 0) + %3 = call double @llvm.aarch64.sve.faddv.nxv2f64( %pred, %2) + %4 = call @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64( %1, i32 1) + %5 = call double @llvm.aarch64.sve.faddv.nxv2f64( %pred, %4) + store double %3, double* %realp, align 8 + store double %5, double* %imagp, align 8 + ret void +} +