changeset 16358:9371b9c246ca

LSRA spill optimization: spill at earliest dominator.
author Josef Eisl <josef.eisl@jku.at>
date Wed, 04 Jun 2014 15:40:23 +0200
parents a07492ccaf52
children f686fae77383
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/Interval.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java
diffstat 2 files changed, 17 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/Interval.java	Wed Jun 04 14:53:12 2014 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/Interval.java	Wed Jun 04 15:40:23 2014 +0200
@@ -309,6 +309,11 @@
         OneSpillStore,
 
         /**
+         * The interval is spilled multiple times.
+         */
+        MultipleSpills,
+
+        /**
          * The interval should be stored immediately after its definition to prevent multiple
          * redundant stores.
          */
@@ -649,7 +654,7 @@
     }
 
     void setSpillDefinitionPos(int pos) {
-        assert spillDefinitionPos() == -1 : "cannot set the position twice";
+        assert spillState() == SpillState.MultipleSpills || spillDefinitionPos() == -1 : "cannot set the position twice";
         splitParent().spillDefinitionPos = pos;
     }
 
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java	Wed Jun 04 14:53:12 2014 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java	Wed Jun 04 15:40:23 2014 +0200
@@ -454,12 +454,12 @@
             }
 
             case OneSpillStore: {
-                // the interval is spilled more then once, so it is better to store it to
-                // memory at the definition
-                interval.setSpillState(SpillState.StoreAtDefinition);
+                // the interval is spilled more then once
+                interval.setSpillState(SpillState.MultipleSpills);
                 break;
             }
 
+            case MultipleSpills:
             case StoreAtDefinition:
             case StartInMemory:
             case NoOptimization:
@@ -1887,7 +1887,7 @@
 
     private void findSpillPosition() {
         for (Interval interval : intervals) {
-            if (interval != null && interval.isSplitParent() && interval.spillState() == SpillState.StoreAtDefinition) {
+            if (interval != null && interval.isSplitParent() && interval.spillState() == SpillState.MultipleSpills) {
                 AbstractBlock<?> defBlock = blockForId(interval.spillDefinitionPos());
                 AbstractBlock<?> spillBlock = null;
                 try (Indent indent = Debug.logAndIndent("interval %s (%s)", interval, defBlock)) {
@@ -1904,12 +1904,14 @@
                             }
                         }
                     }
-                    assert spillBlock != null;
-                    assert dominates(defBlock, spillBlock);
-                    if (!defBlock.equals(spillBlock)) {
+                    if (spillBlock == null || defBlock.equals(spillBlock)) {
+                        // no spill interval
+                        interval.setSpillState(SpillState.StoreAtDefinition);
+                    } else {
+                        assert dominates(defBlock, spillBlock);
                         betterSpillPos.increment();
-                        int pos = getFirstLirInstructionId(spillBlock);
-                        Debug.log("Better spill position found (Block %s, %d)", spillBlock, pos);
+                        Debug.log("Better spill position found (Block %s)", spillBlock);
+                        interval.setSpillDefinitionPos(getFirstLirInstructionId(spillBlock));
                     }
                 }
             }