src/share/vm/opto/loopTransform.cpp

changeset 2865
ae93231c7a1f
parent 2750
6c97c830fb6f
child 2877
bad7ecd0b6ed
equal deleted inserted replaced
2815:01fd6090fdd8 2865:ae93231c7a1f
630 630
631 return true; // Do maximally unroll 631 return true; // Do maximally unroll
632 } 632 }
633 633
634 634
635 #define MAX_UNROLL 16 // maximum number of unrolls for main loop
636
635 //------------------------------policy_unroll---------------------------------- 637 //------------------------------policy_unroll----------------------------------
636 // Return TRUE or FALSE if the loop should be unrolled or not. Unroll if 638 // Return TRUE or FALSE if the loop should be unrolled or not. Unroll if
637 // the loop is a CountedLoop and the body is small enough. 639 // the loop is a CountedLoop and the body is small enough.
638 bool IdealLoopTree::policy_unroll( PhaseIdealLoop *phase ) const { 640 bool IdealLoopTree::policy_unroll( PhaseIdealLoop *phase ) const {
639 641
644 return false; // Malformed counted loop 646 return false; // Malformed counted loop
645 647
646 // protect against over-unrolling 648 // protect against over-unrolling
647 if (cl->trip_count() <= 1) return false; 649 if (cl->trip_count() <= 1) return false;
648 650
649 // Check for stride being a small enough constant
650 if (abs(cl->stride_con()) > (1<<3)) return false;
651
652 int future_unroll_ct = cl->unrolled_count() * 2; 651 int future_unroll_ct = cl->unrolled_count() * 2;
652 if (future_unroll_ct > MAX_UNROLL) return false;
653
654 // Check for initial stride being a small enough constant
655 if (abs(cl->stride_con()) > (1<<2)*future_unroll_ct) return false;
653 656
654 // Don't unroll if the next round of unrolling would push us 657 // Don't unroll if the next round of unrolling would push us
655 // over the expected trip count of the loop. One is subtracted 658 // over the expected trip count of the loop. One is subtracted
656 // from the expected trip count because the pre-loop normally 659 // from the expected trip count because the pre-loop normally
657 // executes 1 iteration. 660 // executes 1 iteration.

mercurial