diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-12-12 20:23:12 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-12-12 20:23:12 +0000 |
commit | ac78b4324b04deca9191bfa9d6a3c5d4b825aca6 (patch) | |
tree | bfa9b02fa89c069c86072946ffef30a51a369765 /lib | |
parent | 206ac235d708d5c36ae70be6f2e0b5f6bedab650 (diff) |
[Hexagon] Better detection of identity and undef masks in shuffles
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320523 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp b/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp index 4e5359582fc..537f97c9a98 100644 --- a/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp +++ b/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()) |