summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-07-28 20:48:23 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-07-28 20:48:23 +0000
commitcad845f4c0d63e21392191cbef32c9a860e86481 (patch)
treee26a0d8a4f876ded106b7fcca9b44402a0f5f4b4
parent7b563cde19e61064a0544f4007c58f0e28b8ea05 (diff)
downloadbcm5719-llvm-cad845f4c0d63e21392191cbef32c9a860e86481.tar.gz
bcm5719-llvm-cad845f4c0d63e21392191cbef32c9a860e86481.zip
Reverse order of RS_Split live ranges under -compact-regions.
There are two conflicting strategies in play: - Under high register pressure, we want to assign large live ranges first. Smaller live ranges are easier to place afterwards. - Live range splitting is guided by interference, so splitting should be deferred until interference is as realistic as possible. With the recent changes to the live range stages, and with compact regions enabled, it is less traumatic to split a live range too early. If some of the split products were too big, they can often be split again. By reversing the RS_Split order, we get this queue order: 1. Normal live ranges, large to small. 2. RS_Split live ranges, large to small. The large-to-small order improves RAGreedy's puzzle solving skills under high register pressure. It may cause a bit more iterated splitting, but we handle that better now. With this change, -compact-regions is mostly an improvement on SPEC. llvm-svn: 136388
-rw-r--r--llvm/lib/CodeGen/RegAllocGreedy.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp
index 1f0c241dd20..239c8e43595 100644
--- a/llvm/lib/CodeGen/RegAllocGreedy.cpp
+++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp
@@ -398,12 +398,15 @@ void RAGreedy::enqueue(LiveInterval *LI) {
if (ExtraRegInfo[Reg].Stage == RS_New)
ExtraRegInfo[Reg].Stage = RS_Assign;
- if (ExtraRegInfo[Reg].Stage == RS_Split)
+ if (ExtraRegInfo[Reg].Stage == RS_Split) {
// Unsplit ranges that couldn't be allocated immediately are deferred until
// everything else has been allocated. Long ranges are allocated last so
// they are split against realistic interference.
- Prio = (1u << 31) - Size;
- else {
+ if (CompactRegions)
+ Prio = Size;
+ else
+ Prio = (1u << 31) - Size;
+ } else {
// Everything else is allocated in long->short order. Long ranges that don't
// fit should be spilled ASAP so they don't create interference.
Prio = (1u << 31) + Size;
OpenPOWER on IntegriCloud