Skip to content

Commit e4815b6

Browse files
committed
librustc: De-@mut the users list in liveness
1 parent ff23e12 commit e4815b6

File tree

1 file changed

+27
-21
lines changed

1 file changed

+27
-21
lines changed

src/librustc/middle/liveness.rs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ pub struct Liveness {
591591
ir: @IrMaps,
592592
s: Specials,
593593
successors: @RefCell<~[LiveNode]>,
594-
users: @mut ~[Users],
594+
users: @RefCell<~[Users]>,
595595
// The list of node IDs for the nested loop scopes
596596
// we're in.
597597
loop_scope: @RefCell<~[NodeId]>,
@@ -609,9 +609,9 @@ fn Liveness(ir: @IrMaps, specials: Specials) -> Liveness {
609609
s: specials,
610610
successors: @RefCell::new(vec::from_elem(ir.num_live_nodes.get(),
611611
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())),
615615
loop_scope: @RefCell::new(~[]),
616616
break_ln: @RefCell::new(HashMap::new()),
617617
cont_ln: @RefCell::new(HashMap::new()),
@@ -685,7 +685,8 @@ impl Liveness {
685685
pub fn live_on_entry(&self, ln: LiveNode, var: Variable)
686686
-> Option<LiveNodeKind> {
687687
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;
689690
if reader.is_valid() {Some(self.ir.lnk(reader))} else {None}
690691
}
691692

@@ -703,13 +704,15 @@ impl Liveness {
703704

704705
pub fn used_on_entry(&self, ln: LiveNode, var: Variable) -> bool {
705706
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
707709
}
708710

709711
pub fn assigned_on_entry(&self, ln: LiveNode, var: Variable)
710712
-> Option<LiveNodeKind> {
711713
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;
713716
if writer.is_valid() {Some(self.ir.lnk(writer))} else {None}
714717
}
715718

@@ -788,9 +791,10 @@ impl Liveness {
788791
*ln,
789792
lnks.get()[*ln]);
790793
}
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);
792796
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);
794798
let successor = {
795799
let successors = self.successors.borrow();
796800
successors.get()[*ln]
@@ -823,7 +827,8 @@ impl Liveness {
823827
}
824828

825829
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]
827832
});
828833
debug!("init_from_succ(ln={}, succ={})",
829834
self.ln_str(ln), self.ln_str(succ_ln));
@@ -838,13 +843,13 @@ impl Liveness {
838843

839844
let mut changed = false;
840845
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;
848853
changed = true;
849854
}
850855
});
@@ -869,8 +874,9 @@ impl Liveness {
869874
// this) so we just clear out all the data.
870875
pub fn define(&self, writer: LiveNode, var: Variable) {
871876
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();
874880

875881
debug!("{} defines {} (idx={}): {}", writer.to_str(), var.to_str(),
876882
idx, self.ln_str(writer));
@@ -879,8 +885,8 @@ impl Liveness {
879885
// Either read, write, or both depending on the acc bitset
880886
pub fn acc(&self, ln: LiveNode, var: Variable, acc: uint) {
881887
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];
884890

885891
if (acc & ACC_WRITE) != 0 {
886892
user.reader = invalid_node();

0 commit comments

Comments
 (0)