--- a/hotspot/src/share/vm/ci/ciMethod.cpp Tue Sep 15 22:50:12 2009 -0700
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Wed Sep 16 11:06:10 2009 -0700
@@ -325,10 +325,10 @@
}
// ------------------------------------------------------------------
-// ciMethod::liveness_at_bci
+// ciMethod::raw_liveness_at_bci
//
// Which local variables are live at a specific bci?
-MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
+MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
check_is_loaded();
if (_liveness == NULL) {
// Create the liveness analyzer.
@@ -336,7 +336,17 @@
_liveness = new (arena) MethodLiveness(arena, this);
_liveness->compute_liveness();
}
- MethodLivenessResult result = _liveness->get_liveness_at(bci);
+ return _liveness->get_liveness_at(bci);
+}
+
+// ------------------------------------------------------------------
+// ciMethod::liveness_at_bci
+//
+// Which local variables are live at a specific bci? When debugging
+// will return true for all locals in some cases to improve debug
+// information.
+MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
+ MethodLivenessResult result = raw_liveness_at_bci(bci);
if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
// Keep all locals live for the user's edification and amusement.
result.at_put_range(0, result.size(), true);
--- a/hotspot/src/share/vm/ci/ciMethod.hpp Tue Sep 15 22:50:12 2009 -0700
+++ b/hotspot/src/share/vm/ci/ciMethod.hpp Wed Sep 16 11:06:10 2009 -0700
@@ -149,6 +149,12 @@
bool has_monitor_bytecodes() const { return _uses_monitors; }
bool has_balanced_monitors();
+ // Returns a bitmap indicating which locals are required to be
+ // maintained as live for deopt. raw_liveness_at_bci is always the
+ // direct output of the liveness computation while liveness_at_bci
+ // may mark all locals as live to improve support for debugging Java
+ // code by maintaining the state of as many locals as possible.
+ MethodLivenessResult raw_liveness_at_bci(int bci);
MethodLivenessResult liveness_at_bci(int bci);
// Get the interpreters viewpoint on oop liveness. MethodLiveness is
--- a/hotspot/src/share/vm/ci/ciTypeFlow.cpp Tue Sep 15 22:50:12 2009 -0700
+++ b/hotspot/src/share/vm/ci/ciTypeFlow.cpp Wed Sep 16 11:06:10 2009 -0700
@@ -2486,8 +2486,13 @@
// Assume irreducible entries need more data flow
add_to_work_list(succ);
}
- lp = lp->parent();
- assert(lp != NULL, "nested loop must have parent by now");
+ Loop* plp = lp->parent();
+ if (plp == NULL) {
+ // This only happens for some irreducible cases. The parent
+ // will be updated during a later pass.
+ break;
+ }
+ lp = plp;
}
// Merge loop tree branch for all successors.
--- a/hotspot/src/share/vm/opto/parse1.cpp Tue Sep 15 22:50:12 2009 -0700
+++ b/hotspot/src/share/vm/opto/parse1.cpp Wed Sep 16 11:06:10 2009 -0700
@@ -229,7 +229,9 @@
}
}
- MethodLivenessResult live_locals = method()->liveness_at_bci(osr_bci());
+ // Use the raw liveness computation to make sure that unexpected
+ // values don't propagate into the OSR frame.
+ MethodLivenessResult live_locals = method()->raw_liveness_at_bci(osr_bci());
if (!live_locals.is_valid()) {
// Degenerate or breakpointed method.
C->record_method_not_compilable("OSR in empty or breakpointed method");