665 } else { |
665 } else { |
666 return false; |
666 return false; |
667 } |
667 } |
668 } |
668 } |
669 |
669 |
670 #ifdef _LP64 |
|
671 static bool merge_point_safe(Node* region) { |
670 static bool merge_point_safe(Node* region) { |
672 // 4799512: Stop split_if_with_blocks from splitting a block with a ConvI2LNode |
671 // 4799512: Stop split_if_with_blocks from splitting a block with a ConvI2LNode |
673 // having a PhiNode input. This sidesteps the dangerous case where the split |
672 // having a PhiNode input. This sidesteps the dangerous case where the split |
674 // ConvI2LNode may become TOP if the input Value() does not |
673 // ConvI2LNode may become TOP if the input Value() does not |
675 // overlap the ConvI2L range, leaving a node which may not dominate its |
674 // overlap the ConvI2L range, leaving a node which may not dominate its |
676 // uses. |
675 // uses. |
677 // A better fix for this problem can be found in the BugTraq entry, but |
676 // A better fix for this problem can be found in the BugTraq entry, but |
678 // expediency for Mantis demands this hack. |
677 // expediency for Mantis demands this hack. |
|
678 // 6855164: If the merge point has a FastLockNode with a PhiNode input, we stop |
|
679 // split_if_with_blocks from splitting a block because we could not move around |
|
680 // the FastLockNode. |
679 for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) { |
681 for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) { |
680 Node* n = region->fast_out(i); |
682 Node* n = region->fast_out(i); |
681 if (n->is_Phi()) { |
683 if (n->is_Phi()) { |
682 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) { |
684 for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) { |
683 Node* m = n->fast_out(j); |
685 Node* m = n->fast_out(j); |
684 if (m->Opcode() == Op_ConvI2L) { |
686 if (m->is_FastLock()) |
685 return false; |
687 return false; |
686 } |
688 #ifdef _LP64 |
|
689 if (m->Opcode() == Op_ConvI2L) |
|
690 return false; |
|
691 #endif |
687 } |
692 } |
688 } |
693 } |
689 } |
694 } |
690 return true; |
695 return true; |
691 } |
696 } |
692 #endif |
|
693 |
697 |
694 |
698 |
695 //------------------------------place_near_use--------------------------------- |
699 //------------------------------place_near_use--------------------------------- |
696 // Place some computation next to use but not inside inner loops. |
700 // Place some computation next to use but not inside inner loops. |
697 // For inner loop uses move it to the preheader area. |
701 // For inner loop uses move it to the preheader area. |
769 IdealLoopTree *n_loop = get_loop(n_ctrl); |
773 IdealLoopTree *n_loop = get_loop(n_ctrl); |
770 for( uint j = 1; j < n_ctrl->req(); j++ ) |
774 for( uint j = 1; j < n_ctrl->req(); j++ ) |
771 if( get_loop(n_ctrl->in(j)) != n_loop ) |
775 if( get_loop(n_ctrl->in(j)) != n_loop ) |
772 return; |
776 return; |
773 |
777 |
774 #ifdef _LP64 |
|
775 // Check for safety of the merge point. |
778 // Check for safety of the merge point. |
776 if( !merge_point_safe(n_ctrl) ) { |
779 if( !merge_point_safe(n_ctrl) ) { |
777 return; |
780 return; |
778 } |
781 } |
779 #endif |
|
780 |
782 |
781 // Split compare 'n' through the merge point if it is profitable |
783 // Split compare 'n' through the merge point if it is profitable |
782 Node *phi = split_thru_phi( n, n_ctrl, policy ); |
784 Node *phi = split_thru_phi( n, n_ctrl, policy ); |
783 if( !phi ) return; |
785 if( !phi ) return; |
784 |
786 |