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 | 287f989dde900b6f3b36328980242e040e6a7582 (patch) | |
| tree | 7c34cfffeb6cb9eb9143aa3862685872b7cd4384 /llvm/lib/Target/ARM64 | |
| parent | 08587f8ccd85d58505e58890c291eacdf4a263e0 (diff) | |
| download | bcm5719-llvm-287f989dde900b6f3b36328980242e040e6a7582.tar.gz bcm5719-llvm-287f989dde900b6f3b36328980242e040e6a7582.zip | |
[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>
llvm-svn: 206433
Diffstat (limited to 'llvm/lib/Target/ARM64')
| -rw-r--r-- | llvm/lib/Target/ARM64/ARM64ISelLowering.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp b/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp index adf8abb57b5..aae018d4e28 100644 --- a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp +++ b/llvm/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); |

