< prev index next >
src/share/vm/opto/callGenerator.cpp
Print this page
rev 5783 : 8024069: replace_in_map() should operate on parent maps
Summary: type information gets lost because replace_in_map() doesn't update parent maps
Reviewed-by: kvn, twisti
rev 5784 : 8026796: Make replace_in_map() on parent maps generic
Summary: propagate node replacements along control flow edges to callers
Reviewed-by: kvn, vlivanov
@@ -393,11 +393,11 @@
C->set_has_loops(C->has_loops() || _inline_cg->method()->has_loops());
C->env()->notice_inlined_method(_inline_cg->method());
C->set_inlining_progress(true);
- kit.replace_call(call, result);
+ kit.replace_call(call, result, true);
}
CallGenerator* CallGenerator::for_late_inline(ciMethod* method, CallGenerator* inline_cg) {
return new LateInlineCallGenerator(method, inline_cg);
@@ -612,10 +612,14 @@
receiver = kit.null_check_receiver_before_call(method());
if (kit.stopped()) {
return kit.transfer_exceptions_into_jvms();
}
+ // Make a copy of the replaced nodes in case we need to restore them
+ ReplacedNodes replaced_nodes = kit.map()->replaced_nodes();
+ replaced_nodes.clone();
+
Node* exact_receiver = receiver; // will get updated in place...
Node* slow_ctl = kit.type_check_receiver(receiver,
_predicted_receiver, _hit_prob,
&exact_receiver);
@@ -665,10 +669,15 @@
// Inlined method threw an exception, so it's just the slow path after all.
kit.set_jvms(slow_jvms);
return kit.transfer_exceptions_into_jvms();
}
+ // There are 2 branches and the replaced nodes are only valid on
+ // one: restore the replaced nodes to what they were before the
+ // branch.
+ kit.map()->set_replaced_nodes(replaced_nodes);
+
// Finish the diamond.
kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
RegionNode* region = new (kit.C) RegionNode(3);
region->init_req(1, kit.control());
region->init_req(2, slow_map->control());
< prev index next >