summaryrefslogtreecommitdiff
path: root/lib/Target
diff options
context:
space:
mode:
authorAdam Nemet <anemet@apple.com>2014-04-17 01:01:37 +0000
committerAdam Nemet <anemet@apple.com>2014-04-17 01:01:37 +0000
commite1a38f70414e10c7ac239dcc5b72fcdf6df1ccdb (patch)
treef75427a239cbed92f2425dc65a583c8971272387 /lib/Target
parentd6312bbbbd7739c8bfd8cc1ddad7662b1c6ee158 (diff)
downloadllvm-e1a38f70414e10c7ac239dcc5b72fcdf6df1ccdb.tar.gz
llvm-e1a38f70414e10c7ac239dcc5b72fcdf6df1ccdb.tar.bz2
llvm-e1a38f70414e10c7ac239dcc5b72fcdf6df1ccdb.tar.xz
[ARM64] Fix "Cannot select" for vector ctpop
The commit of r205855: Author: Arnold Schwaighofer <aschwaighofer@apple.com> Date: Wed Apr 9 14:20:47 2014 +0000 SLPVectorizer: Only vectorize intrinsics whose operands are widened equally The vectorizer only knows how to vectorize intrinics by widening all operands by the same factor. Patch by Tyler Nowicki! exposed a backend bug causing a regression (Cannot select ctpop). The commit msg is a bit confusing because the patch actually changes the behavior for the loop-vectorizer as well. As things got refactored into a helper ctpop got snuck in to the trivially-vectorizable helper which is now used by both vectorizers. In other words, we started seeing vector-ctpops in the backend. This change makes ctpop LegalizeAction::Expand for the types not supported by the byte-only CNT instruction. We may be able to custom-lower these later to a single CNT but this is to fix the compiler crash first. Fixes <rdar://problem/16578951> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206433 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/ARM64/ARM64ISelLowering.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/lib/Target/ARM64/ARM64ISelLowering.cpp b/lib/Target/ARM64/ARM64ISelLowering.cpp
index adf8abb57b..aae018d4e2 100644
--- a/lib/Target/ARM64/ARM64ISelLowering.cpp
+++ b/lib/Target/ARM64/ARM64ISelLowering.cpp
@@ -504,6 +504,10 @@ void ARM64TargetLowering::addTypeForNEON(EVT VT, EVT PromotedBitwiseVT) {
setOperationAction(ISD::VSELECT, VT.getSimpleVT(), Expand);
setLoadExtAction(ISD::EXTLOAD, VT.getSimpleVT(), Expand);
+ // CNT supports only B element sizes.
+ if (VT != MVT::v8i8 && VT != MVT::v16i8)
+ setOperationAction(ISD::CTPOP, VT.getSimpleVT(), Expand);
+
setOperationAction(ISD::UDIV, VT.getSimpleVT(), Expand);
setOperationAction(ISD::SDIV, VT.getSimpleVT(), Expand);
setOperationAction(ISD::UREM, VT.getSimpleVT(), Expand);