Mercurial > hg > truffle
comparison src/share/vm/opto/loopTransform.cpp @ 3930:da6a29fb0da5
7054211: No loop unrolling done in jdk7b144 for a test update() while loop
Summary: restore unrolling code for CaffeineMark.
Reviewed-by: never
author | kvn |
---|---|
date | Wed, 07 Sep 2011 12:58:42 -0700 |
parents | 6987871cfb9b |
children | 5e990493719e |
comparison
equal
deleted
inserted
replaced
3909:c2d3caa64b3e | 3930:da6a29fb0da5 |
---|---|
707 stride_con < 0 && ((limit_type->_lo - stride_con) <= limit_type->_lo)) | 707 stride_con < 0 && ((limit_type->_lo - stride_con) <= limit_type->_lo)) |
708 return false; // overflow | 708 return false; // overflow |
709 | 709 |
710 // Adjust body_size to determine if we unroll or not | 710 // Adjust body_size to determine if we unroll or not |
711 uint body_size = _body.size(); | 711 uint body_size = _body.size(); |
712 // Key test to unroll loop in CRC32 java code | |
713 int xors_in_loop = 0; | |
712 // Also count ModL, DivL and MulL which expand mightly | 714 // Also count ModL, DivL and MulL which expand mightly |
713 for (uint k = 0; k < _body.size(); k++) { | 715 for (uint k = 0; k < _body.size(); k++) { |
714 Node* n = _body.at(k); | 716 Node* n = _body.at(k); |
715 switch (n->Opcode()) { | 717 switch (n->Opcode()) { |
718 case Op_XorI: xors_in_loop++; break; // CRC32 java code | |
716 case Op_ModL: body_size += 30; break; | 719 case Op_ModL: body_size += 30; break; |
717 case Op_DivL: body_size += 30; break; | 720 case Op_DivL: body_size += 30; break; |
718 case Op_MulL: body_size += 10; break; | 721 case Op_MulL: body_size += 10; break; |
719 case Op_StrComp: | 722 case Op_StrComp: |
720 case Op_StrEquals: | 723 case Op_StrEquals: |
727 } // switch | 730 } // switch |
728 } | 731 } |
729 | 732 |
730 // Check for being too big | 733 // Check for being too big |
731 if (body_size > (uint)LoopUnrollLimit) { | 734 if (body_size > (uint)LoopUnrollLimit) { |
732 // Normal case: loop too big | 735 if (xors_in_loop >= 4 && body_size < (uint)LoopUnrollLimit*4) return true; |
736 // Normal case: loop too big | |
733 return false; | 737 return false; |
734 } | 738 } |
735 | 739 |
736 // Unroll once! (Each trip will soon do double iterations) | 740 // Unroll once! (Each trip will soon do double iterations) |
737 return true; | 741 return true; |