# HG changeset patch # User Josef Eisl # Date 1403694692 -7200 # Node ID dcaf26339f7c45c725cb9e2e3c8ef12f687ed432 # Parent de90d96f562c6d1b65ce7f3caa19c1c92e88ac06 Make ValueProcedure a subclass of InstructionValueProcedure and remove redundancies. diff -r de90d96f562c -r dcaf26339f7c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotLIRFrameState.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotLIRFrameState.java Wed Jun 25 11:25:54 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotLIRFrameState.java Wed Jun 25 13:11:32 2014 +0200 @@ -28,7 +28,6 @@ import com.oracle.graal.lir.*; import com.oracle.graal.lir.LIRInstruction.InstructionValueProcedure; import com.oracle.graal.lir.LIRInstruction.OperandMode; -import com.oracle.graal.lir.LIRInstruction.ValueProcedure; /** * Extends {@link LIRFrameState} to handle {@link HotSpotMonitorValue}s correctly. @@ -40,19 +39,6 @@ } @Override - protected Value processValue(ValueProcedure proc, Value value) { - if (value instanceof HotSpotMonitorValue) { - HotSpotMonitorValue monitor = (HotSpotMonitorValue) value; - if (processed(monitor.getOwner())) { - monitor.setOwner(proc.doValue(monitor.getOwner(), OperandMode.ALIVE, STATE_FLAGS)); - } - return value; - } else { - return super.processValue(proc, value); - } - } - - @Override protected Value processValue(LIRInstruction inst, InstructionValueProcedure proc, Value value) { if (value instanceof HotSpotMonitorValue) { HotSpotMonitorValue monitor = (HotSpotMonitorValue) value; diff -r de90d96f562c -r dcaf26339f7c graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValue.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValue.java Wed Jun 25 11:25:54 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValue.java Wed Jun 25 13:11:32 2014 +0200 @@ -29,7 +29,6 @@ import com.oracle.graal.lir.LIRInstruction.InstructionValueProcedure; import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; -import com.oracle.graal.lir.LIRInstruction.ValueProcedure; /** * Base class to represent values that need to be stored in more than one register. @@ -55,10 +54,6 @@ valueClass = CompositeValueClass.get(getClass()); } - public final void forEachComponent(OperandMode mode, ValueProcedure proc) { - valueClass.forEachComponent(this, mode, proc); - } - public final void forEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueProcedure proc) { valueClass.forEachComponent(inst, this, mode, proc); } diff -r de90d96f562c -r dcaf26339f7c graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java Wed Jun 25 11:25:54 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java Wed Jun 25 13:11:32 2014 +0200 @@ -30,7 +30,6 @@ import com.oracle.graal.lir.LIRInstruction.InstructionValueProcedure; import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; -import com.oracle.graal.lir.LIRInstruction.ValueProcedure; /** * Lazily associated metadata for every {@link CompositeValue} type. The metadata includes: @@ -140,10 +139,6 @@ return str.toString(); } - public final void forEachComponent(CompositeValue obj, OperandMode mode, ValueProcedure proc) { - forEach(obj, directComponentCount, componentOffsets, mode, componentFlags, proc); - } - public final void forEachComponent(LIRInstruction inst, CompositeValue obj, OperandMode mode, InstructionValueProcedure proc) { forEach(inst, obj, directComponentCount, componentOffsets, mode, componentFlags, proc); } diff -r de90d96f562c -r dcaf26339f7c graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRFrameState.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRFrameState.java Wed Jun 25 11:25:54 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRFrameState.java Wed Jun 25 13:11:32 2014 +0200 @@ -31,7 +31,6 @@ import com.oracle.graal.lir.LIRInstruction.InstructionValueProcedure; import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; -import com.oracle.graal.lir.LIRInstruction.ValueProcedure; /** * This class represents garbage collection and deoptimization information attached to a LIR @@ -60,22 +59,6 @@ } /** - * Iterates the frame state and calls the {@link ValueProcedure} for every variable. - * - * @param proc The procedure called for variables. - */ - public void forEachState(ValueProcedure proc) { - for (BytecodeFrame cur = topFrame; cur != null; cur = cur.caller()) { - processValues(cur.values, proc); - } - if (virtualObjects != null) { - for (VirtualObject obj : virtualObjects) { - processValues(obj.getValues(), proc); - } - } - } - - /** * Iterates the frame state and calls the {@link InstructionValueProcedure} for every variable. * * @param proc The procedure called for variables. @@ -97,20 +80,6 @@ */ protected static final EnumSet STATE_FLAGS = EnumSet.of(OperandFlag.REG, OperandFlag.STACK); - protected void processValues(Value[] values, ValueProcedure proc) { - for (int i = 0; i < values.length; i++) { - Value value = values[i]; - values[i] = processValue(proc, value); - } - } - - protected Value processValue(ValueProcedure proc, Value value) { - if (processed(value)) { - return proc.doValue(value, OperandMode.ALIVE, STATE_FLAGS); - } - return value; - } - protected void processValues(LIRInstruction inst, Value[] values, InstructionValueProcedure proc) { for (int i = 0; i < values.length; i++) { Value value = values[i]; diff -r de90d96f562c -r dcaf26339f7c graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstruction.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstruction.java Wed Jun 25 11:25:54 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstruction.java Wed Jun 25 13:11:32 2014 +0200 @@ -46,36 +46,6 @@ * methods. Clients of the class must only call the doValue method that takes additional * parameters. */ - public abstract static class ValueProcedure { - - /** - * Iterator method to be overwritten. This version of the iterator does not take additional - * parameters to keep the signature short. - * - * @param value The value that is iterated. - * @return The new value to replace the value that was passed in. - */ - protected Value doValue(Value value) { - throw GraalInternalError.shouldNotReachHere("One of the doValue() methods must be overwritten"); - } - - /** - * Iterator method to be overwritten. This version of the iterator gets additional - * parameters about the processed value. - * - * @param value The value that is iterated. - * @param mode The operand mode for the value. - * @param flags A set of flags for the value. - * @return The new value to replace the value that was passed in. - */ - public Value doValue(Value value, OperandMode mode, EnumSet flags) { - return doValue(value); - } - } - - /** - * Similar to {@link ValueProcedure} but with an {@link LIRInstruction} parameter. - */ public abstract static class InstructionValueProcedure { /** @@ -105,6 +75,46 @@ } } + /** + * Similar to {@link InstructionValueProcedure} but without an {@link LIRInstruction} parameter. + */ + public abstract static class ValueProcedure extends InstructionValueProcedure { + + /** + * Iterator method to be overwritten. This version of the iterator does not take additional + * parameters to keep the signature short. + * + * @param value The value that is iterated. + * @return The new value to replace the value that was passed in. + */ + protected Value doValue(Value value) { + throw GraalInternalError.shouldNotReachHere("One of the doValue() methods must be overwritten"); + } + + /** + * Iterator method to be overwritten. This version of the iterator gets additional + * parameters about the processed value. + * + * @param value The value that is iterated. + * @param mode The operand mode for the value. + * @param flags A set of flags for the value. + * @return The new value to replace the value that was passed in. + */ + protected Value doValue(Value value, OperandMode mode, EnumSet flags) { + return doValue(value); + } + + @Override + final protected Value doValue(LIRInstruction instruction, Value value) { + throw GraalInternalError.shouldNotReachHere("This doValue() methods should never be called"); + } + + @Override + final public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet flags) { + return doValue(value, mode, flags); + } + } + public abstract static class StateProcedure { protected abstract void doState(LIRFrameState state); @@ -287,26 +297,6 @@ return false; } - public final void forEachInput(ValueProcedure proc) { - instructionClass.forEachUse(this, proc); - } - - public final void forEachAlive(ValueProcedure proc) { - instructionClass.forEachAlive(this, proc); - } - - public final void forEachTemp(ValueProcedure proc) { - instructionClass.forEachTemp(this, proc); - } - - public final void forEachOutput(ValueProcedure proc) { - instructionClass.forEachDef(this, proc); - } - - public final void forEachState(ValueProcedure proc) { - instructionClass.forEachState(this, proc); - } - public final void forEachInput(InstructionValueProcedure proc) { instructionClass.forEachUse(this, proc); } @@ -346,7 +336,7 @@ * clients can stop the iteration once a suitable hint has been found. * @return The non-null value returned by the procedure, or null. */ - public Value forEachRegisterHint(Value value, OperandMode mode, ValueProcedure proc) { + public Value forEachRegisterHint(Value value, OperandMode mode, InstructionValueProcedure proc) { return instructionClass.forEachRegisterHint(this, mode, proc); } diff -r de90d96f562c -r dcaf26339f7c graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java Wed Jun 25 11:25:54 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java Wed Jun 25 13:11:32 2014 +0200 @@ -32,7 +32,6 @@ import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; import com.oracle.graal.lir.LIRInstruction.StateProcedure; -import com.oracle.graal.lir.LIRInstruction.ValueProcedure; public class LIRInstructionClass extends LIRIntrospection { @@ -263,22 +262,6 @@ return false; } - public final void forEachUse(LIRInstruction obj, ValueProcedure proc) { - forEach(obj, directUseCount, useOffsets, OperandMode.USE, useFlags, proc); - } - - public final void forEachAlive(LIRInstruction obj, ValueProcedure proc) { - forEach(obj, directAliveCount, aliveOffsets, OperandMode.ALIVE, aliveFlags, proc); - } - - public final void forEachTemp(LIRInstruction obj, ValueProcedure proc) { - forEach(obj, directTempCount, tempOffsets, OperandMode.TEMP, tempFlags, proc); - } - - public final void forEachDef(LIRInstruction obj, ValueProcedure proc) { - forEach(obj, directDefCount, defOffsets, OperandMode.DEF, defFlags, proc); - } - public final void forEachUse(LIRInstruction obj, InstructionValueProcedure proc) { forEach(obj, obj, directUseCount, useOffsets, OperandMode.USE, useFlags, proc); } @@ -295,15 +278,6 @@ forEach(obj, obj, directDefCount, defOffsets, OperandMode.DEF, defFlags, proc); } - public final void forEachState(LIRInstruction obj, ValueProcedure proc) { - for (int i = 0; i < stateOffsets.length; i++) { - LIRFrameState state = getState(obj, stateOffsets[i]); - if (state != null) { - state.forEachState(proc); - } - } - } - public final void forEachState(LIRInstruction obj, InstructionValueProcedure proc) { for (int i = 0; i < stateOffsets.length; i++) { LIRFrameState state = getState(obj, stateOffsets[i]); @@ -322,7 +296,7 @@ } } - public final Value forEachRegisterHint(LIRInstruction obj, OperandMode mode, ValueProcedure proc) { + public final Value forEachRegisterHint(LIRInstruction obj, OperandMode mode, InstructionValueProcedure proc) { int hintDirectCount = 0; long[] hintOffsets = null; if (mode == OperandMode.USE) { @@ -338,7 +312,7 @@ for (int i = 0; i < hintOffsets.length; i++) { if (i < hintDirectCount) { Value hintValue = getValue(obj, hintOffsets[i]); - Value result = proc.doValue(hintValue, null, null); + Value result = proc.doValue(obj, hintValue, null, null); if (result != null) { return result; } @@ -346,7 +320,7 @@ Value[] hintValues = getValueArray(obj, hintOffsets[i]); for (int j = 0; j < hintValues.length; j++) { Value hintValue = hintValues[j]; - Value result = proc.doValue(hintValue, null, null); + Value result = proc.doValue(obj, hintValue, null, null); if (result != null) { return result; } diff -r de90d96f562c -r dcaf26339f7c graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java Wed Jun 25 11:25:54 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java Wed Jun 25 13:11:32 2014 +0200 @@ -35,7 +35,6 @@ import com.oracle.graal.lir.LIRInstruction.InstructionValueProcedure; import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; -import com.oracle.graal.lir.LIRInstruction.ValueProcedure; abstract class LIRIntrospection extends FieldIntrospection { @@ -120,33 +119,6 @@ } } - protected static void forEach(Object obj, int directCount, long[] offsets, OperandMode mode, EnumSet[] flags, ValueProcedure proc) { - for (int i = 0; i < offsets.length; i++) { - assert LIRInstruction.ALLOWED_FLAGS.get(mode).containsAll(flags[i]); - - if (i < directCount) { - Value value = getValue(obj, offsets[i]); - if (value instanceof CompositeValue) { - CompositeValue composite = (CompositeValue) value; - composite.forEachComponent(mode, proc); - } else { - setValue(obj, offsets[i], proc.doValue(value, mode, flags[i])); - } - } else { - Value[] values = getValueArray(obj, offsets[i]); - for (int j = 0; j < values.length; j++) { - Value value = values[j]; - if (value instanceof CompositeValue) { - CompositeValue composite = (CompositeValue) value; - composite.forEachComponent(mode, proc); - } else { - values[j] = proc.doValue(value, mode, flags[i]); - } - } - } - } - } - protected static void forEach(LIRInstruction inst, Object obj, int directCount, long[] offsets, OperandMode mode, EnumSet[] flags, InstructionValueProcedure proc) { for (int i = 0; i < offsets.length; i++) { assert LIRInstruction.ALLOWED_FLAGS.get(mode).containsAll(flags[i]);