@@ -558,35 +558,28 @@ void PhaseChaitin::post_allocate_copy_removal() {
558
558
}
559
559
}
560
560
561
-
562
561
// Extract Node_List mappings. If 'freed' is non-zero, we just popped
563
562
// 'freed's blocks off the list
564
- Node_List ®nd = *(free_list.is_empty () ? new Node_List () : free_list.pop ());
565
- Node_List &value = *(free_list.is_empty () ? new Node_List () : free_list.pop ());
563
+ Node_List ®nd = *(free_list.is_empty () ? new Node_List (_max_reg ) : free_list.pop ());
564
+ Node_List &value = *(free_list.is_empty () ? new Node_List (_max_reg ) : free_list.pop ());
566
565
assert ( !freed || blk2value[freed->_pre_order ] == &value, " " );
567
- value.map (_max_reg,NULL );
568
- regnd.map (_max_reg,NULL );
569
566
// Set mappings as OUR mappings
570
567
blk2value[block->_pre_order ] = &value;
571
568
blk2regnd[block->_pre_order ] = ®nd;
572
569
573
570
// Initialize value & regnd for this block
574
571
if (missing_some_inputs) {
575
- // Some predecessor has not yet been visited; zap map to empty
576
- for (uint k = 0 ; k < (uint)_max_reg; k++ ) {
577
- value.map (k, NULL );
578
- regnd.map (k, NULL );
572
+ // Some predecessor has not yet been visited; zap map to empty if necessary
573
+ if (freed ) {
574
+ value.clear ( );
575
+ regnd.clear ( );
579
576
}
580
577
} else {
581
- if ( !freed ) { // Didn't get a freebie prior block
578
+ if ( !freed) { // Didn't get a freebie prior block
582
579
// Must clone some data
583
580
freed = _cfg.get_block_for_node (block->pred (1 ));
584
- Node_List &f_value = *blk2value[freed->_pre_order ];
585
- Node_List &f_regnd = *blk2regnd[freed->_pre_order ];
586
- for ( uint k = 0 ; k < (uint)_max_reg; k++ ) {
587
- value.map (k,f_value[k]);
588
- regnd.map (k,f_regnd[k]);
589
- }
581
+ value.copy (*blk2value[freed->_pre_order ]);
582
+ regnd.copy (*blk2regnd[freed->_pre_order ]);
590
583
}
591
584
// Merge all inputs together, setting to NULL any conflicts.
592
585
for (j = 1 ; j < block->num_preds (); j++) {
@@ -595,10 +588,10 @@ void PhaseChaitin::post_allocate_copy_removal() {
595
588
continue ; // Did self already via freelist
596
589
}
597
590
Node_List &p_regnd = *blk2regnd[pb->_pre_order ];
598
- for ( uint k = 0 ; k < (uint)_max_reg; k++ ) {
599
- if ( regnd[k] != p_regnd[k] ) { // Conflict on reaching defs?
600
- value.map (k,NULL ); // Then no value handy
601
- regnd.map (k,NULL );
591
+ for ( uint k = 0 ; k < (uint)_max_reg; k++) {
592
+ if ( regnd[k] != p_regnd[k]) { // Conflict on reaching defs?
593
+ value.map (k, NULL ); // Then no value handy
594
+ regnd.map (k, NULL );
602
595
}
603
596
}
604
597
}
@@ -634,14 +627,14 @@ void PhaseChaitin::post_allocate_copy_removal() {
634
627
// can lead to situations where some uses are from the old and some from
635
628
// the new values. Not illegal by itself but throws the over-strong
636
629
// assert in scheduling.
637
- if ( pidx ) {
638
- value.map (preg,phi);
639
- regnd.map (preg,phi);
630
+ if ( pidx) {
631
+ value.map (preg, phi);
632
+ regnd.map (preg, phi);
640
633
int n_regs = RegMask::num_registers (phi->ideal_reg (), lrgs (pidx));
641
634
for (int l = 1 ; l < n_regs; l++) {
642
635
OptoReg::Name preg_lo = OptoReg::add (preg,-l);
643
- value.map (preg_lo,phi);
644
- regnd.map (preg_lo,phi);
636
+ value.map (preg_lo, phi);
637
+ regnd.map (preg_lo, phi);
645
638
}
646
639
}
647
640
}
0 commit comments