rework LivenessAnalysis
This commit is contained in:
@ -76,6 +76,10 @@ public final class DataFlowGraph implements Iterable<DataFlowNode> {
|
|||||||
.findFirst();
|
.findFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static DataFlowGraph copy(DataFlowGraph dataFlowGraph) {
|
||||||
|
return new DataFlowGraph(new ArrayList<>(dataFlowGraph.dataFlowNodes));
|
||||||
|
}
|
||||||
|
|
||||||
public int indexOf(DataFlowNode node) {
|
public int indexOf(DataFlowNode node) {
|
||||||
return this.dataFlowNodes.indexOf(node);
|
return this.dataFlowNodes.indexOf(node);
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,9 @@ import codegen.analysis.dataflow.DataFlowGraph;
|
|||||||
import codegen.analysis.dataflow.DataFlowNode;
|
import codegen.analysis.dataflow.DataFlowNode;
|
||||||
import util.Logger;
|
import util.Logger;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public final class LivenessAnalysis {
|
public final class LivenessAnalysis {
|
||||||
|
|
||||||
@ -16,57 +16,54 @@ public final class LivenessAnalysis {
|
|||||||
this.interferenceGraph = interferenceGraph;
|
this.interferenceGraph = interferenceGraph;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LivenessAnalysis fromDataFlowGraph(DataFlowGraph graph, Map<String, Integer> varMap) {
|
public static LivenessAnalysis fromDataFlowGraph(DataFlowGraph dataFlowGraph, Map<String, Integer> varMap) {
|
||||||
calculateLivenessInOut(graph); // TODO: Copy the graph
|
final DataFlowGraph livenessDataFlowGraph = DataFlowGraph.copy(dataFlowGraph);
|
||||||
|
|
||||||
return new LivenessAnalysis(InterferenceGraph.fromDataFlowGraph(graph, varMap));
|
calculateLivenessInOut(livenessDataFlowGraph);
|
||||||
|
|
||||||
|
return new LivenessAnalysis(InterferenceGraph.fromDataFlowGraph(livenessDataFlowGraph, varMap));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void calculateLivenessInOut(DataFlowGraph graph) {
|
private static void calculateLivenessInOut(DataFlowGraph dataFlowGraph) {
|
||||||
boolean change;
|
boolean change;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
change = false;
|
change = false;
|
||||||
|
|
||||||
for (DataFlowNode node : graph) {
|
for (DataFlowNode node : dataFlowGraph) {
|
||||||
// TODO: Indexof mega unnötig
|
if (dataFlowGraph.indexOf(node) == dataFlowGraph.size() - 1) {
|
||||||
if (graph.indexOf(node) == graph.size() - 1) {
|
|
||||||
// Skip END
|
// Skip END
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
change = change || updateInOut(node);
|
change = change || updateNodeInOut(node);
|
||||||
}
|
}
|
||||||
} while (change);
|
} while (change);
|
||||||
|
|
||||||
// TODO: Indexof mega unnötig
|
|
||||||
Logger.log("IN, OUT Sets:");
|
|
||||||
for (DataFlowNode node : graph) {
|
|
||||||
Logger.log(graph.indexOf(node) + ": " + node.getInst() + " IN: " + node.getInSet());
|
|
||||||
Logger.log(graph.indexOf(node) + ": " + node.getInst() + " OUT: " + node.getOutSet());
|
|
||||||
}
|
|
||||||
Logger.log("\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean updateInOut(DataFlowNode node) {
|
private static boolean updateNodeInOut(DataFlowNode dataFlowNode) {
|
||||||
boolean change;
|
boolean change;
|
||||||
|
|
||||||
for (DataFlowNode succ : node.getSuccessorSet()) {
|
for (DataFlowNode succ : dataFlowNode.getSuccessorSet()) {
|
||||||
// A variable going live into the successor implies it going live out of the predecessor
|
// A variable going live into the successor implies it going live out of the predecessor
|
||||||
|
|
||||||
node.addOut(succ.getInSet());
|
dataFlowNode.addOut(succ.getInSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
final Set<String> addIN = new HashSet<>(node.getOutSet()); // Copy important
|
final Collection<String> addIN = new HashSet<>(dataFlowNode.getOutSet());
|
||||||
addIN.removeAll(node.getDefSet()); // If a variable that is live-out is defined in the node, it doesn't have to be live-in
|
addIN.removeAll(dataFlowNode.getDefSet()); // If a variable that is live-out is defined in the node, it doesn't have to be live-in
|
||||||
|
|
||||||
change = node.addIn(node.getUseSet()); // A variable being used implies it going in live
|
change = dataFlowNode.addIn(dataFlowNode.getUseSet()); // A variable being used implies it going in live
|
||||||
change = change || node.addIn(addIN); // A variable that is live-out and isn't defined in the node must be live-in
|
change = change || dataFlowNode.addIn(addIN); // A variable that is live-out and isn't defined in the node must be live-in
|
||||||
|
|
||||||
return change;
|
return change;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Führt die Liveness-Analyse auf dem gespeicherten {@link InterferenceGraph} durch.
|
||||||
|
* Die Registeranzahl wird durch naive Färbung des InterferenzGraphen ermittelt.
|
||||||
|
*/
|
||||||
public int doLivenessAnalysis() {
|
public int doLivenessAnalysis() {
|
||||||
final int registers = this.colorInterferenceGraph();
|
final int registers = this.colorInterferenceGraph();
|
||||||
|
|
||||||
@ -86,8 +83,8 @@ public final class LivenessAnalysis {
|
|||||||
currentColor = 1;
|
currentColor = 1;
|
||||||
|
|
||||||
// Get all colors that can't be used
|
// Get all colors that can't be used
|
||||||
final Set<Integer> neighbourColors = new HashSet<>();
|
final Collection<Integer> neighbourColors = new HashSet<>();
|
||||||
for (InterferenceNode neighbour : node.getNeighbours()) {
|
for (InterferenceNode neighbour : node.getNeighbourSet()) {
|
||||||
neighbourColors.add(neighbour.getColor());
|
neighbourColors.add(neighbour.getColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user