From b1ece42218dcd13de9e7f9f991a695e9f8cc0db0 Mon Sep 17 00:00:00 2001 From: kvn Date: Wed, 7 Sep 2011 12:58:42 -0700 Subject: [PATCH] 7054211: No loop unrolling done in jdk7b144 for a test update() while loop Summary: restore unrolling code for CaffeineMark. Reviewed-by: never --- src/share/vm/opto/loopTransform.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/share/vm/opto/loopTransform.cpp b/src/share/vm/opto/loopTransform.cpp index 148c2e3d2..eee153a89 100644 --- a/src/share/vm/opto/loopTransform.cpp +++ b/src/share/vm/opto/loopTransform.cpp @@ -709,10 +709,13 @@ bool IdealLoopTree::policy_unroll( PhaseIdealLoop *phase ) const { // Adjust body_size to determine if we unroll or not uint body_size = _body.size(); + // Key test to unroll loop in CRC32 java code + int xors_in_loop = 0; // Also count ModL, DivL and MulL which expand mightly for (uint k = 0; k < _body.size(); k++) { Node* n = _body.at(k); switch (n->Opcode()) { + case Op_XorI: xors_in_loop++; break; // CRC32 java code case Op_ModL: body_size += 30; break; case Op_DivL: body_size += 30; break; case Op_MulL: body_size += 10; break; @@ -729,7 +732,8 @@ bool IdealLoopTree::policy_unroll( PhaseIdealLoop *phase ) const { // Check for being too big if (body_size > (uint)LoopUnrollLimit) { - // Normal case: loop too big + if (xors_in_loop >= 4 && body_size < (uint)LoopUnrollLimit*4) return true; + // Normal case: loop too big return false; } -- GitLab