diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-02-17 22:14:51 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-02-17 22:14:51 +0000 |
commit | 1aaf41af54fca47baa8caf3a4ec5b097d4c17976 (patch) | |
tree | cf9568c0b367b03e4a4c91d6f035f06783a0dbcd /llvm/lib/Target/Hexagon/RDFRegisters.cpp | |
parent | bca05df38b0122945b58c559c452c03b8e81c2ce (diff) | |
download | bcm5719-llvm-1aaf41af54fca47baa8caf3a4ec5b097d4c17976.tar.gz bcm5719-llvm-1aaf41af54fca47baa8caf3a4ec5b097d4c17976.zip |
[Hexagon] Start using regmasks on calls
Reapply r295371 with a fix for the Windows bot failures.
llvm-svn: 295504
Diffstat (limited to 'llvm/lib/Target/Hexagon/RDFRegisters.cpp')
-rw-r--r-- | llvm/lib/Target/Hexagon/RDFRegisters.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/llvm/lib/Target/Hexagon/RDFRegisters.cpp b/llvm/lib/Target/Hexagon/RDFRegisters.cpp index 74d6ba53be7..e1589f02efe 100644 --- a/llvm/lib/Target/Hexagon/RDFRegisters.cpp +++ b/llvm/lib/Target/Hexagon/RDFRegisters.cpp @@ -70,18 +70,27 @@ std::set<RegisterId> PhysicalRegisterInfo::getAliasSet(RegisterId Reg) const { assert(isRegMaskId(Reg) || TargetRegisterInfo::isPhysicalRegister(Reg)); if (isRegMaskId(Reg)) { // XXX SLOW - // XXX Add other regmasks to the set. const uint32_t *MB = getRegMaskBits(Reg); for (unsigned i = 1, e = TRI.getNumRegs(); i != e; ++i) { if (MB[i/32] & (1u << (i%32))) continue; AS.insert(i); } + for (const uint32_t *RM : RegMasks) { + RegisterId MI = getRegMaskId(RM); + if (MI != Reg && aliasMM(RegisterRef(Reg), RegisterRef(MI))) + AS.insert(MI); + } return AS; } for (MCRegAliasIterator AI(Reg, &TRI, false); AI.isValid(); ++AI) AS.insert(*AI); + for (const uint32_t *RM : RegMasks) { + RegisterId MI = getRegMaskId(RM); + if (aliasRM(RegisterRef(Reg), RegisterRef(MI))) + AS.insert(MI); + } return AS; } @@ -153,10 +162,10 @@ bool PhysicalRegisterInfo::aliasRM(RegisterRef RR, RegisterRef RM) const { // is a superset of the lane mask from the register class, check the regmask // bit directly. if (RR.Mask == LaneBitmask::getAll()) - return Preserved; + return !Preserved; const TargetRegisterClass *RC = RegInfos[RR.Reg].RegClass; if (RC != nullptr && (RR.Mask & RC->LaneMask) == RC->LaneMask) - return Preserved; + return !Preserved; // Otherwise, check all subregisters whose lane mask overlaps the given // mask. For each such register, if it is preserved by the regmask, then |