From: Volkan Keles Date: Tue, 11 Apr 2017 10:10:14 +0000 (+0000) Subject: [GlobalISel] LegalizerInfo: Enable legalization of non-power-of-2 types X-Git-Tag: llvmorg-5.0.0-rc1~8072 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=64ad85f8ba93a932a95872b0800b81e54c2e1452;p=platform%2Fupstream%2Fllvm.git [GlobalISel] LegalizerInfo: Enable legalization of non-power-of-2 types Summary: Legalize only if the type is marked as Legal or Custom. If not, return Unsupported as LegalizerHelper is not able to handle non-power-of-2 types right now. Reviewers: qcolombet, aditya_nandakumar, dsanders, t.p.northover, kristof.beyls, javed.absar, ab Reviewed By: kristof.beyls, ab Subscribers: dberris, rovka, igorb, llvm-commits Differential Revision: https://reviews.llvm.org/D31711 llvm-svn: 299929 --- diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp index a213f5e..eaf4056 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp @@ -73,11 +73,6 @@ LegalizerInfo::getAction(const InstrAspect &Aspect) const { // These *have* to be implemented for now, they're the fundamental basis of // how everything else is transformed. - // Nothing is going to go well with types that aren't a power of 2 yet, so - // don't even try because we might make things worse. - if (!isPowerOf2_64(Aspect.Type.getSizeInBits())) - return std::make_pair(Unsupported, LLT()); - // FIXME: the long-term plan calls for expansion in terms of load/store (if // they're not legal). if (Aspect.Opcode == TargetOpcode::G_SEQUENCE || @@ -86,12 +81,20 @@ LegalizerInfo::getAction(const InstrAspect &Aspect) const { Aspect.Opcode == TargetOpcode::G_UNMERGE_VALUES) return std::make_pair(Legal, Aspect.Type); + LLT Ty = Aspect.Type; LegalizeAction Action = findInActions(Aspect); + // LegalizerHelper is not able to handle non-power-of-2 types right now, so do + // not try to legalize them unless they are marked as Legal or Custom. + // FIXME: This is a temporary hack until the general non-power-of-2 + // legalization works. + if (!isPowerOf2_64(Ty.getSizeInBits()) && + !(Action == Legal || Action == Custom)) + return std::make_pair(Unsupported, LLT()); + if (Action != NotFound) return findLegalAction(Aspect, Action); unsigned Opcode = Aspect.Opcode; - LLT Ty = Aspect.Type; if (!Ty.isVector()) { auto DefaultAction = DefaultActions.find(Aspect.Opcode); if (DefaultAction != DefaultActions.end() && DefaultAction->second == Legal) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll index 0194fa0..e40199d 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll @@ -71,6 +71,14 @@ define void @odd_type(i42* %addr) { ret void } +; FALLBACK-WITH-REPORT-ERR: remark: :0:0: unable to legalize instruction: %vreg1(<7 x s32>) = G_LOAD %vreg0; mem:LD28[%addr](align=32) (in function: odd_vector) +; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for odd_vector +; FALLBACK-WITH-REPORT-OUT-LABEL: odd_vector: +define void @odd_vector(<7 x i32>* %addr) { + %vec = load <7 x i32>, <7 x i32>* %addr + ret void +} + ; RegBankSelect crashed when given invalid mappings, and AArch64's ; implementation produce valid-but-nonsense mappings for G_SEQUENCE. ; FALLBACK-WITH-REPORT-ERR: remark: :0:0: unable to map instruction diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-nonpowerof2eltsvec.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-nonpowerof2eltsvec.mir new file mode 100644 index 0000000..9928ea5 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-nonpowerof2eltsvec.mir @@ -0,0 +1,29 @@ +# RUN: llc -O0 -run-pass=legalizer -global-isel %s -o - | FileCheck %s + +--- | + target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" + target triple = "aarch64--" + define void @test_legalize_merge_v3s32() { + ret void + } +... +--- +name: test_legalize_merge_v3s32 +registers: + - { id: 0, class: _ } + - { id: 1, class: _ } + - { id: 2, class: _ } + - { id: 3, class: _ } +body: | + bb.0: + liveins: %w0, %w1, %w2 + ; CHECK-LABEL: name: test_legalize_merge_v3s32 + ; CHECK: [[ARG1:%[0-9]+]](s32) = COPY %w0 + ; CHECK: [[ARG2:%[0-9]+]](s32) = COPY %w1 + ; CHECK: [[ARG3:%[0-9]+]](s32) = COPY %w2 + ; CHECK: (<3 x s32>) = G_MERGE_VALUES [[ARG1]](s32), [[ARG2]](s32), [[ARG3]](s32) + %0(s32) = COPY %w0 + %1(s32) = COPY %w1 + %2(s32) = COPY %w2 + %3(<3 x s32>) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32) +...