From 110b4f031aea36445250d79c7257a57f15fb7b82 Mon Sep 17 00:00:00 2001 From: bd-912 Date: Sun, 21 Apr 2024 01:17:31 -0600 Subject: Fix bugs in LiveInterval, successfully calculate (gapless) LIR --- cfg/ControlFlowGraph.java | 4 ---- vaporize/library/LIRDict.java | 32 ++++++++++++++++++++++++++++---- vaporize/library/LIRVar.java | 10 +++++++--- vaporize/library/LIRVisitor.java | 8 ++++---- 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 intervals; + private ControlFlowGraph cfg; + + public LIRDict(VFunction f, ControlFlowGraph cfg) { - public LIRDict(ControlFlowGraph cfg) { - this.intervals = new TreeSet(); + this.intervals = new TreeSet((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 { } @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 { 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