diff -r 519fbe71f995 -r f034e0c86895 hotspot/src/share/vm/opto/idealKit.cpp --- a/hotspot/src/share/vm/opto/idealKit.cpp Wed Jul 15 13:37:35 2009 -0700 +++ b/hotspot/src/share/vm/opto/idealKit.cpp Thu Jul 16 14:10:42 2009 -0700 @@ -34,7 +34,7 @@ const uint IdealKit::first_var = TypeFunc::Parms + 1; //----------------------------IdealKit----------------------------------------- -IdealKit::IdealKit(PhaseGVN &gvn, Node* control, Node* mem, bool delay_all_transforms) : +IdealKit::IdealKit(PhaseGVN &gvn, Node* control, Node* mem, bool delay_all_transforms, bool has_declarations) : _gvn(gvn), C(gvn.C) { _initial_ctrl = control; _initial_memory = mem; @@ -47,6 +47,9 @@ _pending_cvstates = new (C->node_arena()) GrowableArray(C->node_arena(), init_size, 0, 0); _delay_transform = new (C->node_arena()) GrowableArray(C->node_arena(), init_size, 0, 0); DEBUG_ONLY(_state = new (C->node_arena()) GrowableArray(C->node_arena(), init_size, 0, 0)); + if (!has_declarations) { + declarations_done(); + } } //-------------------------------if_then------------------------------------- @@ -97,7 +100,7 @@ //-------------------------------end_if------------------------------------- // Merge the "then" and "else" cvstates. // -// The if_then() pushed the current state for later use +// The if_then() pushed a copy of the current state for later use // as the initial state for a future "else" clause. The // current state then became the initial state for the // then clause. If an "else" clause was encountered, it will @@ -258,8 +261,8 @@ return delay_transform(PhiNode::make(reg, n, ct)); } -//-----------------------------declares_done----------------------------------- -void IdealKit::declares_done() { +//-----------------------------declarations_done------------------------------- +void IdealKit::declarations_done() { _cvstate = new_cvstate(); // initialize current cvstate set_ctrl(_initial_ctrl); // initialize control in current cvstate set_all_memory(_initial_memory);// initialize memory in current cvstate @@ -277,7 +280,9 @@ //-----------------------------delay_transform----------------------------------- Node* IdealKit::delay_transform(Node* n) { - gvn().set_type(n, n->bottom_type()); + if (!gvn().is_IterGVN() || !gvn().is_IterGVN()->delay_transform()) { + gvn().set_type(n, n->bottom_type()); + } _delay_transform->push(n); return n; } @@ -321,7 +326,9 @@ Node* IdealKit::memory(uint alias_idx) { MergeMemNode* mem = merged_memory(); Node* p = mem->memory_at(alias_idx); - _gvn.set_type(p, Type::MEMORY); // must be mapped + if (!gvn().is_IterGVN() || !gvn().is_IterGVN()->delay_transform()) { + _gvn.set_type(p, Type::MEMORY); // must be mapped + } return p; } @@ -462,9 +469,6 @@ const TypePtr* adr_type = TypeRawPtr::BOTTOM; uint adr_idx = C->get_alias_index(adr_type); - // Clone initial memory - MergeMemNode* cloned_mem = MergeMemNode::make(C, merged_memory()); - // Slow-path leaf call int size = slow_call_type->domain()->cnt(); CallNode *call = (CallNode*)new (C, size) CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type); @@ -489,9 +493,6 @@ set_ctrl(transform( new (C, 1) ProjNode(call,TypeFunc::Control) )); - // Set the incoming clone of memory as current memory - set_all_memory(cloned_mem); - // Make memory for the call Node* mem = _gvn.transform( new (C, 1) ProjNode(call, TypeFunc::Memory) );