# HG changeset patch # User Lukas Stadler # Date 1359048046 -3600 # Node ID 9472211c812be7d107371dc23c32d3188408d4e0 # Parent d34f5456475f13b1ce9e82359f6a8228c92ca5b1 named constants for snippet probabilities (likely, frequent, fast_path, deopt), see CR-7 diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ArrayCopySnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ArrayCopySnippets.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ArrayCopySnippets.java Thu Jan 24 18:20:46 2013 +0100 @@ -90,7 +90,7 @@ long srcOffset = (long) srcPos * elementSize; long destOffset = (long) destPos * elementSize; if (src == dest && srcPos < destPos) { // bad aliased case - probability(0.1); + probability(NOT_FREQUENT_PROBABILITY); for (long i = byteLength - elementSize; i >= byteLength - nonVectorBytes; i -= elementSize) { UnsafeStoreNode.store(dest, header, i + destOffset, UnsafeLoadNode.load(src, header, i + srcOffset, baseKind), baseKind); } @@ -112,37 +112,37 @@ public static void checkInputs(Object src, int srcPos, Object dest, int destPos, int length) { if (src == null) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); checkNPECounter.inc(); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } if (dest == null) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); checkNPECounter.inc(); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } if (srcPos < 0) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); checkAIOOBECounter.inc(); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } if (destPos < 0) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); checkAIOOBECounter.inc(); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } if (length < 0) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); checkAIOOBECounter.inc(); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } if (srcPos + length > ArrayLengthNode.arrayLength(src)) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); checkAIOOBECounter.inc(); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } if (destPos + length > ArrayLengthNode.arrayLength(dest)) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); checkAIOOBECounter.inc(); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/CheckCastSnippets.java Thu Jan 24 18:20:46 2013 +0100 @@ -75,12 +75,12 @@ @Parameter("exactHub") Word exactHub, @ConstantParameter("checkNull") boolean checkNull) { if (checkNull && object == null) { - probability(0.1); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); } else { Word objectHub = loadHub(object); if (objectHub != exactHub) { - probability(0.01); + probability(DEOPT_PATH_PROBABILITY); exactMiss.inc(); //bkpt(object, exactHub, objectHub); DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); @@ -104,12 +104,12 @@ @ConstantParameter("checkNull") boolean checkNull, @ConstantParameter("superCheckOffset") int superCheckOffset) { if (checkNull && object == null) { - probability(0.1); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); } else { Word objectHub = loadHub(object); if (objectHub.readWord(superCheckOffset) != hub) { - probability(0.1); + probability(DEOPT_PATH_PROBABILITY); displayMiss.inc(); DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); } @@ -128,7 +128,7 @@ @VarargsParameter("hints") Word[] hints, @ConstantParameter("checkNull") boolean checkNull) { if (checkNull && object == null) { - probability(0.1); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); } else { Word objectHub = loadHub(object); @@ -158,7 +158,7 @@ @Parameter("object") Object object, @ConstantParameter("checkNull") boolean checkNull) { if (checkNull && object == null) { - probability(0.1); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); } else { Word objectHub = loadHub(object); diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/HotSpotSnippetUtils.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/HotSpotSnippetUtils.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/HotSpotSnippetUtils.java Thu Jan 24 18:20:46 2013 +0100 @@ -463,10 +463,10 @@ // this code is independent from biased locking (although it does not look that way) final Word biasedLock = mark.and(biasedLockMaskInPlace()); if (biasedLock == Word.unsigned(unlockedMask())) { - probability(0.99); + probability(FAST_PATH_PROBABILITY); int hash = (int) mark.unsignedShiftRight(identityHashCodeShift()).rawValue(); if (hash != uninitializedIdentityHashCodeValue()) { - probability(0.99); + probability(FAST_PATH_PROBABILITY); return hash; } } diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/InstanceOfSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/InstanceOfSnippets.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/InstanceOfSnippets.java Thu Jan 24 18:20:46 2013 +0100 @@ -68,13 +68,13 @@ @Parameter("falseValue") Object falseValue, @ConstantParameter("checkNull") boolean checkNull) { if (checkNull && object == null) { - probability(0.01); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); return falseValue; } Word objectHub = loadHub(object); if (objectHub != exactHub) { - probability(0.75); + probability(LIKELY_PROBABILITY); exactMiss.inc(); return falseValue; } @@ -94,13 +94,13 @@ @ConstantParameter("checkNull") boolean checkNull, @ConstantParameter("superCheckOffset") int superCheckOffset) { if (checkNull && object == null) { - probability(0.01); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); return falseValue; } Word objectHub = loadHub(object); if (objectHub.readWord(superCheckOffset) != hub) { - probability(0.45); + probability(NOT_LIKELY_PROBABILITY); displayMiss.inc(); return falseValue; } @@ -120,7 +120,7 @@ @VarargsParameter("hints") Word[] hints, @ConstantParameter("checkNull") boolean checkNull) { if (checkNull && object == null) { - probability(0.01); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); return falseValue; } @@ -130,7 +130,7 @@ for (int i = 0; i < hints.length; i++) { Word hintHub = hints[i]; if (hintHub == objectHub) { - probability(0.01); + probability(NOT_FREQUENT_PROBABILITY); hintsHit.inc(); return trueValue; } @@ -152,7 +152,7 @@ @Parameter("falseValue") Object falseValue, @ConstantParameter("checkNull") boolean checkNull) { if (checkNull && object == null) { - probability(0.01); + probability(NOT_FREQUENT_PROBABILITY); isNull.inc(); return falseValue; } diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/MonitorSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/MonitorSnippets.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/MonitorSnippets.java Thu Jan 24 18:20:46 2013 +0100 @@ -108,7 +108,7 @@ if (biasableLockBits != Word.unsigned(biasedLockPattern())) { // Biasing not enabled -> fall through to lightweight locking } else { - probability(0.75); + probability(FREQUENT_PROBABILITY); // The bias pattern is present in the object's mark word. Need to check // whether the bias owner and the epoch are both still current. Word hub = loadHub(object); @@ -120,7 +120,7 @@ trace(trace, " tmp: 0x%016lx\n", tmp); if (tmp == Word.zero()) { // Object is already biased to current thread -> done - probability(0.75); + probability(FREQUENT_PROBABILITY); traceObject(trace, "+lock{bias:existing}", object); return; } @@ -135,7 +135,7 @@ // the prototype header is no longer biasable and we have to revoke // the bias on this object. if (tmp.and(biasedLockMaskInPlace()) == Word.zero()) { - probability(0.75); + probability(FREQUENT_PROBABILITY); // Biasing is still enabled for object's type. See whether the // epoch of the current bias is still valid, meaning that the epoch // bits of the mark word are equal to the epoch bits of the @@ -146,7 +146,7 @@ // otherwise the manipulations it performs on the mark word are // illegal. if (tmp.and(epochMaskInPlace()) == Word.zero()) { - probability(0.75); + probability(FREQUENT_PROBABILITY); // The epoch of the current bias is still valid but we know nothing // about the owner; it might be set or it might be clear. Try to // acquire the bias of the object using an atomic operation. If this @@ -165,7 +165,7 @@ // If the biasing toward our thread failed, this means that another thread // owns the bias and we need to revoke that bias. The revocation will occur // in the interpreter runtime. - probability(0.0001); + probability(DEOPT_PATH_PROBABILITY); traceObject(trace, "+lock{stub:revoke}", object); MonitorEnterStubCall.call(object, lock); return; @@ -186,7 +186,7 @@ // If the biasing toward our thread failed, then another thread // succeeded in biasing it toward itself and we need to revoke that // bias. The revocation will occur in the runtime in the slow case. - probability(0.0001); + probability(DEOPT_PATH_PROBABILITY); traceObject(trace, "+lock{stub:epoch-expired}", object); MonitorEnterStubCall.call(object, lock); return; @@ -244,7 +244,7 @@ final Word stackPointer = stackPointer(); if (currentMark.subtract(stackPointer).and(alignedMask.subtract(pageSize())) != Word.zero()) { // Most likely not a recursive lock, go into a slow runtime call - probability(0.001); + probability(DEOPT_PATH_PROBABILITY); traceObject(trace, "+lock{stub:failed-cas}", object); MonitorEnterStubCall.call(object, lock); return; @@ -299,7 +299,7 @@ final Word mark = loadWordFromObject(object, markOffset()); trace(trace, " mark: 0x%016lx\n", mark); if (mark.and(biasedLockMaskInPlace()) == Word.unsigned(biasedLockPattern())) { - probability(0.75); + probability(FREQUENT_PROBABILITY); endLockScope(); decCounter(); traceObject(trace, "-lock{bias}", object); @@ -324,7 +324,7 @@ if (DirectCompareAndSwapNode.compareAndSwap(object, markOffset(), lock, displacedMark) != lock) { // The object's mark word was not pointing to the displaced header, // we do unlocking via runtime call. - probability(0.001); + probability(DEOPT_PATH_PROBABILITY); traceObject(trace, "-lock{stub}", object); MonitorExitStubCall.call(object); } else { diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java Thu Jan 24 18:20:46 2013 +0100 @@ -67,7 +67,7 @@ Word newTop = top.add(size); // this check might lead to problems if the TLAB is within 16GB of the address space end (checked in c++ code) if (newTop.belowOrEqual(end)) { - probability(0.99); + probability(FAST_PATH_PROBABILITY); thread.writeWord(threadTlabTopOffset(), newTop); return top; } @@ -88,7 +88,7 @@ new_stub.inc(); result = NewInstanceStubCall.call(hub); } else { - probability(0.99); + probability(FAST_PATH_PROBABILITY); if (locked) { formatObject(hub, size, memory, thread().or(biasedLockPattern()), fillContents); } else { @@ -122,7 +122,7 @@ newarray_stub.inc(); result = NewArrayStubCall.call(hub, length); } else { - probability(0.99); + probability(FAST_PATH_PROBABILITY); newarray_loopInit.inc(); formatArray(hub, allocationSize, length, headerSize, memory, prototypeMarkWord, fillContents); result = memory.toObject(); @@ -143,10 +143,10 @@ @ConstantParameter("log2ElementSize") int log2ElementSize, @ConstantParameter("type") ResolvedJavaType type) { if (!belowThan(length, MAX_ARRAY_FAST_PATH_ALLOCATION_LENGTH)) { + probability(DEOPT_PATH_PROBABILITY); // This handles both negative array sizes and very large array sizes DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } - probability(0.99); int allocationSize = computeArrayAllocationSize(length, alignment, headerSize, log2ElementSize); Word memory = TLABAllocateNode.allocateVariableSize(allocationSize); return InitializeArrayNode.initialize(memory, length, allocationSize, type, true, false); diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/SystemSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/SystemSubstitutions.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/SystemSubstitutions.java Thu Jan 24 18:20:46 2013 +0100 @@ -58,7 +58,7 @@ @MethodSubstitution public static int identityHashCode(Object x) { if (x == null) { - probability(0.01); + probability(NOT_FREQUENT_PROBABILITY); return 0; } diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/TypeCheckSnippetUtils.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/TypeCheckSnippetUtils.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/TypeCheckSnippetUtils.java Thu Jan 24 18:20:46 2013 +0100 @@ -85,7 +85,7 @@ int length = secondarySupers.readInt(metaspaceArrayLengthOffset()); for (int i = 0; i < length; i++) { if (t == loadWordElement(secondarySupers, i)) { - probability(0.01); + probability(NOT_LIKELY_PROBABILITY); s.writeWord(secondarySuperCacheOffset(), t); secondariesHit.inc(); return true; diff -r d34f5456475f -r 9472211c812b graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/nodes/BranchProbabilityNode.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/nodes/BranchProbabilityNode.java Thu Jan 24 17:06:00 2013 +0100 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/nodes/BranchProbabilityNode.java Thu Jan 24 18:20:46 2013 +0100 @@ -34,6 +34,18 @@ */ public class BranchProbabilityNode extends FixedWithNextNode implements Simplifiable { + public static final double LIKELY_PROBABILITY = 0.6; + public static final double NOT_LIKELY_PROBABILITY = 1 - LIKELY_PROBABILITY; + + public static final double FREQUENT_PROBABILITY = 0.9; + public static final double NOT_FREQUENT_PROBABILITY = 1 - FREQUENT_PROBABILITY; + + public static final double FAST_PATH_PROBABILITY = 0.99; + public static final double SLOW_PATH_PROBABILITY = 1 - FAST_PATH_PROBABILITY; + + public static final double NOT_DEOPT_PATH_PROBABILITY = 0.999; + public static final double DEOPT_PATH_PROBABILITY = 1 - NOT_DEOPT_PATH_PROBABILITY; + private final double probability; public BranchProbabilityNode(double probability) {