summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-12-12 20:23:12 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-12-12 20:23:12 +0000
commitedcd9dcbc498bcf9013e6db7004c916896f42b79 (patch)
tree70e97764ee1aa68ce5e29445af3b9c2b01147898 /llvm/lib
parentc8e1c0945a33b274eeedf55b5c923ef54199fc7b (diff)
downloadbcm5719-llvm-edcd9dcbc498bcf9013e6db7004c916896f42b79.tar.gz
bcm5719-llvm-edcd9dcbc498bcf9013e6db7004c916896f42b79.zip
[Hexagon] Better detection of identity and undef masks in shuffles
llvm-svn: 320523
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
index 4e5359582fc..537f97c9a98 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
@@ -884,8 +884,12 @@ static bool isUndef(ArrayRef<int> Mask) {
}
static bool isIdentity(ArrayRef<int> Mask) {
- unsigned Size = Mask.size();
- return findStrip(Mask, 1, Size) == std::make_pair(0, Size);
+ for (int I = 0, E = Mask.size(); I != E; ++I) {
+ int M = Mask[I];
+ if (M >= 0 && M != I)
+ return false;
+ }
+ return true;
}
static bool isPermutation(ArrayRef<int> Mask) {
@@ -1181,6 +1185,9 @@ OpRef HvxSelector::shuffs1(ShuffleMask SM, OpRef Va, ResultStack &Results) {
OpRef HvxSelector::shuffs2(ShuffleMask SM, OpRef Va, OpRef Vb,
ResultStack &Results) {
DEBUG_WITH_TYPE("isel", {dbgs() << __func__ << '\n';});
+ if (isUndef(SM.Mask))
+ return OpRef::undef(getSingleVT(MVT::i8));
+
OpRef C = contracting(SM, Va, Vb, Results);
if (C.isValid())
return C;
@@ -1211,6 +1218,11 @@ OpRef HvxSelector::shuffp1(ShuffleMask SM, OpRef Va, ResultStack &Results) {
DEBUG_WITH_TYPE("isel", {dbgs() << __func__ << '\n';});
int VecLen = SM.Mask.size();
+ if (isIdentity(SM.Mask))
+ return Va;
+ if (isUndef(SM.Mask))
+ return OpRef::undef(getPairVT(MVT::i8));
+
SmallVector<int,128> PackedMask(VecLen);
OpRef P = packs(SM, OpRef::lo(Va), OpRef::hi(Va), Results, PackedMask);
if (P.isValid()) {
@@ -1241,8 +1253,10 @@ OpRef HvxSelector::shuffp1(ShuffleMask SM, OpRef Va, ResultStack &Results) {
OpRef HvxSelector::shuffp2(ShuffleMask SM, OpRef Va, OpRef Vb,
ResultStack &Results) {
DEBUG_WITH_TYPE("isel", {dbgs() << __func__ << '\n';});
- int VecLen = SM.Mask.size();
+ if (isUndef(SM.Mask))
+ return OpRef::undef(getPairVT(MVT::i8));
+ int VecLen = SM.Mask.size();
SmallVector<int,256> PackedMask(VecLen);
OpRef P = packp(SM, Va, Vb, Results, PackedMask);
if (P.isValid())
OpenPOWER on IntegriCloud