src/share/vm/opto/macro.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/macro.cpp	Wed Feb  4 21:22:05 2009
--- new/src/share/vm/opto/macro.cpp	Wed Feb  4 21:22:05 2009

*** 950,966 **** --- 950,959 ---- Node* i_o = alloc->in(TypeFunc::I_O); Node* size_in_bytes = alloc->in(AllocateNode::AllocSize); Node* klass_node = alloc->in(AllocateNode::KlassNode); Node* initial_slow_test = alloc->in(AllocateNode::InitialTest); // With escape analysis, the entire memory state was needed to be able to // eliminate the allocation. Since the allocations cannot be eliminated, // optimize it to the raw slice. if (mem->is_MergeMem()) { mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); } assert(ctrl != NULL, "must have control"); // We need a Region and corresponding Phi's to merge the slow-path and fast-path results. // they will not be used if "always_slow" is set enum { slow_result_path = 1, fast_result_path = 2 }; Node *result_region;
*** 1014,1023 **** --- 1007,1021 ---- } Node *slow_mem = mem; // save the current memory state for slow path // generate the fast allocation code unless we know that the initial test will always go slow if (!always_slow) { + // Fast path modifies only raw memory. + if (mem->is_MergeMem()) { + mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); + } + Node* eden_top_adr; Node* eden_end_adr; set_eden_pointers(eden_top_adr, eden_end_adr);
*** 1237,1248 **** --- 1235,1244 ---- // back up iterator --i; } } mem = result_phi_rawmem; // An allocate node has separate i_o projections for the uses on the control and i_o paths // Replace uses of the control i_o projection with result_phi_i_o (unless we are only generating a slow call) if (_ioproj_fallthrough == NULL) { _ioproj_fallthrough = new (C, 1) ProjNode(call, TypeFunc::I_O); transform_later(_ioproj_fallthrough);

src/share/vm/opto/macro.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File