diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-04 22:53:28 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-04 22:53:28 +0000 |
| commit | e326ed33a8135dca882a76128840a28c38a1e106 (patch) | |
| tree | 0e0c9675e864283bc8d512829ca5585d3ff68741 | |
| parent | e89496fe63c179c189558b1d8e2a7e9a8faee904 (diff) | |
| download | bcm5719-llvm-e326ed33a8135dca882a76128840a28c38a1e106.tar.gz bcm5719-llvm-e326ed33a8135dca882a76128840a28c38a1e106.zip | |
Make sure findRepresentativeClass picks the widest super-register.
We want the representative register class to contain the largest
super-registers available. This makes the function less sensitive to the
register class numbering.
llvm-svn: 156220
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 77aa0073e70..5132f01e866 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -719,18 +719,22 @@ TargetLowering::findRepresentativeClass(EVT VT) const { return std::make_pair(RC, 0); // Compute the set of all super-register classes. - // Include direct sub-classes of RC in case there are no super-registers. BitVector SuperRegRC(TRI->getNumRegClasses()); - for (SuperRegClassIterator RCI(RC, TRI, true); RCI.isValid(); ++RCI) + for (SuperRegClassIterator RCI(RC, TRI); RCI.isValid(); ++RCI) SuperRegRC.setBitsInMask(RCI.getMask()); - // Find the first legal register class in the set. + // Find the first legal register class with the largest spill size. + const TargetRegisterClass *BestRC = RC; for (int i = SuperRegRC.find_first(); i >= 0; i = SuperRegRC.find_next(i)) { const TargetRegisterClass *SuperRC = TRI->getRegClass(i); - if (isLegalRC(SuperRC)) - return std::make_pair(SuperRC, 1); + // We want the largest possible spill size. + if (SuperRC->getSize() <= BestRC->getSize()) + continue; + if (!isLegalRC(SuperRC)) + continue; + BestRC = SuperRC; } - llvm_unreachable("Inconsistent register class tables."); + return std::make_pair(BestRC, 1); } /// computeRegisterProperties - Once all of the register classes are added, |

