From 3a103b1d2575483e50b974c1f5a41102f264d62f Mon Sep 17 00:00:00 2001 From: Volkan Keles Date: Thu, 25 Oct 2018 17:23:25 +0000 Subject: [PATCH] [AArch64][GlobalISel] Fix the LegalityPredicate for lowerIf for G_LOAD/G_STORE Summary: Currently, Legalizer is trying to lower G_LOAD with a vector type that has more than two elements due to the incorrect LegalityPredicate. This patch fixes the issue by removing the multiplication by 8 as `MemDesc.Size` already contains the size in bits. Reviewers: dsanders, aemerson Reviewed By: dsanders Subscribers: rovka, javed.absar, kristof.beyls, llvm-commits Differential Revision: https://reviews.llvm.org/D53679 llvm-svn: 345282 --- .../Target/AArch64/AArch64LegalizerInfo.cpp | 4 ++-- .../GlobalISel/legalize-load-v4s32.mir | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir diff --git a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp index b3c2fbf2b159..f0648f0b0715 100644 --- a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -167,7 +167,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) { .unsupportedIfMemSizeNotPow2() // Lower any any-extending loads left into G_ANYEXT and G_LOAD .lowerIf([=](const LegalityQuery &Query) { - return Query.Types[0].getSizeInBits() != Query.MMODescrs[0].Size * 8; + return Query.Types[0].getSizeInBits() != Query.MMODescrs[0].Size; }) .clampNumElements(0, v2s32, v2s32); @@ -185,7 +185,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) { .unsupportedIfMemSizeNotPow2() .lowerIf([=](const LegalityQuery &Query) { return Query.Types[0].isScalar() && - Query.Types[0].getSizeInBits() != Query.MMODescrs[0].Size * 8; + Query.Types[0].getSizeInBits() != Query.MMODescrs[0].Size; }) .clampNumElements(0, v2s32, v2s32); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir new file mode 100644 index 000000000000..8493bd8292c6 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-load-v4s32.mir @@ -0,0 +1,21 @@ +# 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) + +...