changeset 12699:38b84d5a66fd

Start passing down a 'speculation id' to deoptimizations. Use it to record GuardNode id during guard lowering as a debug feature for now
author Gilles Duboscq <duboscq@ssw.jku.at>
date Wed, 06 Nov 2013 14:53:31 +0100
parents d59a65c11feb
children 4b053442b9d1
files graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaAccessProvider.java graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java src/share/vm/runtime/deoptimization.cpp src/share/vm/runtime/deoptimization.hpp
diffstat 8 files changed, 63 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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);
 
--- 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());
     }
 
--- 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());
     }
 
--- 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:
--- 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
--- 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;
--- 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, &reg_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';
--- 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;