diff src/share/vm/opto/loopopts.cpp @ 12778:e939acda146e

8179882: C2: Stale control info after cast node elimination during loop optimization pass Reviewed-by: kvn, roland
author vlivanov
date Tue, 30 May 2017 21:35:21 +0300
parents ea81fe138932
children
line wrap: on
line diff
--- a/src/share/vm/opto/loopopts.cpp	Mon May 29 10:32:37 2017 +0200
+++ b/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;
     }