# HG changeset patch # User Gilles Duboscq # Date 1383746011 -3600 # Node ID 38b84d5a66fd31d9bc3db3d8c46c43d07039b617 # Parent d59a65c11febfe0ed6bd2802285c00fff8038c4e Start passing down a 'speculation id' to deoptimizations. Use it to record GuardNode id during guard lowering as a debug feature for now diff -r d59a65c11feb -r 38b84d5a66fd graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java Wed Nov 06 18:49:59 2013 +0100 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java Wed Nov 06 14:53:31 2013 +0100 @@ -70,9 +70,11 @@ /** * Encodes a deoptimization action and a deoptimization reason in an integer value. * + * @param speculationId a speculation ID returned by SpeculationLog.addSpeculation + * * @return the encoded value as an integer */ - Constant encodeDeoptActionAndReason(DeoptimizationAction action, DeoptimizationReason reason); + Constant encodeDeoptActionAndReason(DeoptimizationAction action, DeoptimizationReason reason, short speculationId); DeoptimizationReason decodeDeoptReason(Constant constant); diff -r d59a65c11feb -r 38b84d5a66fd graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Wed Nov 06 18:49:59 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Wed Nov 06 14:53:31 2013 +0100 @@ -406,7 +406,7 @@ @Override public void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason) { - moveDeoptimizationActionAndReasonToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason)); + moveDeoptimizationActionAndReasonToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason, (short) 0)); append(new AMD64HotSpotDeoptimizeCallerOp()); } diff -r d59a65c11feb -r 38b84d5a66fd graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Wed Nov 06 18:49:59 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Wed Nov 06 14:53:31 2013 +0100 @@ -207,7 +207,7 @@ @Override public void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason) { - moveDeoptimizationActionAndReasonToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason)); + moveDeoptimizationActionAndReasonToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason, (short) 0)); append(new SPARCHotSpotDeoptimizeCallerOp()); } diff -r d59a65c11feb -r 38b84d5a66fd graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java Wed Nov 06 18:49:59 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java Wed Nov 06 14:53:31 2013 +0100 @@ -83,12 +83,14 @@ private static final int ACTION_MASK = 0x07; private static final int REASON_SHIFT = 3; private static final int REASON_MASK = 0x1f; + private static final int DEBUG_SHIFT = 8; + private static final int DEBUG_MASK = 0xffff; @Override - public Constant encodeDeoptActionAndReason(DeoptimizationAction action, DeoptimizationReason reason) { + public Constant encodeDeoptActionAndReason(DeoptimizationAction action, DeoptimizationReason reason, short speculationId) { int actionValue = convertDeoptAction(action); int reasonValue = convertDeoptReason(reason); - Constant c = Constant.forInt(~(((reasonValue) << REASON_SHIFT) + ((actionValue) << ACTION_SHIFT))); + Constant c = Constant.forInt(~((speculationId << DEBUG_SHIFT) | (reasonValue << REASON_SHIFT) | (actionValue << ACTION_SHIFT))); return c; } @@ -104,6 +106,10 @@ return action; } + public short decodeSpeculationId(Constant constant) { + return (short) (((~constant.asInt()) >> DEBUG_SHIFT) & DEBUG_MASK); + } + public int convertDeoptAction(DeoptimizationAction action) { switch (action) { case None: diff -r d59a65c11feb -r 38b84d5a66fd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Wed Nov 06 18:49:59 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Wed Nov 06 14:53:31 2013 +0100 @@ -31,12 +31,18 @@ private final DeoptimizationAction action; private final DeoptimizationReason reason; + private final short speculationId; public DeoptimizeNode(DeoptimizationAction action, DeoptimizationReason reason) { + this(action, reason, (short) 0); + } + + public DeoptimizeNode(DeoptimizationAction action, DeoptimizationReason reason, short speculationId) { assert action != null; assert reason != null; this.action = action; this.reason = reason; + this.speculationId = speculationId; } public DeoptimizationAction action() { @@ -49,12 +55,12 @@ @Override public void generate(LIRGeneratorTool gen) { - gen.emitDeoptimize(gen.getMetaAccess().encodeDeoptActionAndReason(action, reason), this); + gen.emitDeoptimize(gen.getMetaAccess().encodeDeoptActionAndReason(action, reason, speculationId), this); } @Override public ValueNode getActionAndReason(MetaAccessProvider metaAccess) { - return ConstantNode.forConstant(metaAccess.encodeDeoptActionAndReason(action, reason), metaAccess, graph()); + return ConstantNode.forConstant(metaAccess.encodeDeoptActionAndReason(action, reason, speculationId), metaAccess, graph()); } @NodeIntrinsic diff -r d59a65c11feb -r 38b84d5a66fd graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Wed Nov 06 18:49:59 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Wed Nov 06 14:53:31 2013 +0100 @@ -27,6 +27,7 @@ import java.util.*; import java.util.Map.Entry; +import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.StructuredGraph.GuardsStage; @@ -144,7 +145,8 @@ private void lowerToIf(GuardNode guard) { StructuredGraph graph = guard.graph(); AbstractBeginNode fastPath = graph.add(new BeginNode()); - DeoptimizeNode deopt = graph.add(new DeoptimizeNode(guard.action(), guard.reason())); + @SuppressWarnings("deprecation") + DeoptimizeNode deopt = graph.add(new DeoptimizeNode(guard.action(), guard.reason(), (short) (Debug.isEnabled() ? guard.getId() : 0))); AbstractBeginNode deoptBranch = AbstractBeginNode.begin(deopt); AbstractBeginNode trueSuccessor; AbstractBeginNode falseSuccessor; diff -r d59a65c11feb -r 38b84d5a66fd src/share/vm/runtime/deoptimization.cpp --- a/src/share/vm/runtime/deoptimization.cpp Wed Nov 06 18:49:59 2013 +0100 +++ b/src/share/vm/runtime/deoptimization.cpp Wed Nov 06 14:53:31 2013 +0100 @@ -1339,6 +1339,9 @@ DeoptReason reason = trap_request_reason(trap_request); DeoptAction action = trap_request_action(trap_request); +#ifdef GRAAL + short speculation_id = trap_request_speculation_id(trap_request); +#endif jint unloaded_class_index = trap_request_index(trap_request); // CP idx or -1 vframe* vf = vframe::new_vframe(&fr, ®_map, thread); @@ -1349,7 +1352,11 @@ ScopeDesc* trap_scope = cvf->scope(); if (TraceDeoptimization) { - tty->print_cr(" bci=%d pc=%d, relative_pc=%d, method=%s", trap_scope->bci(), fr.pc(), fr.pc() - nm->code_begin(), trap_scope->method()->name()->as_C_string()); + tty->print_cr(" bci=%d pc=%d, relative_pc=%d, method=%s" GRAAL_ONLY(", speculation=%d"), trap_scope->bci(), fr.pc(), fr.pc() - nm->code_begin(), trap_scope->method()->name()->as_C_string() +#ifdef GRAAL + , speculation_id +#endif + ); } methodHandle trap_method = trap_scope->method(); @@ -1460,12 +1467,16 @@ tty->print(" (Graal: no installed code) "); } #endif //GRAAL - tty->print(" (@" INTPTR_FORMAT ") thread=" UINTX_FORMAT " reason=%s action=%s unloaded_class_index=%d", + tty->print(" (@" INTPTR_FORMAT ") thread=" UINTX_FORMAT " reason=%s action=%s unloaded_class_index=%d" GRAAL_ONLY(" speculation=%d"), fr.pc(), os::current_thread_id(), trap_reason_name(reason), trap_action_name(action), - unloaded_class_index); + unloaded_class_index +#ifdef GRAAL + , speculation_id +#endif + ); if (class_name != NULL) { tty->print(unresolved ? " unresolved class: " : " symbol: "); class_name->print_symbol_on(tty); @@ -1970,13 +1981,24 @@ jint unloaded_class_index = trap_request_index(trap_request); const char* reason = trap_reason_name(trap_request_reason(trap_request)); const char* action = trap_action_name(trap_request_action(trap_request)); +#ifdef GRAAL + short speculation_id = trap_request_speculation_id(trap_request); +#endif size_t len; if (unloaded_class_index < 0) { - len = jio_snprintf(buf, buflen, "reason='%s' action='%s'", - reason, action); + len = jio_snprintf(buf, buflen, "reason='%s' action='%s'" GRAAL_ONLY(" speculation='%d'"), + reason, action +#ifdef GRAAL + ,speculation_id +#endif + ); } else { - len = jio_snprintf(buf, buflen, "reason='%s' action='%s' index='%d'", - reason, action, unloaded_class_index); + len = jio_snprintf(buf, buflen, "reason='%s' action='%s' index='%d'" GRAAL_ONLY(" speculation='%d'"), + reason, action, unloaded_class_index +#ifdef GRAAL + ,speculation_id +#endif + ); } if (len >= buflen) buf[buflen-1] = '\0'; diff -r d59a65c11feb -r 38b84d5a66fd src/share/vm/runtime/deoptimization.hpp --- a/src/share/vm/runtime/deoptimization.hpp Wed Nov 06 18:49:59 2013 +0100 +++ b/src/share/vm/runtime/deoptimization.hpp Wed Nov 06 14:53:31 2013 +0100 @@ -102,8 +102,10 @@ enum { _action_bits = 3, _reason_bits = 5, + _speculation_id_bits = 16, _action_shift = 0, _reason_shift = _action_shift+_action_bits, + _speculation_id_shift = _reason_shift+_reason_bits, BC_CASE_LIMIT = PRODUCT_ONLY(1) NOT_PRODUCT(4) // for _deoptimization_hist }; @@ -286,6 +288,14 @@ // standard action for unloaded CP entry return _unloaded_action; } + static short trap_request_speculation_id(int trap_request) { + if (trap_request < 0) + return (DeoptAction) + ((~(trap_request) >> _speculation_id_shift) & right_n_bits(_speculation_id_bits)); + else + // standard action for unloaded CP entry + return 0; + } static int trap_request_index(int trap_request) { if (trap_request < 0) return -1;