changeset 22833:054a187fc2cb

TraceRA: TraceLinearScanWalker: do not create empty intervals.
author Josef Eisl <josef.eisl@jku.at>
date Thu, 08 Oct 2015 15:51:54 +0200
parents 44ebaa4e1ac1
children 7129686d9f18
files graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanWalker.java
diffstat 1 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanWalker.java	Thu Oct 08 15:28:33 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanWalker.java	Thu Oct 08 15:51:54 2015 +0200
@@ -396,7 +396,8 @@
             // must calculate this before the actual split is performed and before split position is
             // moved to odd opId
             final int optimalSplitPosFinal;
-            if (allocator.isBlockBegin(optimalSplitPos)) {
+            boolean blockBegin = allocator.isBlockBegin(optimalSplitPos);
+            if (blockBegin) {
                 assert (optimalSplitPos & 1) == 0 : "Block begins must be even: " + optimalSplitPos;
                 // move position after the label (odd optId)
                 optimalSplitPosFinal = optimalSplitPos + 1;
@@ -405,7 +406,8 @@
                 optimalSplitPosFinal = (optimalSplitPos - 1) | 1;
             }
 
-            assert minSplitPos <= optimalSplitPosFinal && optimalSplitPosFinal <= maxSplitPos : "out of range";
+            // TODO( je) better define what min split pos max split pos mean.
+            assert minSplitPos <= optimalSplitPosFinal && optimalSplitPosFinal <= maxSplitPos || minSplitPos == maxSplitPos && optimalSplitPosFinal == minSplitPos - 1 : "out of range";
             assert optimalSplitPosFinal <= interval.to() : "cannot split after end of interval";
             assert optimalSplitPosFinal > interval.from() : "cannot split at start of interval";
 
@@ -421,6 +423,15 @@
             // "split pos must be even on block boundary";
             assert (optimalSplitPosFinal & 1) == 1 : "split pos must be odd";
 
+            // TODO (je) duplicate code. try to fold
+            if (optimalSplitPosFinal == interval.to() && interval.nextUsage(RegisterPriority.MustHaveRegister, minSplitPos) == Integer.MAX_VALUE) {
+                // the split position would be just before the end of the interval
+                // . no split at all necessary
+                if (Debug.isLogEnabled()) {
+                    Debug.log("no split necessary because optimal split position is at end of interval");
+                }
+                return;
+            }
             TraceInterval splitPart = interval.split(optimalSplitPosFinal, allocator);
 
             boolean moveNecessary = true;