# HG changeset patch # User Lukas Stadler # Date 1359998296 -3600 # Node ID 96a596d751ab7d8f5b4eae93716bfd1f7d2913ad # Parent a87bebe5e650856b72707eb625ffeb770c0a3373 remove successorProbabilities from SwitchNode diff -r a87bebe5e650 -r 96a596d751ab graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Feb 04 15:33:43 2013 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Feb 04 18:18:16 2013 +0100 @@ -1143,6 +1143,19 @@ return true; } + /** + * Helper function that sums up the probabilities of all keys that lead to a specific successor. + * + * @return an array of size successorCount with the accumulated probability for each successor. + */ + private static double[] successorProbabilites(int successorCount, int[] keySuccessors, double[] keyProbabilities) { + double[] probability = new double[successorCount]; + for (int i = 0; i < keySuccessors.length; i++) { + probability[keySuccessors[i]] += keyProbabilities[i]; + } + return probability; + } + private void genSwitch(BytecodeSwitch bs) { int bci = bci(); ValueNode value = frameState.ipop(); @@ -1185,7 +1198,7 @@ } } - double[] successorProbabilities = IntegerSwitchNode.successorProbabilites(actualSuccessors.size(), keySuccessors, keyProbabilities); + double[] successorProbabilities = successorProbabilites(actualSuccessors.size(), keySuccessors, keyProbabilities); IntegerSwitchNode switchNode = currentGraph.add(new IntegerSwitchNode(value, actualSuccessors.size(), keys, keyProbabilities, keySuccessors)); for (int i = 0; i < actualSuccessors.size(); i++) { switchNode.setBlockSuccessor(i, createBlockTarget(successorProbabilities[i], actualSuccessors.get(i), frameState)); diff -r a87bebe5e650 -r 96a596d751ab graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java Mon Feb 04 15:33:43 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java Mon Feb 04 18:18:16 2013 +0100 @@ -49,7 +49,7 @@ * @param keySuccessors the successor index for each key */ public IntegerSwitchNode(ValueNode value, BeginNode[] successors, int[] keys, double[] keyProbabilities, int[] keySuccessors) { - super(value, successors, successorProbabilites(successors.length, keySuccessors, keyProbabilities), keySuccessors, keyProbabilities); + super(value, successors, keySuccessors, keyProbabilities); assert keySuccessors.length == keys.length + 1; assert keySuccessors.length == keyProbabilities.length; this.keys = keys; diff -r a87bebe5e650 -r 96a596d751ab graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java Mon Feb 04 15:33:43 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java Mon Feb 04 18:18:16 2013 +0100 @@ -35,7 +35,6 @@ public abstract class SwitchNode extends ControlSplitNode { @Successor protected final NodeSuccessorList successors; - protected double[] successorProbabilities; @Input private ValueNode value; private double[] keyProbabilities; private int[] keySuccessors; @@ -46,9 +45,8 @@ * @param value the instruction that provides the value to be switched over * @param successors the list of successors of this switch */ - public SwitchNode(ValueNode value, BeginNode[] successors, double[] successorProbabilities, int[] keySuccessors, double[] keyProbabilities) { + public SwitchNode(ValueNode value, BeginNode[] successors, int[] keySuccessors, double[] keyProbabilities) { super(StampFactory.forVoid()); - this.successorProbabilities = successorProbabilities; assert keySuccessors.length == keyProbabilities.length; this.successors = new NodeSuccessorList<>(this, successors); this.value = value; @@ -59,9 +57,9 @@ @Override public double probability(BeginNode successor) { double sum = 0; - for (int i = 0; i < successors.size(); i++) { - if (successors.get(i) == successor) { - sum += successorProbabilities[i]; + for (int i = 0; i < keySuccessors.length; i++) { + if (successors.get(keySuccessors[i]) == successor) { + sum += keyProbabilities[i]; } } return sum; @@ -133,23 +131,9 @@ return defaultSuccessorIndex() == -1 ? null : successors.get(defaultSuccessorIndex()); } - /** - * Helper function that sums up the probabilities of all keys that lead to a specific successor. - * - * @return an array of size successorCount with the accumulated probability for each successor. - */ - public static double[] successorProbabilites(int successorCount, int[] keySuccessors, double[] keyProbabilities) { - double[] probability = new double[successorCount]; - for (int i = 0; i < keySuccessors.length; i++) { - probability[keySuccessors[i]] += keyProbabilities[i]; - } - return probability; - } - @Override public SwitchNode clone(Graph into) { SwitchNode newSwitch = (SwitchNode) super.clone(into); - newSwitch.successorProbabilities = Arrays.copyOf(successorProbabilities, successorProbabilities.length); newSwitch.keyProbabilities = Arrays.copyOf(keyProbabilities, keyProbabilities.length); newSwitch.keySuccessors = Arrays.copyOf(keySuccessors, keySuccessors.length); return newSwitch; diff -r a87bebe5e650 -r 96a596d751ab graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java Mon Feb 04 15:33:43 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java Mon Feb 04 18:18:16 2013 +0100 @@ -44,14 +44,14 @@ * Constructs a type switch instruction. The keyProbabilities array contain key.length + 1 * entries. The last entry in every array describes the default case. * - * @param value the instruction producing the value being switched on + * @param value the instruction producing the value being switched on, the object hub * @param successors the list of successors * @param keys the list of types * @param keyProbabilities the probabilities of the keys * @param keySuccessors the successor index for each key */ - public TypeSwitchNode(ValueNode value, BeginNode[] successors, double[] successorProbabilities, ResolvedJavaType[] keys, double[] keyProbabilities, int[] keySuccessors) { - super(value, successors, successorProbabilities, keySuccessors, keyProbabilities); + public TypeSwitchNode(ValueNode value, BeginNode[] successors, ResolvedJavaType[] keys, double[] keyProbabilities, int[] keySuccessors) { + super(value, successors, keySuccessors, keyProbabilities); assert successors.length <= keys.length + 1; assert keySuccessors.length == keyProbabilities.length; this.keys = keys; @@ -63,8 +63,12 @@ } @Override - public Constant keyAt(int i) { - return keys[i].getEncoding(Representation.ObjectHub); + public Constant keyAt(int index) { + return keys[index].getEncoding(Representation.ObjectHub); + } + + public ResolvedJavaType typeAt(int index) { + return keys[index]; } @Override @@ -134,8 +138,6 @@ } } - double[] newSuccessorProbabilities = successorProbabilites(newSuccessors.size(), newKeySuccessors, newKeyProbabilities); - for (int i = 0; i < blockSuccessorCount(); i++) { BeginNode successor = blockSuccessor(i); if (!newSuccessors.contains(successor)) { @@ -145,7 +147,7 @@ } BeginNode[] successorsArray = newSuccessors.toArray(new BeginNode[newSuccessors.size()]); - TypeSwitchNode newSwitch = graph().add(new TypeSwitchNode(value(), successorsArray, newSuccessorProbabilities, newKeys, newKeyProbabilities, newKeySuccessors)); + TypeSwitchNode newSwitch = graph().add(new TypeSwitchNode(value(), successorsArray, newKeys, newKeyProbabilities, newKeySuccessors)); ((FixedWithNextNode) predecessor()).setNext(newSwitch); GraphUtil.killWithUnusedFloatingInputs(this); } diff -r a87bebe5e650 -r 96a596d751ab graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Mon Feb 04 15:33:43 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Mon Feb 04 18:18:16 2013 +0100 @@ -580,8 +580,7 @@ keyProbabilities[keyProbabilities.length - 1] = notRecordedTypeProbability; keySuccessors[keySuccessors.length - 1] = successors.length - 1; - double[] successorProbabilities = SwitchNode.successorProbabilites(successors.length, keySuccessors, keyProbabilities); - TypeSwitchNode typeSwitch = graph.add(new TypeSwitchNode(hub, successors, successorProbabilities, keys, keyProbabilities, keySuccessors)); + TypeSwitchNode typeSwitch = graph.add(new TypeSwitchNode(hub, successors, keys, keyProbabilities, keySuccessors)); return typeSwitch; }