# HG changeset patch # User Roland Schatz # Date 1391782859 -3600 # Node ID 8f3cd93813f10d011eea32c72ba22961d4dedc6a # Parent 6fc05ad864905399254c4765c14b1eb6b4535b20 Use branch probability for emitting conditional jump. diff -r 6fc05ad86490 -r 8f3cd93813f1 graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Fri Feb 07 15:03:21 2014 +0100 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Fri Feb 07 15:20:59 2014 +0100 @@ -229,18 +229,18 @@ } @Override - public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueLabel, LabelRef falseLabel) { + public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueLabel, LabelRef falseLabel, double trueLabelProbability) { boolean mirrored = emitCompare(left, right); Condition finalCondition = mirrored ? cond.mirror() : cond; switch (left.getKind().getStackKind()) { case Int: case Long: case Object: - append(new BranchOp(finalCondition, trueLabel, falseLabel)); + append(new BranchOp(finalCondition, trueLabel, falseLabel, trueLabelProbability)); break; case Float: case Double: - append(new FloatBranchOp(finalCondition, unorderedIsTrue, trueLabel, falseLabel)); + append(new FloatBranchOp(finalCondition, unorderedIsTrue, trueLabel, falseLabel, trueLabelProbability)); break; default: throw GraalInternalError.shouldNotReachHere("" + left.getKind()); @@ -255,14 +255,14 @@ } @Override - public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow) { - append(new BranchOp(ConditionFlag.Overflow, overflow, noOverflow)); + public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability) { + append(new BranchOp(ConditionFlag.Overflow, overflow, noOverflow, overflowProbability)); } @Override - public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination) { + public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { emitIntegerTest(left, right); - append(new BranchOp(Condition.EQ, trueDestination, falseDestination)); + append(new BranchOp(Condition.EQ, trueDestination, falseDestination, trueDestinationProbability)); } @Override diff -r 6fc05ad86490 -r 8f3cd93813f1 graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java --- a/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Fri Feb 07 15:03:21 2014 +0100 +++ b/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Fri Feb 07 15:20:59 2014 +0100 @@ -189,7 +189,7 @@ } @Override - public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination) { + public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { // We don't have to worry about mirroring the condition on HSAIL. Condition finalCondition = cond; Variable result = newVariable(left.getKind()); @@ -210,12 +210,12 @@ } @Override - public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow) { + public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability) { throw GraalInternalError.unimplemented(); } @Override - public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination) { + public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { throw GraalInternalError.unimplemented(); } diff -r 6fc05ad86490 -r 8f3cd93813f1 graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Fri Feb 07 15:03:21 2014 +0100 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Fri Feb 07 15:20:59 2014 +0100 @@ -299,7 +299,7 @@ } @Override - public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination) { + public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { switch (left.getKind().getStackKind()) { case Int: append(new CompareOp(ICMP, cond, left, right, nextPredRegNum)); @@ -327,12 +327,12 @@ } @Override - public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow) { + public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability) { throw GraalInternalError.unimplemented("PTXLIRGenerator.emitOverflowCheckBranch()"); } @Override - public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination) { + public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { // / emitIntegerTest(left, right); // append(new BranchOp(negated ? Condition.NE : Condition.EQ, label)); throw GraalInternalError.unimplemented("emitIntegerTestBranch()"); diff -r 6fc05ad86490 -r 8f3cd93813f1 graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Fri Feb 07 15:03:21 2014 +0100 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Fri Feb 07 15:20:59 2014 +0100 @@ -230,7 +230,7 @@ } @Override - public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination) { + public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { boolean mirrored = emitCompare(left, right); Condition finalCondition = mirrored ? cond.mirror() : cond; Kind kind = left.getKind().getStackKind(); @@ -254,13 +254,13 @@ } @Override - public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow) { + public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability) { // append(new BranchOp(negated ? ConditionFlag.NoOverflow : ConditionFlag.Overflow, label)); throw GraalInternalError.unimplemented(); } @Override - public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination) { + public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { emitIntegerTest(left, right); append(new BranchOp(Condition.EQ, trueDestination, falseDestination, left.getKind().getStackKind())); } diff -r 6fc05ad86490 -r 8f3cd93813f1 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Fri Feb 07 15:03:21 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Fri Feb 07 15:20:59 2014 +0100 @@ -655,33 +655,33 @@ @Override public void emitIf(IfNode x) { - emitBranch(x.condition(), getLIRBlock(x.trueSuccessor()), getLIRBlock(x.falseSuccessor())); + emitBranch(x.condition(), getLIRBlock(x.trueSuccessor()), getLIRBlock(x.falseSuccessor()), x.probability(x.trueSuccessor())); } - public void emitBranch(LogicNode node, LabelRef trueSuccessor, LabelRef falseSuccessor) { + public void emitBranch(LogicNode node, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { if (node instanceof IsNullNode) { - emitNullCheckBranch((IsNullNode) node, trueSuccessor, falseSuccessor); + emitNullCheckBranch((IsNullNode) node, trueSuccessor, falseSuccessor, trueSuccessorProbability); } else if (node instanceof CompareNode) { - emitCompareBranch((CompareNode) node, trueSuccessor, falseSuccessor); + emitCompareBranch((CompareNode) node, trueSuccessor, falseSuccessor, trueSuccessorProbability); } else if (node instanceof LogicConstantNode) { emitConstantBranch(((LogicConstantNode) node).getValue(), trueSuccessor, falseSuccessor); } else if (node instanceof IntegerTestNode) { - emitIntegerTestBranch((IntegerTestNode) node, trueSuccessor, falseSuccessor); + emitIntegerTestBranch((IntegerTestNode) node, trueSuccessor, falseSuccessor, trueSuccessorProbability); } else { throw GraalInternalError.unimplemented(node.toString()); } } - private void emitNullCheckBranch(IsNullNode node, LabelRef trueSuccessor, LabelRef falseSuccessor) { - emitCompareBranch(operand(node.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueSuccessor, falseSuccessor); + private void emitNullCheckBranch(IsNullNode node, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { + emitCompareBranch(operand(node.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueSuccessor, falseSuccessor, trueSuccessorProbability); } - public void emitCompareBranch(CompareNode compare, LabelRef trueSuccessor, LabelRef falseSuccessor) { - emitCompareBranch(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueSuccessor, falseSuccessor); + public void emitCompareBranch(CompareNode compare, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { + emitCompareBranch(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueSuccessor, falseSuccessor, trueSuccessorProbability); } - public void emitIntegerTestBranch(IntegerTestNode test, LabelRef trueSuccessor, LabelRef falseSuccessor) { - emitIntegerTestBranch(operand(test.x()), operand(test.y()), trueSuccessor, falseSuccessor); + public void emitIntegerTestBranch(IntegerTestNode test, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { + emitIntegerTestBranch(operand(test.x()), operand(test.y()), trueSuccessor, falseSuccessor, trueSuccessorProbability); } public void emitConstantBranch(boolean value, LabelRef trueSuccessorBlock, LabelRef falseSuccessorBlock) { @@ -715,11 +715,11 @@ public abstract void emitJump(LabelRef label); - public abstract void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination); + public abstract void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability); - public abstract void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow); + public abstract void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability); - public abstract void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination); + public abstract void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueSuccessorProbability); public abstract Variable emitConditionalMove(Value leftVal, Value right, Condition cond, boolean unorderedIsTrue, Value trueValue, Value falseValue); @@ -847,7 +847,8 @@ Variable value = load(operand(x.value())); if (keyCount == 1) { assert defaultTarget != null; - emitCompareBranch(load(operand(x.value())), x.keyAt(0), Condition.EQ, false, getLIRBlock(x.keySuccessor(0)), defaultTarget); + double probability = x.probability(x.keySuccessor(0)); + emitCompareBranch(load(operand(x.value())), x.keyAt(0), Condition.EQ, false, getLIRBlock(x.keySuccessor(0)), defaultTarget, probability); } else { LabelRef[] keyTargets = new LabelRef[keyCount]; Constant[] keyConstants = new Constant[keyCount]; diff -r 6fc05ad86490 -r 8f3cd93813f1 graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ControlFlow.java --- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ControlFlow.java Fri Feb 07 15:03:21 2014 +0100 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ControlFlow.java Fri Feb 07 15:20:59 2014 +0100 @@ -61,28 +61,31 @@ protected final LabelRef trueDestination; protected final LabelRef falseDestination; - public BranchOp(Condition condition, LabelRef trueDestination, LabelRef falseDestination) { - this(intCond(condition), trueDestination, falseDestination); + private final double trueDestinationProbability; + + public BranchOp(Condition condition, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { + this(intCond(condition), trueDestination, falseDestination, trueDestinationProbability); } - public BranchOp(ConditionFlag condition, LabelRef trueDestination, LabelRef falseDestination) { + public BranchOp(ConditionFlag condition, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { this.condition = condition; this.trueDestination = trueDestination; this.falseDestination = falseDestination; + this.trueDestinationProbability = trueDestinationProbability; } @Override public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { if (crb.isSuccessorEdge(trueDestination)) { jcc(masm, true, falseDestination); - } else if (falseDestination.getSourceBlock() == falseDestination.getTargetBlock()) { + } else if (crb.isSuccessorEdge(falseDestination)) { + jcc(masm, false, trueDestination); + } else if (trueDestinationProbability < 0.5) { jcc(masm, true, falseDestination); masm.jmp(trueDestination.label()); } else { jcc(masm, false, trueDestination); - if (!crb.isSuccessorEdge(falseDestination)) { - masm.jmp(falseDestination.label()); - } + masm.jmp(falseDestination.label()); } } @@ -94,8 +97,8 @@ public static class FloatBranchOp extends BranchOp { protected boolean unorderedIsTrue; - public FloatBranchOp(Condition condition, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination) { - super(floatCond(condition), trueDestination, falseDestination); + public FloatBranchOp(Condition condition, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) { + super(floatCond(condition), trueDestination, falseDestination, trueDestinationProbability); this.unorderedIsTrue = unorderedIsTrue; } diff -r 6fc05ad86490 -r 8f3cd93813f1 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerExactArithmeticSplitNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerExactArithmeticSplitNode.java Fri Feb 07 15:03:21 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerExactArithmeticSplitNode.java Fri Feb 07 15:20:59 2014 +0100 @@ -74,7 +74,7 @@ @Override public void generate(LIRGenerator generator) { generator.setResult(this, generateArithmetic(generator)); - generator.emitOverflowCheckBranch(generator.getLIRBlock(getOverflowSuccessor()), generator.getLIRBlock(getNext())); + generator.emitOverflowCheckBranch(generator.getLIRBlock(getOverflowSuccessor()), generator.getLIRBlock(getNext()), probability(getOverflowSuccessor())); } protected abstract Value generateArithmetic(LIRGeneratorTool generator);