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 @@ -18287,6 +18287,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(); diff --git a/llvm/test/CodeGen/AArch64/sve-merging-stores.ll b/llvm/test/CodeGen/AArch64/sve-merging-stores.ll new file mode 100644 --- /dev/null +++ b/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 +} +