# HG changeset patch # User Josef Eisl # Date 1403703059 -7200 # Node ID 69b9980ff5c2e404c7251134c393bdc78179d3f7 # Parent 7a1dee389497371af25801a942a29713ed9cc89c Add ValuePositionProcedure and corresponding forEach methods. diff -r 7a1dee389497 -r 69b9980ff5c2 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 15:11:05 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstruction.java Wed Jun 25 15:30:59 2014 +0200 @@ -32,6 +32,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.debug.*; +import com.oracle.graal.lir.LIRInstructionClass.ValuePosition; import com.oracle.graal.lir.asm.*; /** @@ -42,6 +43,22 @@ public static final Value[] NO_OPERANDS = {}; /** + * Iterator for iterating over a list of {@linkplain ValuePosition value positions}. + */ + public abstract static class ValuePositionProcedure { + + /** + * Iterator method to be overwritten. This version of the iterator does not take additional + * parameters to keep the signature short. + * + * @param instruction The current instruction. + * @param position The position of the value that is iterated. + */ + + public abstract void doValue(LIRInstruction instruction, ValuePosition position); + } + + /** * Iterator for iterating over a list of values. Subclasses must overwrite one of the doValue * methods. Clients of the class must only call the doValue method that takes additional * parameters. diff -r 7a1dee389497 -r 69b9980ff5c2 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 15:11:05 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java Wed Jun 25 15:30:59 2014 +0200 @@ -32,6 +32,7 @@ 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.ValuePositionProcedure; public class LIRInstructionClass extends LIRIntrospection { @@ -416,6 +417,22 @@ return false; } + public final void forEachUse(LIRInstruction obj, ValuePositionProcedure proc) { + forEach(obj, obj, directUseCount, useOffsets, OperandMode.USE, useFlags, proc); + } + + public final void forEachAlive(LIRInstruction obj, ValuePositionProcedure proc) { + forEach(obj, obj, directAliveCount, aliveOffsets, OperandMode.ALIVE, aliveFlags, proc); + } + + public final void forEachTemp(LIRInstruction obj, ValuePositionProcedure proc) { + forEach(obj, obj, directTempCount, tempOffsets, OperandMode.TEMP, tempFlags, proc); + } + + public final void forEachDef(LIRInstruction obj, ValuePositionProcedure proc) { + forEach(obj, obj, directDefCount, defOffsets, OperandMode.DEF, defFlags, proc); + } + public final void forEachUse(LIRInstruction obj, InstructionValueProcedure proc) { forEach(obj, obj, directUseCount, useOffsets, OperandMode.USE, useFlags, proc); } diff -r 7a1dee389497 -r 69b9980ff5c2 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 15:11:05 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java Wed Jun 25 15:30:59 2014 +0200 @@ -35,6 +35,8 @@ 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.ValuePositionProcedure; +import com.oracle.graal.lir.LIRInstructionClass.ValuePosition; abstract class LIRIntrospection extends FieldIntrospection { @@ -146,6 +148,21 @@ } } + protected static void forEach(LIRInstruction inst, Object obj, int directCount, long[] offsets, OperandMode mode, EnumSet[] flags, ValuePositionProcedure proc) { + for (int i = 0; i < offsets.length; i++) { + assert LIRInstruction.ALLOWED_FLAGS.get(mode).containsAll(flags[i]); + + if (i < directCount) { + proc.doValue(inst, new ValuePosition(mode, i, 0)); + } else { + Value[] values = getValueArray(obj, offsets[i]); + for (int j = 0; j < values.length; j++) { + proc.doValue(inst, new ValuePosition(mode, i, j)); + } + } + } + } + protected static Value getValue(Object obj, long offset) { return (Value) unsafe.getObject(obj, offset); }