changeset 16361:faff09aa5999

LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
author Josef Eisl <josef.eisl@jku.at>
date Wed, 04 Jun 2014 19:43:12 +0200
parents ec54fc47ba5d
children b100bd079fff
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java
diffstat 1 files changed, 10 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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);