changeset 10281:1da5d70655e9

8014286: failed java/lang/Math/DivModTests.java after 6934604 changes Summary: Corrected escape state for the result of boxing method. Added force inlining executed boxing methods. Reviewed-by: twisti
author kvn
date Mon, 13 May 2013 14:36:39 -0700
parents 8bcfd9ce2c6b
children cd6f6fccd287
files src/share/vm/opto/bytecodeInfo.cpp src/share/vm/opto/escape.cpp
diffstat 2 files changed, 33 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/opto/bytecodeInfo.cpp	Mon May 13 12:43:10 2013 -0700
+++ b/src/share/vm/opto/bytecodeInfo.cpp	Mon May 13 14:36:39 2013 -0700
@@ -85,20 +85,34 @@
   assert(!UseOldInlining, "do not use for old stuff");
 }
 
+/**
+ *  Return true when EA is ON and a java constructor is called or
+ *  a super constructor is called from an inlined java constructor.
+ *  Also return true for boxing methods.
+ */
 static bool is_init_with_ea(ciMethod* callee_method,
                             ciMethod* caller_method, Compile* C) {
-  // True when EA is ON and a java constructor is called or
-  // a super constructor is called from an inlined java constructor.
-  return C->do_escape_analysis() && EliminateAllocations &&
-         ( callee_method->is_initializer() ||
-           (caller_method->is_initializer() &&
-            caller_method != C->method() &&
-            caller_method->holder()->is_subclass_of(callee_method->holder()))
-         );
+  if (!C->do_escape_analysis() || !EliminateAllocations) {
+    return false; // EA is off
+  }
+  if (callee_method->is_initializer()) {
+    return true; // constuctor
+  }
+  if (caller_method->is_initializer() &&
+      caller_method != C->method() &&
+      caller_method->holder()->is_subclass_of(callee_method->holder())) {
+    return true; // super constructor is called from inlined constructor
+  }
+  if (C->eliminate_boxing() && callee_method->is_boxing_method()) {
+    return true;
+  }
+  return false;
 }
 
+/**
+ *  Force inlining unboxing accessor.
+ */
 static bool is_unboxing_method(ciMethod* callee_method, Compile* C) {
-  // Force inlining unboxing accessor.
   return C->eliminate_boxing() && callee_method->is_unboxing_method();
 }
 
--- a/src/share/vm/opto/escape.cpp	Mon May 13 12:43:10 2013 -0700
+++ b/src/share/vm/opto/escape.cpp	Mon May 13 14:36:39 2013 -0700
@@ -822,7 +822,16 @@
       ptnode_adr(call_idx)->set_scalar_replaceable(false);
     } else if (meth->is_boxing_method()) {
       // Returns boxing object
-      add_java_object(call, PointsToNode::NoEscape);
+      PointsToNode::EscapeState es;
+      vmIntrinsics::ID intr = meth->intrinsic_id();
+      if (intr == vmIntrinsics::_floatValue || intr == vmIntrinsics::_doubleValue) {
+        // It does not escape if object is always allocated.
+        es = PointsToNode::NoEscape;
+      } else {
+        // It escapes globally if object could be loaded from cache.
+        es = PointsToNode::GlobalEscape;
+      }
+      add_java_object(call, es);
     } else {
       BCEscapeAnalyzer* call_analyzer = meth->get_bcea();
       call_analyzer->copy_dependencies(_compile->dependencies());