changeset 22977:913b2001af72

TraceRA: TraceLinearScanAssignLocationsPhase: assign ShadowedRegisterValues to LabelOp.incoming.
author Josef Eisl <josef.eisl@jku.at>
date Wed, 11 Nov 2015 17:09:42 +0100
parents fe8534ad7e6e
children 64eb72b6165d
files graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java
diffstat 1 files changed, 11 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java	Thu Nov 12 13:56:55 2015 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java	Wed Nov 11 17:09:42 2015 +0100
@@ -54,6 +54,7 @@
 import com.oracle.graal.lir.LIRInstruction.OperandMode;
 import com.oracle.graal.lir.StandardOp;
 import com.oracle.graal.lir.StandardOp.BlockEndOp;
+import com.oracle.graal.lir.StandardOp.LabelOp;
 import com.oracle.graal.lir.StandardOp.MoveOp;
 import com.oracle.graal.lir.StandardOp.ValueMoveOp;
 import com.oracle.graal.lir.Variable;
@@ -70,16 +71,14 @@
     @Override
     protected <B extends AbstractBlockBase<B>> void run(TargetDescription target, LIRGenerationResult lirGenRes, List<B> codeEmittingOrder, List<B> linearScanOrder, MoveFactory spillMoveFactory,
                     RegisterAllocationConfig registerAllocationConfig, TraceBuilderResult<?> traceBuilderResult, TraceLinearScan allocator) {
-        new Assigner(allocator, traceBuilderResult).assignLocations();
+        new Assigner(allocator).assignLocations();
     }
 
     private static final class Assigner {
         private final TraceLinearScan allocator;
-        private final TraceBuilderResult<?> traceBuilderResult;
 
-        private Assigner(TraceLinearScan allocator, TraceBuilderResult<?> traceBuilderResult) {
+        private Assigner(TraceLinearScan allocator) {
             this.allocator = allocator;
-            this.traceBuilderResult = traceBuilderResult;
         }
 
         /**
@@ -206,8 +205,12 @@
          */
         private boolean assignLocations(LIRInstruction op) {
             assert op != null;
-            if (TraceRAshareSpillInformation.getValue() && isBlockEndWithEdgeToUnallocatedTrace(op)) {
-                ((BlockEndOp) op).forEachOutgoingValue(colorOutgoingValues);
+            if (TraceRAshareSpillInformation.getValue()) {
+                if (op instanceof BlockEndOp) {
+                    ((BlockEndOp) op).forEachOutgoingValue(colorOutgoingIncomingValues);
+                } else if (op instanceof LabelOp) {
+                    ((LabelOp) op).forEachIncomingValue(colorOutgoingIncomingValues);
+                }
             }
 
             InstructionValueProcedure assignProc = (inst, operand, mode, flags) -> isVariable(operand) ? colorLirOperand(inst, (Variable) operand, mode) : operand;
@@ -253,10 +256,10 @@
             }
         }
 
-        private InstructionValueProcedure colorOutgoingValues = new InstructionValueProcedure() {
+        private InstructionValueProcedure colorOutgoingIncomingValues = new InstructionValueProcedure() {
 
             public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet<OperandFlag> flags) {
-                if (isRegister(value) || isVariable(value)) {
+                if (isVariable(value)) {
                     TraceInterval interval = allocator.intervalFor(value);
                     assert interval != null : "interval must exist";
                     interval = allocator.splitChildAtOpId(interval, instruction.id(), mode);
@@ -268,22 +271,6 @@
                 return value;
             }
         };
-
-        private boolean isBlockEndWithEdgeToUnallocatedTrace(LIRInstruction op) {
-            if (!(op instanceof BlockEndOp)) {
-                return false;
-            }
-            AbstractBlockBase<?> block = allocator.blockForId(op.id());
-            int currentTrace = traceBuilderResult.getTraceForBlock(block);
-
-            for (AbstractBlockBase<?> succ : block.getSuccessors()) {
-                if (currentTrace < traceBuilderResult.getTraceForBlock(succ)) {
-                    // succ is not yet allocated
-                    return true;
-                }
-            }
-            return false;
-        }
     }
 
 }