@@ -591,7 +591,7 @@ pub struct Liveness {
591
591
ir : @IrMaps ,
592
592
s : Specials ,
593
593
successors : @RefCell < ~[ LiveNode ] > ,
594
- users : @mut ~[ Users ] ,
594
+ users : @RefCell < ~[ Users ] > ,
595
595
// The list of node IDs for the nested loop scopes
596
596
// we're in.
597
597
loop_scope : @RefCell < ~[ NodeId ] > ,
@@ -609,9 +609,9 @@ fn Liveness(ir: @IrMaps, specials: Specials) -> Liveness {
609
609
s : specials,
610
610
successors : @RefCell :: new ( vec:: from_elem ( ir. num_live_nodes . get ( ) ,
611
611
invalid_node ( ) ) ) ,
612
- users : @mut vec:: from_elem ( ir. num_live_nodes . get ( ) *
613
- ir. num_vars . get ( ) ,
614
- invalid_users ( ) ) ,
612
+ users : @RefCell :: new ( vec:: from_elem ( ir. num_live_nodes . get ( ) *
613
+ ir. num_vars . get ( ) ,
614
+ invalid_users ( ) ) ) ,
615
615
loop_scope : @RefCell :: new ( ~[ ] ) ,
616
616
break_ln : @RefCell :: new ( HashMap :: new ( ) ) ,
617
617
cont_ln : @RefCell :: new ( HashMap :: new ( ) ) ,
@@ -685,7 +685,8 @@ impl Liveness {
685
685
pub fn live_on_entry ( & self , ln : LiveNode , var : Variable )
686
686
-> Option < LiveNodeKind > {
687
687
assert ! ( ln. is_valid( ) ) ;
688
- let reader = self . users [ self . idx ( ln, var) ] . reader ;
688
+ let users = self . users . borrow ( ) ;
689
+ let reader = users. get ( ) [ self . idx ( ln, var) ] . reader ;
689
690
if reader. is_valid ( ) { Some ( self . ir . lnk ( reader) ) } else { None }
690
691
}
691
692
@@ -703,13 +704,15 @@ impl Liveness {
703
704
704
705
pub fn used_on_entry ( & self , ln : LiveNode , var : Variable ) -> bool {
705
706
assert ! ( ln. is_valid( ) ) ;
706
- self . users [ self . idx ( ln, var) ] . used
707
+ let users = self . users . borrow ( ) ;
708
+ users. get ( ) [ self . idx ( ln, var) ] . used
707
709
}
708
710
709
711
pub fn assigned_on_entry ( & self , ln : LiveNode , var : Variable )
710
712
-> Option < LiveNodeKind > {
711
713
assert ! ( ln. is_valid( ) ) ;
712
- let writer = self . users [ self . idx ( ln, var) ] . writer ;
714
+ let users = self . users . borrow ( ) ;
715
+ let writer = users. get ( ) [ self . idx ( ln, var) ] . writer ;
713
716
if writer. is_valid ( ) { Some ( self . ir . lnk ( writer) ) } else { None }
714
717
}
715
718
@@ -788,9 +791,10 @@ impl Liveness {
788
791
* ln,
789
792
lnks. get( ) [ * ln] ) ;
790
793
}
791
- self . write_vars ( wr, ln, |idx| self . users [ idx] . reader ) ;
794
+ let users = self . users . borrow ( ) ;
795
+ self . write_vars ( wr, ln, |idx| users. get ( ) [ idx] . reader ) ;
792
796
write ! ( wr, " writes" ) ;
793
- self . write_vars ( wr, ln, |idx| self . users [ idx] . writer ) ;
797
+ self . write_vars ( wr, ln, |idx| users. get ( ) [ idx] . writer ) ;
794
798
let successor = {
795
799
let successors = self . successors . borrow ( ) ;
796
800
successors. get ( ) [ * ln]
@@ -823,7 +827,8 @@ impl Liveness {
823
827
}
824
828
825
829
self . indices2 ( ln, succ_ln, |idx, succ_idx| {
826
- self . users [ idx] = self . users [ succ_idx]
830
+ let mut users = self . users . borrow_mut ( ) ;
831
+ users. get ( ) [ idx] = users. get ( ) [ succ_idx]
827
832
} ) ;
828
833
debug ! ( "init_from_succ(ln={}, succ={})" ,
829
834
self . ln_str( ln) , self . ln_str( succ_ln) ) ;
@@ -838,13 +843,13 @@ impl Liveness {
838
843
839
844
let mut changed = false ;
840
845
self . indices2 ( ln, succ_ln, |idx, succ_idx| {
841
- let users = & mut * self . users ;
842
- changed |= copy_if_invalid ( users[ succ_idx] . reader ,
843
- & mut users[ idx] . reader ) ;
844
- changed |= copy_if_invalid ( users[ succ_idx] . writer ,
845
- & mut users[ idx] . writer ) ;
846
- if users[ succ_idx] . used && !users[ idx] . used {
847
- users[ idx] . used = true ;
846
+ let mut users = self . users . borrow_mut ( ) ;
847
+ changed |= copy_if_invalid ( users. get ( ) [ succ_idx] . reader ,
848
+ & mut users. get ( ) [ idx] . reader ) ;
849
+ changed |= copy_if_invalid ( users. get ( ) [ succ_idx] . writer ,
850
+ & mut users. get ( ) [ idx] . writer ) ;
851
+ if users. get ( ) [ succ_idx] . used && !users. get ( ) [ idx] . used {
852
+ users. get ( ) [ idx] . used = true ;
848
853
changed = true ;
849
854
}
850
855
} ) ;
@@ -869,8 +874,9 @@ impl Liveness {
869
874
// this) so we just clear out all the data.
870
875
pub fn define ( & self , writer : LiveNode , var : Variable ) {
871
876
let idx = self . idx ( writer, var) ;
872
- self . users [ idx] . reader = invalid_node ( ) ;
873
- self . users [ idx] . writer = invalid_node ( ) ;
877
+ let mut users = self . users . borrow_mut ( ) ;
878
+ users. get ( ) [ idx] . reader = invalid_node ( ) ;
879
+ users. get ( ) [ idx] . writer = invalid_node ( ) ;
874
880
875
881
debug ! ( "{} defines {} (idx={}): {}" , writer. to_str( ) , var. to_str( ) ,
876
882
idx, self . ln_str( writer) ) ;
@@ -879,8 +885,8 @@ impl Liveness {
879
885
// Either read, write, or both depending on the acc bitset
880
886
pub fn acc ( & self , ln : LiveNode , var : Variable , acc : uint ) {
881
887
let idx = self . idx ( ln, var) ;
882
- let users = & mut * self . users ;
883
- let user = & mut users[ idx] ;
888
+ let mut users = self . users . borrow_mut ( ) ;
889
+ let user = & mut users. get ( ) [ idx] ;
884
890
885
891
if ( acc & ACC_WRITE ) != 0 {
886
892
user. reader = invalid_node ( ) ;
0 commit comments