mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-09-08 17:54:40 +00:00
Implemented Control flow Graph Sequence Planner. Implemented working flipper.
This commit is contained in:
parent
01a26b4710
commit
b25be31ba1
@ -12,6 +12,7 @@ public class ControlFlowGraph {
|
|||||||
private Map<Symbol, ControlFlowBlock> blocks;
|
private Map<Symbol, ControlFlowBlock> blocks;
|
||||||
|
|
||||||
private ControlFlowBlock firstBlock;
|
private ControlFlowBlock firstBlock;
|
||||||
|
private List<ControlFlowBlock> sequence;
|
||||||
|
|
||||||
public ControlFlowGraph(Map<Symbol, ControlFlowBlock> blocks, ControlFlowBlock firstBlock) {
|
public ControlFlowGraph(Map<Symbol, ControlFlowBlock> blocks, ControlFlowBlock firstBlock) {
|
||||||
this.blocks = blocks;
|
this.blocks = blocks;
|
||||||
@ -77,6 +78,14 @@ public class ControlFlowGraph {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ControlFlowBlock getConditionalSuccessor(ControlFlowBlock block) {
|
||||||
|
if(block.getConditionalSuccessor()!=null) {
|
||||||
|
return blocks.get(block.getConditionalSuccessor());
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<ControlFlowBlock> getPredecessors(ControlFlowBlock block) {
|
public List<ControlFlowBlock> getPredecessors(ControlFlowBlock block) {
|
||||||
ArrayList<ControlFlowBlock> predecessorBlocks = new ArrayList<>();
|
ArrayList<ControlFlowBlock> predecessorBlocks = new ArrayList<>();
|
||||||
@ -93,4 +102,13 @@ public class ControlFlowGraph {
|
|||||||
}
|
}
|
||||||
return predecessorBlocks;
|
return predecessorBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setBlockSequence(List<ControlFlowBlock> sequence) {
|
||||||
|
this.sequence = sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ControlFlowBlock> getBlockSequence() {
|
||||||
|
return sequence;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
44
src/dk/camelot64/kickc/icl/Pass3BlockSequencePlanner.java
Normal file
44
src/dk/camelot64/kickc/icl/Pass3BlockSequencePlanner.java
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package dk.camelot64.kickc.icl;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
/** Plan the optimal sequence for the blocks of the control flow graph */
|
||||||
|
public class Pass3BlockSequencePlanner {
|
||||||
|
|
||||||
|
private ControlFlowGraph controlFlowGraph;
|
||||||
|
private Scope programScope;
|
||||||
|
|
||||||
|
public Pass3BlockSequencePlanner(ControlFlowGraph controlFlowGraph, Scope programScope) {
|
||||||
|
this.controlFlowGraph = controlFlowGraph;
|
||||||
|
this.programScope = programScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void plan() {
|
||||||
|
Stack<ControlFlowBlock> todo = new Stack<>();
|
||||||
|
todo.push(controlFlowGraph.getFirstBlock());
|
||||||
|
List<ControlFlowBlock> sequence = new ArrayList<>();
|
||||||
|
while(!todo.empty()){
|
||||||
|
ControlFlowBlock block = todo.pop();
|
||||||
|
if(block==null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(sequence.contains(block)) {
|
||||||
|
// already handled - move on
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sequence.add(block);
|
||||||
|
if(block.getCallSuccessor()!=null) {
|
||||||
|
todo.push(controlFlowGraph.getCallSuccessor(block));
|
||||||
|
}
|
||||||
|
if(block.getConditionalSuccessor()!=null) {
|
||||||
|
todo.push(controlFlowGraph.getConditionalSuccessor(block));
|
||||||
|
}
|
||||||
|
if(controlFlowGraph.getDefaultSuccessor(block)!=null) {
|
||||||
|
todo.push(controlFlowGraph.getDefaultSuccessor(block));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
controlFlowGraph.setBlockSequence(sequence);
|
||||||
|
}
|
||||||
|
}
|
@ -19,7 +19,7 @@ public class Pass3CodeGeneration {
|
|||||||
|
|
||||||
public AsmProgram generate() {
|
public AsmProgram generate() {
|
||||||
AsmProgram asm = new AsmProgram();
|
AsmProgram asm = new AsmProgram();
|
||||||
for (ControlFlowBlock block : graph.getAllBlocks()) {
|
for (ControlFlowBlock block : graph.getBlockSequence()) {
|
||||||
// Generate entry points (if needed)
|
// Generate entry points (if needed)
|
||||||
genBlockEntryPoints(asm, block);
|
genBlockEntryPoints(asm, block);
|
||||||
// Generate label
|
// Generate label
|
||||||
|
@ -45,11 +45,11 @@ public class Pass3RegisterAllocation {
|
|||||||
allocation.allocate(symbols.getVariable("ptr#1"), new RegisterAllocation.RegisterZpPointerByte(135));
|
allocation.allocate(symbols.getVariable("ptr#1"), new RegisterAllocation.RegisterZpPointerByte(135));
|
||||||
allocation.allocate(symbols.getVariable("ptr#2"), new RegisterAllocation.RegisterZpPointerByte(135));
|
allocation.allocate(symbols.getVariable("ptr#2"), new RegisterAllocation.RegisterZpPointerByte(135));
|
||||||
allocation.allocate(symbols.getVariable("ptr#3"), new RegisterAllocation.RegisterZpPointerByte(135));
|
allocation.allocate(symbols.getVariable("ptr#3"), new RegisterAllocation.RegisterZpPointerByte(135));
|
||||||
allocation.allocate(symbols.getVariable("v#1"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("v#1"), new RegisterAllocation.RegisterAByte());
|
||||||
allocation.allocate(symbols.getVariable("v#2"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("v#2"), new RegisterAllocation.RegisterAByte());
|
||||||
allocation.allocate(symbols.getVariable("v#3"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("v#3"), new RegisterAllocation.RegisterAByte());
|
||||||
allocation.allocate(symbols.getVariable("v#4"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("v#4"), new RegisterAllocation.RegisterAByte());
|
||||||
allocation.allocate(symbols.getVariable("v#5"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("v#5"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("$0"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$0"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("$2"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$2"), new RegisterAllocation.RegisterAByte());
|
||||||
//allocation.allocate(symbols.getVariable("$3"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("$3"), new RegisterAllocation.RegisterAByte());
|
||||||
@ -62,7 +62,8 @@ public class Pass3RegisterAllocation {
|
|||||||
//allocation.allocate(symbols.getVariable("bv#0"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("bv#0"), new RegisterAllocation.RegisterAByte());
|
||||||
allocation.allocate(symbols.getVariable("sum::b#0"), new RegisterAllocation.RegisterAByte());
|
allocation.allocate(symbols.getVariable("sum::b#0"), new RegisterAllocation.RegisterAByte());
|
||||||
allocation.allocate(symbols.getVariable("inc::b#1"), new RegisterAllocation.RegisterAByte());
|
allocation.allocate(symbols.getVariable("inc::b#1"), new RegisterAllocation.RegisterAByte());
|
||||||
allocation.allocate(symbols.getVariable("a#0"), new RegisterAllocation.RegisterAByte());
|
//allocation.allocate(symbols.getVariable("a#1"), new RegisterAllocation.RegisterAByte());
|
||||||
|
//allocation.allocate(symbols.getVariable("a#0"), new RegisterAllocation.RegisterAByte());
|
||||||
symbols.setAllocation(allocation);
|
symbols.setAllocation(allocation);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,6 @@ public class Main {
|
|||||||
optimizations.add(new Pass2SelfPhiElimination(controlFlowGraph, programScope));
|
optimizations.add(new Pass2SelfPhiElimination(controlFlowGraph, programScope));
|
||||||
optimizations.add(new Pass2ConditionalJumpSimplification(controlFlowGraph, programScope));
|
optimizations.add(new Pass2ConditionalJumpSimplification(controlFlowGraph, programScope));
|
||||||
|
|
||||||
|
|
||||||
boolean ssaOptimized = true;
|
boolean ssaOptimized = true;
|
||||||
while (ssaOptimized) {
|
while (ssaOptimized) {
|
||||||
ssaOptimized = false;
|
ssaOptimized = false;
|
||||||
@ -85,6 +84,8 @@ public class Main {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Pass3BlockSequencePlanner pass3BlockSequencePlanner = new Pass3BlockSequencePlanner(controlFlowGraph, programScope);
|
||||||
|
pass3BlockSequencePlanner.plan();
|
||||||
Pass3RegisterAllocation pass3RegisterAllocation = new Pass3RegisterAllocation(controlFlowGraph, programScope);
|
Pass3RegisterAllocation pass3RegisterAllocation = new Pass3RegisterAllocation(controlFlowGraph, programScope);
|
||||||
pass3RegisterAllocation.allocate();
|
pass3RegisterAllocation.allocate();
|
||||||
Pass3CodeGeneration pass3CodeGeneration = new Pass3CodeGeneration(controlFlowGraph, programScope);
|
Pass3CodeGeneration pass3CodeGeneration = new Pass3CodeGeneration(controlFlowGraph, programScope);
|
||||||
|
Loading…
Reference in New Issue
Block a user