diff options
author | Adam Nemet <anemet@apple.com> | 2014-04-17 01:01:37 +0000 |
---|---|---|
committer | Adam Nemet <anemet@apple.com> | 2014-04-17 01:01:37 +0000 |
commit | e1a38f70414e10c7ac239dcc5b72fcdf6df1ccdb (patch) | |
tree | f75427a239cbed92f2425dc65a583c8971272387 /lib/Target | |
parent | d6312bbbbd7739c8bfd8cc1ddad7662b1c6ee158 (diff) | |
download | llvm-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.cpp | 4 |
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); |