summaryrefslogtreecommitdiff
path: root/vaporize/library/LIRDict.java
diff options
context:
space:
mode:
Diffstat (limited to 'vaporize/library/LIRDict.java')
-rw-r--r--vaporize/library/LIRDict.java32
1 files changed, 28 insertions, 4 deletions
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);
}
+
}