diff options
author | bd-912 <bdunahu@colostate.edu> | 2024-04-21 01:17:31 -0600 |
---|---|---|
committer | bd-912 <bdunahu@colostate.edu> | 2024-04-21 01:17:31 -0600 |
commit | 110b4f031aea36445250d79c7257a57f15fb7b82 (patch) | |
tree | b4c03e84b05a009e1c9b978f13c5887de2b59764 | |
parent | 04fd097fb51346f655c7bdc0c88b85e29359ef1c (diff) |
Fix bugs in LiveInterval, successfully calculate (gapless) LIR
-rw-r--r-- | cfg/ControlFlowGraph.java | 4 | ||||
-rw-r--r-- | vaporize/library/LIRDict.java | 32 | ||||
-rw-r--r-- | vaporize/library/LIRVar.java | 10 | ||||
-rw-r--r-- | vaporize/library/LIRVisitor.java | 8 | ||||
-rw-r--r-- | vaporize/library/TransientInterval.java | 3 |
5 files changed, 40 insertions, 17 deletions
diff --git a/cfg/ControlFlowGraph.java b/cfg/ControlFlowGraph.java index c8a7f16..274482b 100644 --- a/cfg/ControlFlowGraph.java +++ b/cfg/ControlFlowGraph.java @@ -82,10 +82,6 @@ public class ControlFlowGraph { source.toString())); } - MinimalLogger.info(String.format("Spilling variables: %s", - source.getReaching().toString())); - dest.reaching.addAll(source.reaching); - return ret; } diff --git a/vaporize/library/LIRDict.java b/vaporize/library/LIRDict.java index b32647c..0725a76 100644 --- a/vaporize/library/LIRDict.java +++ b/vaporize/library/LIRDict.java @@ -1,5 +1,8 @@ package vaporize.library; +import cs132.vapor.ast.VFunction; +import cs132.vapor.ast.VInstr; + import misc.*; import cfg.*; import java.util.*; @@ -7,22 +10,42 @@ import java.util.*; public class LIRDict { private TreeSet<LIRVar> intervals; + private ControlFlowGraph cfg; + + public LIRDict(VFunction f, ControlFlowGraph cfg) { - public LIRDict(ControlFlowGraph cfg) { - this.intervals = new TreeSet<LIRVar>(); + this.intervals = new TreeSet<LIRVar>((v1, v2) -> { + return (v1.compareTo(v2) != 0) ? v1.compareTo(v2) : v1.equals(v2) ? 0 : 1; + }); + this.cfg = cfg; - for (CFGNode n : cfg.getNodes()) { + for (VInstr s : f.body) { + CFGNode n = cfg.getNode(s); int line = n.getInstruction().sourcePos.line; + String info = "L" + line; for (String var : n.getReaching()) - if (!this.contains(var)) + if (!this.contains(var)) { this.intervals.add(new LIRVar(var, line, line)); + MinimalLogger.info(String.format("Reaching on %s --- New var %s", + info, + var)); + } else { + this.getInterval(var).trySetLastUse(line); + MinimalLogger.info(String.format("Reaching on %s --- Updating var %s", + info, + var)); + } for (String var : n.getLiveness()) { if (!this.contains(var)) MinimalLogger.severe(String.format("%s was used before defined!", var)); + MinimalLogger.info(String.format("Liveness on %s --- Updating var %s", + info, + var)); this.getInterval(var).trySetLastUse(line); } + } } @@ -46,4 +69,5 @@ public class LIRDict { return Collections.unmodifiableSortedSet(this.intervals); } + } diff --git a/vaporize/library/LIRVar.java b/vaporize/library/LIRVar.java index 4fab8c8..eb3508b 100644 --- a/vaporize/library/LIRVar.java +++ b/vaporize/library/LIRVar.java @@ -23,10 +23,9 @@ public class LIRVar implements Comparable<LIRVar> { } @Override public boolean equals(Object other) { - LIRVar o; return (other instanceof LIRVar && - ((o = (LIRVar) other)).alias.equals(this.alias) && - o.interval.equals(this.interval)) || + ((LIRVar) other).alias.equals(this.alias) && + ((LIRVar) other).interval.equals(this.interval)) || (other instanceof String && this.alias.equals((String) other)); } @@ -55,6 +54,11 @@ public class LIRVar implements Comparable<LIRVar> { if (ret) this.interval.last_use = last_use; + else + MinimalLogger.info(String.format("Bad order! %s %d >= %d", + this.alias, + this.interval.last_use, + last_use)); return ret; } diff --git a/vaporize/library/LIRVisitor.java b/vaporize/library/LIRVisitor.java index 6d5c79f..a962775 100644 --- a/vaporize/library/LIRVisitor.java +++ b/vaporize/library/LIRVisitor.java @@ -27,7 +27,7 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti ControlFlowGraph cfg = new ControlFlowGraph(f); this.dot_format = ""; - MinimalLogger.info(String.format("CFGSimp is collecting nodes for %s", + MinimalLogger.info(String.format("LIRVisitor is collecting nodes for %s", this.kettle.parseFuncName(f))); for (VCodeLabel s : f.labels) { cfg.addNode(new CFGNode(s)); @@ -37,12 +37,12 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti } - MinimalLogger.info(String.format("CFGSimp is collecting edges for %s", + MinimalLogger.info(String.format("LIRVisitor is collecting edges for %s", this.kettle.parseFuncName(f))); // inital setup // first visit may not find edges; cfg.addEdges will handle - this.curr = new CFGNode(f.body[0]); + this.curr = cfg.getNode(f.body[0]); // cascades downwards --- cfg.addEdges for (VVarRef.Local l : f.params) cfg.addReaching(this.curr, l.ident.toString()); @@ -61,7 +61,7 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti MinimalLogger.info(String.format("Gathering intervals for %s", this.kettle.parseFuncName(f))); - LIRDict lir = new LIRDict(cfg); + LIRDict lir = new LIRDict(f, cfg); this.lirs.add(lir); MinimalLogger.info(String.format("Found intervals: %s", lir.getIntervals().toString())); diff --git a/vaporize/library/TransientInterval.java b/vaporize/library/TransientInterval.java index f72f2bc..faf7637 100644 --- a/vaporize/library/TransientInterval.java +++ b/vaporize/library/TransientInterval.java @@ -15,8 +15,7 @@ class TransientInterval { @Override public boolean equals(Object other) { TransientInterval o; return (other instanceof TransientInterval) && - (((o = (TransientInterval) other)).first_def == this.first_def) && - o.last_use == this.last_use; + (((o = (TransientInterval) other)).first_def == this.first_def); } } |