8179882: C2: Stale control info after cast node elimination during loop optimization pass
Reviewed-by: kvn, roland
--- a/hotspot/src/share/vm/opto/loopnode.cpp Mon May 29 10:32:37 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Tue May 30 21:35:21 2017 +0300
@@ -1860,6 +1860,9 @@
if (_required_safept != NULL && _required_safept->size() > 0) {
tty->print(" req={"); _required_safept->dump_simple(); tty->print(" }");
}
+ if (Verbose) {
+ tty->print(" body={"); _body.dump_simple(); tty->print(" }");
+ }
tty->cr();
}
--- a/hotspot/src/share/vm/opto/loopopts.cpp Mon May 29 10:32:37 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Tue May 30 21:35:21 2017 +0300
@@ -913,7 +913,11 @@
if (n->is_ConstraintCast()) {
Node* dom_cast = n->as_ConstraintCast()->dominating_cast(this);
- if (dom_cast != NULL) {
+ // ConstraintCastNode::dominating_cast() uses node control input to determine domination.
+ // Node control inputs don't necessarily agree with loop control info (due to
+ // transformations happened in between), thus additional dominance check is needed
+ // to keep loop info valid.
+ if (dom_cast != NULL && is_dominator(get_ctrl(dom_cast), get_ctrl(n))) {
_igvn.replace_node(n, dom_cast);
return dom_cast;
}