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. |