summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd-912 <bdunahu@colostate.edu>2024-04-21 01:17:31 -0600
committerbd-912 <bdunahu@colostate.edu>2024-04-21 01:17:31 -0600
commit110b4f031aea36445250d79c7257a57f15fb7b82 (patch)
treeb4c03e84b05a009e1c9b978f13c5887de2b59764
parent04fd097fb51346f655c7bdc0c88b85e29359ef1c (diff)
Fix bugs in LiveInterval, successfully calculate (gapless) LIR
-rw-r--r--cfg/ControlFlowGraph.java4
-rw-r--r--vaporize/library/LIRDict.java32
-rw-r--r--vaporize/library/LIRVar.java10
-rw-r--r--vaporize/library/LIRVisitor.java8
-rw-r--r--vaporize/library/TransientInterval.java3
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);
}
}