diff options
author | Matthias Braun <matze@braunis.de> | 2015-11-17 00:50:55 +0000 |
---|---|---|
committer | Matthias Braun <matze@braunis.de> | 2015-11-17 00:50:55 +0000 |
commit | fe9d6f211f0b0b4beed7abd97c9e59057477234c (patch) | |
tree | fd51e83ab8831b882e22f053732d2d837521feed /llvm/utils/TableGen | |
parent | cdec7ee565e5bcf399537c0dc218a4fdaba5fdac (diff) | |
download | bcm5719-llvm-fe9d6f211f0b0b4beed7abd97c9e59057477234c.tar.gz bcm5719-llvm-fe9d6f211f0b0b4beed7abd97c9e59057477234c.zip |
Assume lane masks are always precise
Allowing imprecise lane masks in case of more than 32 sub register lanes
lead to some tricky corner cases, and I need another bugfix for another
one. Instead I rather declare lane masks as precise and let tablegen
abort if we do not have enough bits.
This does not affect any in-tree target, even AMDGPU only needs 16 lanes
at the moment. If the 32 lanes turn out to be a problem in the future,
then we can easily change the LaneBitmask typedef to uint64_t.
Differential Revision: http://reviews.llvm.org/D14557
llvm-svn: 253279
Diffstat (limited to 'llvm/utils/TableGen')
-rw-r--r-- | llvm/utils/TableGen/CodeGenRegisters.cpp | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/llvm/utils/TableGen/CodeGenRegisters.cpp b/llvm/utils/TableGen/CodeGenRegisters.cpp index 0181f15d210..ca316e96a21 100644 --- a/llvm/utils/TableGen/CodeGenRegisters.cpp +++ b/llvm/utils/TableGen/CodeGenRegisters.cpp @@ -1171,20 +1171,13 @@ void CodeGenRegBank::computeSubRegLaneMasks() { CoveringLanes = ~0u; for (auto &Idx : SubRegIndices) { if (Idx.getComposites().empty()) { + if (Bit > 32) { + PrintFatalError( + Twine("Ran out of lanemask bits to represent subregister ") + + Idx.getName()); + } Idx.LaneMask = 1u << Bit; - // Share bit 31 in the unlikely case there are more than 32 leafs. - // - // Sharing bits is harmless; it allows graceful degradation in targets - // with more than 32 vector lanes. They simply get a limited resolution - // view of lanes beyond the 32nd. - // - // See also the comment for getSubRegIndexLaneMask(). - if (Bit < 31) - ++Bit; - else - // Once bit 31 is shared among multiple leafs, the 'lane' it represents - // is no longer covering its registers. - CoveringLanes &= ~(1u << Bit); + ++Bit; } else { Idx.LaneMask = 0; } |