diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-04-14 16:21:55 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-04-14 16:21:55 +0000 |
commit | f928e24d2a31722da548a0ce767daa1976522da9 (patch) | |
tree | 52e73ad73471f16a3af142ecc82996a1428d871e /llvm/lib/Target/Hexagon/HexagonBlockRanges.cpp | |
parent | 478cd98b22cd1e645cd15a6475773b8cf5a857ee (diff) | |
download | bcm5719-llvm-f928e24d2a31722da548a0ce767daa1976522da9.tar.gz bcm5719-llvm-f928e24d2a31722da548a0ce767daa1976522da9.zip |
[Hexagon] Fix a latent problem with interpreting live-in lane masks
A non-zero lane mask on a register with no subregister means that the
whole register is live-in. It is equivalent to a full mask.
llvm-svn: 300335
Diffstat (limited to 'llvm/lib/Target/Hexagon/HexagonBlockRanges.cpp')
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonBlockRanges.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonBlockRanges.cpp b/llvm/lib/Target/Hexagon/HexagonBlockRanges.cpp index 721cf041728..1640b40c164 100644 --- a/llvm/lib/Target/Hexagon/HexagonBlockRanges.cpp +++ b/llvm/lib/Target/Hexagon/HexagonBlockRanges.cpp @@ -232,14 +232,16 @@ HexagonBlockRanges::RegisterSet HexagonBlockRanges::getLiveIns( const TargetRegisterInfo &TRI) { RegisterSet LiveIns; RegisterSet Tmp; + for (auto I : B.liveins()) { - if (I.LaneMask.all()) { - Tmp.insert({I.PhysReg,0}); + MCSubRegIndexIterator S(I.PhysReg, &TRI); + if (I.LaneMask.all() || (I.LaneMask.any() && !S.isValid())) { + Tmp.insert({I.PhysReg, 0}); continue; } - for (MCSubRegIndexIterator S(I.PhysReg, &TRI); S.isValid(); ++S) { - LaneBitmask M = TRI.getSubRegIndexLaneMask(S.getSubRegIndex()); - if ((M & I.LaneMask).any()) + for (; S.isValid(); ++S) { + unsigned SI = S.getSubRegIndex(); + if ((I.LaneMask & TRI.getSubRegIndexLaneMask(SI)).any()) Tmp.insert({S.getSubReg(), 0}); } } |