# HG changeset patch # User Josef Eisl # Date 1401889223 -7200 # Node ID 9371b9c246caa0998a1fb05e26246f7590b0ad1a # Parent a07492ccaf525ce6cdd3c1ba128e6d2ba6d87758 LSRA spill optimization: spill at earliest dominator. diff -r a07492ccaf52 -r 9371b9c246ca graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/Interval.java --- 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; } diff -r a07492ccaf52 -r 9371b9c246ca graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java --- 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)); } } }