hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp
changeset 18955 be9410d4a97c
parent 14478 1c4a20806af7
child 22234 da823d78ad65
--- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp	Wed Jul 10 13:33:56 2013 -0700
+++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp	Fri Jul 12 14:01:37 2013 -0700
@@ -138,6 +138,16 @@
   return false;
 }
 
+// return true if all argument elements of vars are returned
+bool BCEscapeAnalyzer::returns_all(ArgumentMap vars) {
+  for (int i = 0; i < _arg_size; i++) {
+    if (vars.contains(i) && !_arg_returned.test(i)) {
+      return false;
+    }
+  }
+  return true;
+}
+
 void BCEscapeAnalyzer::clear_bits(ArgumentMap vars, VectorSet &bm) {
   for (int i = 0; i < _arg_size; i++) {
     if (vars.contains(i)) {
@@ -166,6 +176,11 @@
     if (vars.contains_unknown() || vars.contains_vars()) {
       _return_allocated = false;
     }
+    if (_return_local && vars.contains_vars() && !returns_all(vars)) {
+      // Return result should be invalidated if args in new
+      // state are not recorded in return state.
+      _return_local = false;
+    }
   }
 }