diff options
author | bd-912 <bdunahu@colostate.edu> | 2024-04-27 15:13:19 -0600 |
---|---|---|
committer | bd-912 <bdunahu@colostate.edu> | 2024-04-27 15:13:19 -0600 |
commit | 52ee644979315eb566949629a9e301bd9db70656 (patch) | |
tree | dc6628ecd63137d4aa1b1c67f759774e1eea667c /vaporize | |
parent | c1d57f46c0eb74fbea90db8df8b42dc3ac8c31d5 (diff) |
RevisterAlloc Fixed expired intervals not removed from active
Diffstat (limited to 'vaporize')
-rw-r--r-- | vaporize/RegisterAlloc.java | 105 |
1 files changed, 57 insertions, 48 deletions
diff --git a/vaporize/RegisterAlloc.java b/vaporize/RegisterAlloc.java index 4b956d0..ae5826b 100644 --- a/vaporize/RegisterAlloc.java +++ b/vaporize/RegisterAlloc.java @@ -9,63 +9,72 @@ public class RegisterAlloc { private String[] all_registers; private Stack<String> free_registers; private TreeSet<LIRVar> active; - + public RegisterAlloc(LIRDict intervals, String[] all_registers) { - this.intervals = intervals; - this.all_registers = all_registers; - this.free_registers = new Stack<String>(); - this.free_registers.addAll(Arrays.asList(this.all_registers)); - this.active = new TreeSet<LIRVar>((v1, v2) -> { - int ret; - if (v1.getLastUse() > v2.getLastUse()) - ret = 1; - else if (v1.getLastUse() < v2.getLastUse()) - ret = -1; - else if (v1.equals(v2)) - ret = 0; - else - ret = 1; - return ret; - }); + this.intervals = intervals; + this.all_registers = all_registers; + this.free_registers = new Stack<String>(); + this.free_registers.addAll(Arrays.asList(this.all_registers)); + this.active = new TreeSet<LIRVar>((v1, v2) -> { + int ret; + if (v1.getLastUse() > v2.getLastUse()) + ret = 1; + else if (v1.getLastUse() < v2.getLastUse()) + ret = -1; + else if (v1.equals(v2)) + ret = 0; + else + ret = 1; + return ret; + }); - MinimalLogger.info(String.format("Starting allocation with registers %s", - this.free_registers.toString())); + MinimalLogger.info(String.format("Starting allocation with registers %s", + this.free_registers.toString())); - String register; - for (LIRVar interval : this.intervals.getIntervals()) { - this.expireOldIntervals(interval); - if (this.active.size() >= this.all_registers.length) - this.spillAtInterval(interval); - else { - register = this.free_registers.pop(); - interval.assignRegister(register); - this.active.add(interval); - MinimalLogger.info(String.format("Assigning register %s to %s.", - register, - interval.toString())); + String register; + for (LIRVar interval : this.intervals.getIntervals()) { + this.expireOldIntervals(interval); + if (this.active.size() >= this.all_registers.length) + this.spillAtInterval(interval); + else { + register = this.free_registers.pop(); + interval.assignRegister(register); + this.active.add(interval); + MinimalLogger.info(String.format("Assigning register %s to %s.", + register, + interval.toString())); - } - } + } + } } private void expireOldIntervals(LIRVar interval) { - for (LIRVar active : new TreeSet<LIRVar>(this.active)) { - if (active.getLastUse() >= interval.getFirstDef()) - return; - MinimalLogger.info("Register " + active.getAssignedRegister() + " expired!"); - this.active.remove(active); - this.free_registers.push(active.getAssignedRegister()); - } + // MinimalLogger.info(String.format("Active: %s", + // this.active.toString())); + // MinimalLogger.info(String.format("Available: %s", + // this.free_registers.toString())); + + Iterator<LIRVar> iterator = this.active.iterator(); + while (iterator.hasNext()) { + LIRVar active = iterator.next(); + if (active.getLastUse() >= interval.getFirstDef()) + return; + MinimalLogger.info(String.format("%s register %s expired!", + active.toString(), + active.getAssignedRegister())); + iterator.remove(); // Remove the element from the original active set + this.free_registers.push(active.getAssignedRegister()); + } } private void spillAtInterval(LIRVar interval) { - MinimalLogger.severe(String.format("Ran out of free registers, but a spill for %s was not performed!", - interval.toString())); - this.intervals.addSpilledNum(); - // LIRVar spill = this.active.get(this.active.length()-1); - // if (spill.getLastUse() > interval.getLastUse()) { - // ; - // } + MinimalLogger.severe(String.format("Ran out of free registers, but a spill for %s was not performed!", + interval.toString())); + this.intervals.addSpilledNum(); + // LIRVar spill = this.active.get(this.active.length()-1); + // if (spill.getLastUse() > interval.getLastUse()) { + // ; + // } } - + } |