summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Hexagon/RDFRegisters.cpp
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-02-17 22:14:51 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-02-17 22:14:51 +0000
commit1aaf41af54fca47baa8caf3a4ec5b097d4c17976 (patch)
treecf9568c0b367b03e4a4c91d6f035f06783a0dbcd /llvm/lib/Target/Hexagon/RDFRegisters.cpp
parentbca05df38b0122945b58c559c452c03b8e81c2ce (diff)
downloadbcm5719-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.cpp15
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
OpenPOWER on IntegriCloud