# HG changeset patch # User Josef Eisl # Date 1407414988 -7200 # Node ID bc1b601dabc91eeb91fb56307dba79a98ec3c5d9 # Parent 6a78b0f8ad74112abbc7cfa6b3ad77a6ff75d445 Create LIRIntrospection.forEachComponent (copy of LIRIntrospection.forEach). diff -r 6a78b0f8ad74 -r bc1b601dabc9 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 Thu Aug 07 15:27:01 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValue.java Thu Aug 07 14:36:28 2014 +0200 @@ -56,8 +56,8 @@ valueClass = CompositeValueClass.get(getClass()); } - public final void forEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueProcedure proc) { - valueClass.forEachComponent(inst, this, mode, proc); + public final CompositeValue forEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueProcedure proc) { + return valueClass.forEachComponent(inst, this, mode, proc); } public final void forEachComponent(LIRInstruction inst, OperandMode mode, ValuePositionProcedure proc, ValuePosition outerPosition) { diff -r 6a78b0f8ad74 -r bc1b601dabc9 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 Thu Aug 07 15:27:01 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java Thu Aug 07 14:36:28 2014 +0200 @@ -141,8 +141,8 @@ return str.toString(); } - public final void forEachComponent(LIRInstruction inst, CompositeValue obj, OperandMode mode, InstructionValueProcedure proc) { - forEach(inst, obj, directComponentCount, componentOffsets, mode, componentFlags, proc); + public final CompositeValue forEachComponent(LIRInstruction inst, CompositeValue obj, OperandMode mode, InstructionValueProcedure proc) { + return forEachComponent(inst, obj, directComponentCount, componentOffsets, mode, componentFlags, proc); } public final void forEachComponent(LIRInstruction inst, CompositeValue obj, OperandMode mode, ValuePositionProcedure proc, ValuePosition outerPosition) { diff -r 6a78b0f8ad74 -r bc1b601dabc9 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 Thu Aug 07 15:27:01 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRInstructionClass.java Thu Aug 07 14:36:28 2014 +0200 @@ -347,19 +347,19 @@ } public final void forEachUse(LIRInstruction obj, InstructionValueProcedure proc) { - forEach(obj, obj, directUseCount, useOffsets, OperandMode.USE, useFlags, proc); + forEach(obj, directUseCount, useOffsets, OperandMode.USE, useFlags, proc); } public final void forEachAlive(LIRInstruction obj, InstructionValueProcedure proc) { - forEach(obj, obj, directAliveCount, aliveOffsets, OperandMode.ALIVE, aliveFlags, proc); + forEach(obj, directAliveCount, aliveOffsets, OperandMode.ALIVE, aliveFlags, proc); } public final void forEachTemp(LIRInstruction obj, InstructionValueProcedure proc) { - forEach(obj, obj, directTempCount, tempOffsets, OperandMode.TEMP, tempFlags, proc); + forEach(obj, directTempCount, tempOffsets, OperandMode.TEMP, tempFlags, proc); } public final void forEachDef(LIRInstruction obj, InstructionValueProcedure proc) { - forEach(obj, obj, directDefCount, defOffsets, OperandMode.DEF, defFlags, proc); + forEach(obj, directDefCount, defOffsets, OperandMode.DEF, defFlags, proc); } public final void forEachState(LIRInstruction obj, InstructionValueProcedure proc) { diff -r 6a78b0f8ad74 -r bc1b601dabc9 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 Thu Aug 07 15:27:01 2014 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java Thu Aug 07 14:36:28 2014 +0200 @@ -120,31 +120,68 @@ } } - protected static void forEach(LIRInstruction inst, Object obj, int directCount, long[] offsets, OperandMode mode, EnumSet[] flags, InstructionValueProcedure proc) { + protected static void forEach(LIRInstruction inst, 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]); + + if (i < directCount) { + Value value = getValue(inst, offsets[i]); + Value newValue; + if (value instanceof CompositeValue) { + CompositeValue composite = (CompositeValue) value; + newValue = composite.forEachComponent(inst, mode, proc); + } else { + newValue = proc.doValue(inst, value, mode, flags[i]); + } + setValue(inst, offsets[i], newValue); + } else { + Value[] values = getValueArray(inst, offsets[i]); + for (int j = 0; j < values.length; j++) { + Value value = values[j]; + Value newValue; + if (value instanceof CompositeValue) { + CompositeValue composite = (CompositeValue) value; + newValue = composite.forEachComponent(inst, mode, proc); + } else { + newValue = proc.doValue(inst, value, mode, flags[i]); + } + values[j] = newValue; + } + } + } + } + + protected static CompositeValue forEachComponent(LIRInstruction inst, CompositeValue 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]); if (i < directCount) { Value value = getValue(obj, offsets[i]); + Value newValue; if (value instanceof CompositeValue) { CompositeValue composite = (CompositeValue) value; - composite.forEachComponent(inst, mode, proc); + newValue = composite.forEachComponent(inst, mode, proc); } else { - setValue(obj, offsets[i], proc.doValue(inst, value, mode, flags[i])); + newValue = proc.doValue(inst, value, mode, flags[i]); } + setValue(obj, offsets[i], newValue); } else { Value[] values = getValueArray(obj, offsets[i]); for (int j = 0; j < values.length; j++) { Value value = values[j]; + Value newValue; if (value instanceof CompositeValue) { CompositeValue composite = (CompositeValue) value; - composite.forEachComponent(inst, mode, proc); + newValue = composite.forEachComponent(inst, mode, proc); } else { - values[j] = proc.doValue(inst, value, mode, flags[i]); + newValue = proc.doValue(inst, value, mode, flags[i]); } + values[j] = newValue; } } } + return obj; } protected static void forEach(LIRInstruction inst, Object obj, int directCount, long[] offsets, OperandMode mode, EnumSet[] flags, ValuePositionProcedure proc,