From 2ef07e92b85a36c2bd4a72d23cbb2fb64747dffa Mon Sep 17 00:00:00 2001 From: Volkan Keles Date: Thu, 1 Nov 2018 19:01:53 +0000 Subject: [PATCH] [GlobalISel] Fix a bug in LegalizeRuleSet::clampMaxNumElements Summary: This function was causing a crash when `MaxElements == 1` because it was trying to create a single element vector type. Reviewers: dsanders, aemerson, aditya_nandakumar Reviewed By: dsanders Subscribers: rovka, kristof.beyls, javed.absar, llvm-commits Differential Revision: https://reviews.llvm.org/D53734 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@345875 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/GlobalISel/LegalizerInfo.h | 2 ++ lib/Target/AArch64/AArch64LegalizerInfo.cpp | 6 ++-- .../AArch64/GlobalISel/legalize-load-fewerElts.mir | 39 ++++++++++++++++++++++ .../AArch64/GlobalISel/legalize-load-v4s32.mir | 21 ------------ 4 files changed, 45 insertions(+), 23 deletions(-) create mode 100644 test/CodeGen/AArch64/GlobalISel/legalize-load-fewerElts.mir delete mode 100644 test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir diff --git a/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h index e0ea5755387..755805de1b0 100644 --- a/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h +++ b/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h @@ -693,6 +693,8 @@ public: }, [=](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())); }); diff --git a/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/lib/Target/AArch64/AArch64LegalizerInfo.cpp index 474516ff2cc..4b5e10ac4ec 100644 --- a/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ b/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -169,7 +169,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) { .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 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) { 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) diff --git a/test/CodeGen/AArch64/GlobalISel/legalize-load-fewerElts.mir b/test/CodeGen/AArch64/GlobalISel/legalize-load-fewerElts.mir new file mode 100644 index 00000000000..7f42f6e6c33 --- /dev/null +++ b/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) + +... diff --git a/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir b/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir deleted file mode 100644 index 8493bd8292c..00000000000 --- a/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir +++ /dev/null @@ -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) - -... -- 2.11.0