summaryrefslogtreecommitdiff
path: root/vaporize
diff options
context:
space:
mode:
Diffstat (limited to 'vaporize')
-rw-r--r--vaporize/LIRDict.java49
-rw-r--r--vaporize/LIRVisitor.java78
-rw-r--r--vaporize/VaporizeVisitor.java3
3 files changed, 83 insertions, 47 deletions
diff --git a/vaporize/LIRDict.java b/vaporize/LIRDict.java
index 4f3d3c1..50c79b0 100644
--- a/vaporize/LIRDict.java
+++ b/vaporize/LIRDict.java
@@ -1,5 +1,6 @@
package vaporize;
+import cs132.vapor.ast.VCodeLabel;
import cs132.vapor.ast.VFunction;
import cs132.vapor.ast.VInstr;
@@ -24,29 +25,29 @@ public class LIRDict {
CFGNode n = cfg.getNode(s);
int line = n.getInstruction().sourcePos.line;
+ // reaching
String info = "L" + line;
- for (String var : n.getReaching())
+ for (String var : n.getDefinitions())
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));
+ MinimalLogger.info(String.format("Found def of %s at line %s",
+ var,
+ line));
+ }
+ for (String var : n.getReaching())
+ if (n.getLiveness().contains(var)) {
+ if (this.contains(var)) {
+ this.getInterval(var).trySetLastUse(line);
+ MinimalLogger.info(String.format("Var %s still live on %s",
+ var,
+ line));
+ } else {
+ this.intervals.add(new LIRVar(var, line, line));
+ MinimalLogger.info(String.format("Var %s still live on %s",
+ var,
+ line));
+ }
}
- 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);
- }
-
}
}
@@ -83,4 +84,14 @@ public class LIRDict {
return this.spilled_num;
}
+ private int subOneLine(int i) {
+ int ret = i - 1;
+
+ CFGNode n = cfg.getNode(new Integer(ret));
+ if (n != null && n.getInstruction() instanceof VCodeLabel)
+ --ret;
+
+ return ret;
+ }
+
}
diff --git a/vaporize/LIRVisitor.java b/vaporize/LIRVisitor.java
index da6abb6..821573c 100644
--- a/vaporize/LIRVisitor.java
+++ b/vaporize/LIRVisitor.java
@@ -45,14 +45,39 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
this.curr = cfg.getNode(f.body[0]);
// cascades downwards --- cfg.addEdges
for (VVarRef.Local l : f.params)
- cfg.addReaching(this.curr, l.ident.toString());
+ cfg.addDefinition(this.curr, l.ident.toString());
for (VInstr s : f.body)
s.accept(cfg, this);
+ int line = this.curr.getInstruction().sourcePos.line;
+ int stop = f.body[0].sourcePos.line;
+ MinimalLogger.info(String.format("Looking for liveness from final node %d to %d",
+ line, stop));
+ for (int i = line; i >= stop; --i) {
+ this.curr = cfg.getNode(new Integer(i));
+ for (CFGNode source : this.curr.getSources()) {
+ for (String var : this.curr.getLiveness()) {
+ if (!source.getDefinitions().contains(var)) {
+ // MinimalLogger.info(String.format("%s: %s added to liveness of %s.",
+ // this.curr,
+ // var,
+ // source));
+ source.liveness.add(var);
+ } else {
+ // MinimalLogger.info(String.format("%s: %s was defined in %s.",
+ // this.curr,
+ // var,
+ // source));
+ }
+ }
+ }
+ }
+
MinimalLogger.info(String.format("Spitting out reaching/liveness..."));
for (CFGNode n : cfg.getNodes())
- MinimalLogger.info(String.format("%s ::: %s ::: %s",
+ MinimalLogger.info(String.format("%s ::: %s ::: %s ::: %s",
n.toString(),
+ n.getDefinitions(),
n.getReaching(),
n.getLiveness()));
@@ -96,11 +121,11 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
n.sourcePos.toString()));
///////////////////////////////////////////////////////////////
CFGNode curr = cfg.getNode(n);
+ cfg.addDefinition(curr, n.dest.toString());
+ cfg.addReference(curr, ((VMemRef.Global) n.source).base.toString());
+
this.dot_format += cfg.addEdge(this.curr, curr);
this.curr = curr;
-
- cfg.addReaching(curr, n.dest.toString());
- cfg.addLiveness(curr, ((VMemRef.Global) n.source).base.toString());
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<-%s (\"%s\":%s)",
n.getClass().getSimpleName(),
@@ -116,11 +141,11 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
n.sourcePos.toString()));
///////////////////////////////////////////////////////////////
CFGNode curr = cfg.getNode(n);
+ cfg.addReference(curr, ((VMemRef.Global) n.dest).base.toString());
+ cfg.addReference(curr, n.source.toString());
+
this.dot_format += cfg.addEdge(this.curr, curr);
this.curr = curr;
-
- cfg.addLiveness(curr, ((VMemRef.Global) n.dest).base.toString());
- cfg.addLiveness(curr, n.source.toString());
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<-%s (\"%s\":%s)",
n.getClass().getSimpleName(),
@@ -136,11 +161,11 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
n.sourcePos.toString()));
///////////////////////////////////////////////////////////////
CFGNode curr = cfg.getNode(n);
+ cfg.addDefinition(curr, n.dest.toString());
+ cfg.addReference(curr, n.source.toString());
+
this.dot_format += cfg.addEdge(this.curr, curr);
this.curr = curr;
-
- cfg.addReaching(curr, n.dest.toString());
- cfg.addLiveness(curr, n.source.toString());
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<-%s (\"%s\":%s)",
n.getClass().getSimpleName(),
@@ -156,11 +181,11 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
n.sourcePos.toString()));
///////////////////////////////////////////////////////////////
CFGNode curr = cfg.getNode(n);
+ cfg.addReference(curr, n.value.toString());
+
this.dot_format += cfg.addEdge(this.curr, curr);
this.dot_format += cfg.addEdge(curr, cfg.getNode(new Integer(this.kettle
.findLabelIndex(n.target.toString()))));
-
- cfg.addLiveness(curr, n.value.toString());
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<-%s (\"%s\":%s)",
n.getClass().getSimpleName(),
@@ -197,15 +222,15 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
n.sourcePos.toString()));
///////////////////////////////////////////////////////////////
CFGNode curr = cfg.getNode(n);
- this.dot_format += cfg.addEdge(this.curr, curr);
- this.curr = curr;
-
if (n.dest != null)
- cfg.addReaching(curr, n.dest.toString());
+ cfg.addReference(curr, n.dest.toString());
for (VOperand a : n.args) {
- cfg.addLiveness(curr, a.toString());
+ cfg.addReference(curr, a.toString());
}
- cfg.addLiveness(curr, n.addr.toString());
+ cfg.addReference(curr, n.addr.toString());
+
+ this.dot_format += cfg.addEdge(this.curr, curr);
+ this.curr = curr;
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<-%s (\"%s\":%s)",
n.getClass().getSimpleName(),
@@ -221,14 +246,15 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
n.sourcePos.toString()));
///////////////////////////////////////////////////////////////
CFGNode curr = cfg.getNode(n);
- this.dot_format += cfg.addEdge(this.curr, curr);
- this.curr = curr;
if (n.dest != null)
- cfg.addReaching(curr, n.dest.toString());
+ cfg.addDefinition(curr, n.dest.toString());
for (VOperand a : n.args) {
- cfg.addLiveness(curr, a.toString());
+ cfg.addReference(curr, a.toString());
}
+
+ this.dot_format += cfg.addEdge(this.curr, curr);
+ this.curr = curr;
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<-%s (\"%s\":%s)",
n.getClass().getSimpleName(),
@@ -244,11 +270,11 @@ public class LIRVisitor extends VInstr.VisitorPR<ControlFlowGraph, String, Runti
n.sourcePos.toString()));
///////////////////////////////////////////////////////////////
CFGNode curr = cfg.getNode(n);
+ if (n.value != null)
+ cfg.addReference(curr, n.value.toString());
+
this.dot_format += cfg.addEdge(this.curr, curr);
this.curr = curr;
-
- if (n.value != null)
- cfg.addLiveness(curr, n.value.toString());
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<-%s (\"%s\":%s)",
n.getClass().getSimpleName(),
diff --git a/vaporize/VaporizeVisitor.java b/vaporize/VaporizeVisitor.java
index aa462a5..55340f4 100644
--- a/vaporize/VaporizeVisitor.java
+++ b/vaporize/VaporizeVisitor.java
@@ -263,8 +263,7 @@ public class VaporizeVisitor extends VInstr.VisitorP<LIRDict, RuntimeException>
d.getInterval(n.value.toString()).getAssignedRegister() :
n.value.toString();
this.addVaporm(String.format(" $v0 = %s",
- d.getInterval(((VVarRef.Local) n.value).ident)
- .getAssignedRegister()));
+ reg));
}
for (int j = 0; j < this.callee_save.length; ++j) {
this.addVaporm(String.format(" %s = local[%s]",