From 405e25cd6a109551ce483272e16e2095bdb355f6 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Tue, 6 Dec 2016 18:38:29 +0000 Subject: [PATCH] GlobalISel: stop the legalizer from trying to handle oddly-sized types. It'll almost immediately fail because it always tries to half/double the size until it finds a legal one. Unfortunately, this triggers an assertion preventing the DAG fallback from being possible. llvm-svn: 288834 --- llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp | 5 +++++ llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp index ebbed12..2b99a55 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp @@ -71,6 +71,11 @@ 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 || diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll index e7b1f04e..304cd5e 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll @@ -42,6 +42,7 @@ define [1 x double] @constant() { ; PHI. If so, we cannot complete the G_PHI and mustn't try or bad things ; happen. ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for pending_phis +; FALLBACK-WITH-REPORT-OUT-LABEL: pending_phis: define i32 @pending_phis(i1 %tst, i32 %val, i32* %addr) { br i1 %tst, label %true, label %false @@ -57,3 +58,10 @@ false: br label %end } + +; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for odd_type +; FALLBACK-WITH-REPORT-OUT-LABEL: odd_type: +define void @odd_type(i42* %addr) { + %val42 = load i42, i42* %addr + ret void +} -- 2.7.4