@@ -576,12 +576,13 @@ void SuperWord::find_adjacent_refs() {
576
576
}
577
577
578
578
Node_List align_to_refs;
579
+ int max_idx;
579
580
int best_iv_adjustment = 0 ;
580
581
MemNode* best_align_to_mem_ref = NULL ;
581
582
582
583
while (memops.size () != 0 ) {
583
584
// Find a memory reference to align to.
584
- MemNode* mem_ref = find_align_to_ref (memops);
585
+ MemNode* mem_ref = find_align_to_ref (memops, max_idx );
585
586
if (mem_ref == NULL ) break ;
586
587
align_to_refs.push (mem_ref);
587
588
int iv_adjustment = get_iv_adjustment (mem_ref);
@@ -699,34 +700,40 @@ void SuperWord::find_adjacent_refs() {
699
700
// Put memory ops from remaining packs back on memops list for
700
701
// the best alignment search.
701
702
uint orig_msize = memops.size ();
702
- if (_packset.length () == 1 && orig_msize == 0 ) {
703
- // If there are no remaining memory ops and only 1 pack we have only one choice
704
- // for the alignment
705
- Node_List* p = _packset.at (0 );
706
- assert (p->size () > 0 , " sanity" );
703
+ for (int i = 0 ; i < _packset.length (); i++) {
704
+ Node_List* p = _packset.at (i);
707
705
MemNode* s = p->at (0 )->as_Mem ();
708
706
assert (!same_velt_type (s, mem_ref), " sanity" );
709
- best_align_to_mem_ref = s;
710
- } else {
711
- for (int i = 0 ; i < _packset.length (); i++) {
712
- Node_List* p = _packset.at (i);
713
- MemNode* s = p->at (0 )->as_Mem ();
714
- assert (!same_velt_type (s, mem_ref), " sanity" );
715
- memops.push (s);
707
+ memops.push (s);
708
+ }
709
+ best_align_to_mem_ref = find_align_to_ref (memops, max_idx);
710
+ if (best_align_to_mem_ref == NULL ) {
711
+ if (TraceSuperWord) {
712
+ tty->print_cr (" SuperWord::find_adjacent_refs(): best_align_to_mem_ref == NULL" );
716
713
}
717
- best_align_to_mem_ref = find_align_to_ref (memops);
718
- if (best_align_to_mem_ref == NULL ) {
719
- if (TraceSuperWord) {
720
- tty->print_cr (" SuperWord::find_adjacent_refs(): best_align_to_mem_ref == NULL" );
714
+ // best_align_to_mem_ref will be used for adjusting the pre-loop limit in
715
+ // SuperWord::align_initial_loop_index. Find one with the biggest vector size,
716
+ // smallest data size and smallest iv offset from memory ops from remaining packs.
717
+ if (_packset.length () > 0 ) {
718
+ if (orig_msize == 0 ) {
719
+ best_align_to_mem_ref = memops.at (max_idx)->as_Mem ();
720
+ } else {
721
+ for (uint i = 0 ; i < orig_msize; i++) {
722
+ memops.remove (0 );
723
+ }
724
+ best_align_to_mem_ref = find_align_to_ref (memops, max_idx);
725
+ assert (best_align_to_mem_ref == NULL , " sanity" );
726
+ best_align_to_mem_ref = memops.at (max_idx)->as_Mem ();
721
727
}
722
- break ;
728
+ assert (best_align_to_mem_ref != NULL , " sanity " ) ;
723
729
}
724
- best_iv_adjustment = get_iv_adjustment (best_align_to_mem_ref);
725
- NOT_PRODUCT (find_adjacent_refs_trace_1 (best_align_to_mem_ref, best_iv_adjustment);)
726
- // Restore list.
727
- while (memops.size () > orig_msize)
728
- (void )memops.pop ();
730
+ break ;
729
731
}
732
+ best_iv_adjustment = get_iv_adjustment (best_align_to_mem_ref);
733
+ NOT_PRODUCT (find_adjacent_refs_trace_1 (best_align_to_mem_ref, best_iv_adjustment);)
734
+ // Restore list.
735
+ while (memops.size () > orig_msize)
736
+ (void )memops.pop ();
730
737
}
731
738
} // unaligned memory accesses
732
739
@@ -761,7 +768,7 @@ void SuperWord::find_adjacent_refs_trace_1(Node* best_align_to_mem_ref, int best
761
768
// Find a memory reference to align the loop induction variable to.
762
769
// Looks first at stores then at loads, looking for a memory reference
763
770
// with the largest number of references similar to it.
764
- MemNode* SuperWord::find_align_to_ref (Node_List &memops) {
771
+ MemNode* SuperWord::find_align_to_ref (Node_List &memops, int &idx ) {
765
772
GrowableArray<int > cmp_ct (arena (), memops.size (), memops.size (), 0 );
766
773
767
774
// Count number of comparable memory ops
@@ -848,6 +855,7 @@ MemNode* SuperWord::find_align_to_ref(Node_List &memops) {
848
855
}
849
856
#endif
850
857
858
+ idx = max_idx;
851
859
if (max_ct > 0 ) {
852
860
#ifdef ASSERT
853
861
if (TraceSuperWord) {
0 commit comments