src/share/vm/opto/macro.cpp
Print this page
rev 3361 : 7173584: Implement arraycopy as a macro node
Summary: delay the conversion of arraycopy to stub calls to macro expansion
Reviewed-by:
@@ -2395,10 +2395,12 @@
break;
case Node::Class_Lock:
case Node::Class_Unlock:
assert(!n->as_AbstractLock()->is_eliminated(), "sanity");
break;
+ case Node::Class_ArrayCopy:
+ break;
default:
assert(n->Opcode() == Op_LoopLimit ||
n->Opcode() == Op_Opaque1 ||
n->Opcode() == Op_Opaque2, "unknown node type in macro list");
}
@@ -2440,10 +2442,29 @@
assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count");
progress = progress || success;
}
}
+ // expand arraycopy "macro" nodes first
+ // For ReduceBulkZeroing, we must first process all arraycopy nodes
+ // before the allocate nodes are expanded.
+ int macro_idx = C->macro_count() - 1;
+ while (macro_idx >= 0) {
+ Node * n = C->macro_node(macro_idx);
+ assert(n->is_macro(), "only macro nodes expected here");
+ if (_igvn.type(n) == Type::TOP || n->in(0)->is_top() ) {
+ // node is unreachable, so don't try to expand it
+ C->remove_macro_node(n);
+ } else if (n->is_ArrayCopy()){
+ int macro_count = C->macro_count();
+ expand_arraycopy_node(n->as_ArrayCopy());
+ assert(C->macro_count() < macro_count, "must have deleted a node from macro list");
+ }
+ if (C->failing()) return true;
+ macro_idx --;
+ }
+
// expand "macro" nodes
// nodes are removed from the macro list as they are processed
while (C->macro_count() > 0) {
int macro_count = C->macro_count();
Node * n = C->macro_node(macro_count-1);