Index: llvm/trunk/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h +++ llvm/trunk/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h @@ -693,6 +693,8 @@ }, [=](const LegalityQuery &Query) { LLT VecTy = Query.Types[TypeIdx]; + if (MaxElements == 1) + return std::make_pair(TypeIdx, VecTy.getElementType()); return std::make_pair( TypeIdx, LLT::vector(MaxElements, VecTy.getScalarSizeInBits())); }); Index: llvm/trunk/lib/Target/AArch64/AArch64LegalizerInfo.cpp =================================================================== --- llvm/trunk/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ llvm/trunk/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -169,7 +169,8 @@ .lowerIf([=](const LegalityQuery &Query) { return Query.Types[0].getSizeInBits() != Query.MMODescrs[0].SizeInBits; }) - .clampNumElements(0, v2s32, v2s32); + .clampNumElements(0, v2s32, v2s32) + .clampMaxNumElements(0, s64, 1); getActionDefinitionsBuilder(G_STORE) .legalForTypesWithMemSize({{s8, p0, 8}, @@ -187,7 +188,8 @@ return Query.Types[0].isScalar() && Query.Types[0].getSizeInBits() != Query.MMODescrs[0].SizeInBits; }) - .clampNumElements(0, v2s32, v2s32); + .clampNumElements(0, v2s32, v2s32) + .clampMaxNumElements(0, s64, 1); // Constants getActionDefinitionsBuilder(G_CONSTANT) Index: llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-load-fewerElts.mir =================================================================== --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-load-fewerElts.mir +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-load-fewerElts.mir @@ -0,0 +1,39 @@ +# RUN: llc -march=aarch64 -o - -run-pass=legalizer -global-isel-abort=0 -debug-only=legalizer 2>&1 %s | FileCheck %s +# REQUIRES: asserts + +# CHECK: Legalize Machine IR for: load_v4s32 +# CHECK-NEXT: %{{[0-9]+}}:_(<4 x s32>) = G_LOAD %{{[0-9]+}}:_(p0) +# CHECK-NEXT: Reduce number of elements +--- +name: load_v4s32 +legalized: false +tracksRegLiveness: true +body: | + bb.1: + liveins: $x0 + + %0:_(p0) = COPY $x0 + %1:_(<4 x s32>) = G_LOAD %0(p0) :: (load 16, align 4) + %2:_(s32), %3:_(s32), %4:_(s32), %5:_(s32) = G_UNMERGE_VALUES %1(<4 x s32>) + $w0 = COPY %5(s32) + +... + +# Make sure we are able to scalarize v2s64. +# CHECK: Legalize Machine IR for: load_v2s64 +# CHECK-NEXT: %{{[0-9]+}}:_(<2 x s64>) = G_LOAD %{{[0-9]+}}:_(p0) +# CHECK-NEXT: Reduce number of elements +--- +name: load_v2s64 +legalized: false +tracksRegLiveness: true +body: | + bb.1: + liveins: $x0 + + %0:_(p0) = COPY $x0 + %1:_(<2 x s64>) = G_LOAD %0(p0) :: (load 16) + %2:_(s64), %3:_(s64) = G_UNMERGE_VALUES %1(<2 x s64>) + $x0 = COPY %3(s64) + +... Index: llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir =================================================================== --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir +++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir @@ -1,21 +0,0 @@ -# RUN: not llc -march=aarch64 -o - -run-pass=legalizer -debug-only=legalizer 2>&1 %s | FileCheck %s -# REQUIRES: asserts - -# CHECK: Legalize Machine IR for: load_v4s32 -# CHECK-NEXT: %{{[0-9]+}}:_(<4 x s32>) = G_LOAD %{{[0-9]+}}:_(p0) -# CHECK-NOT: Lower -# CHECK: unable to legalize instruction ---- -name: load_v4s32 -legalized: false -tracksRegLiveness: true -body: | - bb.1: - liveins: $x0 - - %0:_(p0) = COPY $x0 - %1:_(<4 x s32>) = G_LOAD %0(p0) :: (load 16, align 4) - %2:_(s32), %3:_(s32), %4:_(s32), %5:_(s32) = G_UNMERGE_VALUES %1(<4 x s32>) - $w0 = COPY %5(s32) - -...