Thu, 31 Mar 2011 15:30:12 -0700
Merge
1.1 --- a/src/share/vm/opto/loopTransform.cpp Thu Mar 31 14:00:41 2011 -0700 1.2 +++ b/src/share/vm/opto/loopTransform.cpp Thu Mar 31 15:30:12 2011 -0700 1.3 @@ -432,6 +432,12 @@ 1.4 return false; 1.5 } 1.6 1.7 + // Currently we don't have policy to optimize one iteration loops. 1.8 + // Maximally unrolling transformation is used for that: 1.9 + // it is peeled and the original loop become non reachable (dead). 1.10 + if (trip_count == 1) 1.11 + return true; 1.12 + 1.13 // Do not unroll a loop with String intrinsics code. 1.14 // String intrinsics are large and have loops. 1.15 for (uint k = 0; k < _body.size(); k++) {
2.1 --- a/src/share/vm/opto/memnode.cpp Thu Mar 31 14:00:41 2011 -0700 2.2 +++ b/src/share/vm/opto/memnode.cpp Thu Mar 31 15:30:12 2011 -0700 2.3 @@ -2628,12 +2628,16 @@ 2.4 Node *StrIntrinsicNode::Ideal(PhaseGVN *phase, bool can_reshape) { 2.5 if (remove_dead_region(phase, can_reshape)) return this; 2.6 2.7 - Node* mem = phase->transform(in(MemNode::Memory)); 2.8 - // If transformed to a MergeMem, get the desired slice 2.9 - uint alias_idx = phase->C->get_alias_index(adr_type()); 2.10 - mem = mem->is_MergeMem() ? mem->as_MergeMem()->memory_at(alias_idx) : mem; 2.11 - if (mem != in(MemNode::Memory)) 2.12 - set_req(MemNode::Memory, mem); 2.13 + if (can_reshape) { 2.14 + Node* mem = phase->transform(in(MemNode::Memory)); 2.15 + // If transformed to a MergeMem, get the desired slice 2.16 + uint alias_idx = phase->C->get_alias_index(adr_type()); 2.17 + mem = mem->is_MergeMem() ? mem->as_MergeMem()->memory_at(alias_idx) : mem; 2.18 + if (mem != in(MemNode::Memory)) { 2.19 + set_req(MemNode::Memory, mem); 2.20 + return this; 2.21 + } 2.22 + } 2.23 return NULL; 2.24 } 2.25