summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2009-04-30 21:24:03 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2009-04-30 21:24:03 +0000
commit050631c0a6b69de52aa2e230f728cb71bc0ba876 (patch)
treedf4f9d0c347b2a974ede484979e59c4a28318a9a /llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp
parente651f25a7b3e6e0ef955a5f325ffb2ddcce51019 (diff)
downloadbcm5719-llvm-050631c0a6b69de52aa2e230f728cb71bc0ba876.tar.gz
bcm5719-llvm-050631c0a6b69de52aa2e230f728cb71bc0ba876.zip
Join cross class copies using getCommonSubClass()
llvm-svn: 70513
Diffstat (limited to 'llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp')
-rw-r--r--llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp28
1 files changed, 8 insertions, 20 deletions
diff --git a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp
index 9a55a642d84..9d1297b72c4 100644
--- a/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp
+++ b/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp
@@ -1482,27 +1482,15 @@ bool SimpleRegisterCoalescing::JoinCopy(CopyRec &TheCopy, bool &Again) {
}
Limit = allocatableRCRegs_[DstRC].count();
} else if (!SrcIsPhys && !DstIsPhys) {
- unsigned SrcSize = SrcRC->getSize();
- unsigned DstSize = DstRC->getSize();
- if (SrcSize < DstSize)
- // For example X86::MOVSD2PDrr copies from FR64 to VR128.
- NewRC = DstRC;
- else if (DstSize > SrcSize) {
- NewRC = SrcRC;
- std::swap(LargeReg, SmallReg);
- } else {
- unsigned SrcNumRegs = SrcRC->getNumRegs();
- unsigned DstNumRegs = DstRC->getNumRegs();
- if (DstNumRegs < SrcNumRegs)
- // Sub-register class?
- NewRC = DstRC;
- else if (SrcNumRegs < DstNumRegs) {
- NewRC = SrcRC;
- std::swap(LargeReg, SmallReg);
- } else
- // No idea what's the right register class to use.
- return false;
+ NewRC = getCommonSubClass(SrcRC, DstRC);
+ if (!NewRC) {
+ DOUT << "\tDisjoint regclasses: "
+ << SrcRC->getName() << ", "
+ << DstRC->getName() << ".\n";
+ return false; // Not coalescable.
}
+ if (DstRC->getSize() > SrcRC->getSize())
+ std::swap(LargeReg, SmallReg);
}
// If we are joining two virtual registers and the resulting register
OpenPOWER on IntegriCloud