Mercurial > hg > graal-compiler
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)); } } }