# HG changeset patch # User Josef Eisl # Date 1401903792 -7200 # Node ID faff09aa599927d8bba45f7c4851c81e6d60f24c # Parent ec54fc47ba5dcbed8b977f9e036ca57834ecf12f LSRA spill optimization: only use predecessor block if it has lower probability than the definition. diff -r ec54fc47ba5d -r faff09aa5999 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 16:54:56 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Wed Jun 04 19:43:12 2014 +0200 @@ -1883,6 +1883,7 @@ } private DebugMetric betterSpillPos = Debug.metric("BetterSpillPosition"); + private DebugMetric betterSpillPosWithLowerProbability = Debug.metric("BetterSpillPositionWithLowerProbability"); private void findSpillPosition() { for (Interval interval : intervals) { @@ -1916,7 +1917,15 @@ assert dominates(defBlock, spillBlock); betterSpillPos.increment(); Debug.log("Better spill position found (Block %s)", spillBlock); - interval.setSpillDefinitionPos(getFirstLirInstructionId(spillBlock)); + + if (defBlock.probability() <= spillBlock.probability()) { + // better spill block has the same probability -> do nothing + assert defBlock.probability() == spillBlock.probability(); + interval.setSpillState(SpillState.StoreAtDefinition); + } else { + betterSpillPosWithLowerProbability.increment(); + interval.setSpillDefinitionPos(getFirstLirInstructionId(spillBlock)); + } } else { // definition is the best choice interval.setSpillState(SpillState.StoreAtDefinition);