diff --git a/src/dk/camelot64/kickc/icl/ControlFlowGraph.java b/src/dk/camelot64/kickc/icl/ControlFlowGraph.java index 3874c3ed3..7dab4b8c2 100644 --- a/src/dk/camelot64/kickc/icl/ControlFlowGraph.java +++ b/src/dk/camelot64/kickc/icl/ControlFlowGraph.java @@ -12,6 +12,7 @@ public class ControlFlowGraph { private Map blocks; private ControlFlowBlock firstBlock; + private List sequence; public ControlFlowGraph(Map blocks, ControlFlowBlock firstBlock) { 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 getPredecessors(ControlFlowBlock block) { ArrayList predecessorBlocks = new ArrayList<>(); @@ -93,4 +102,13 @@ public class ControlFlowGraph { } return predecessorBlocks; } + + public void setBlockSequence(List sequence) { + this.sequence = sequence; + } + + public List getBlockSequence() { + return sequence; + } + } diff --git a/src/dk/camelot64/kickc/icl/Pass3BlockSequencePlanner.java b/src/dk/camelot64/kickc/icl/Pass3BlockSequencePlanner.java new file mode 100644 index 000000000..6f6656934 --- /dev/null +++ b/src/dk/camelot64/kickc/icl/Pass3BlockSequencePlanner.java @@ -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 todo = new Stack<>(); + todo.push(controlFlowGraph.getFirstBlock()); + List 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); + } +} diff --git a/src/dk/camelot64/kickc/icl/Pass3CodeGeneration.java b/src/dk/camelot64/kickc/icl/Pass3CodeGeneration.java index d7e327aa7..3435e460c 100644 --- a/src/dk/camelot64/kickc/icl/Pass3CodeGeneration.java +++ b/src/dk/camelot64/kickc/icl/Pass3CodeGeneration.java @@ -19,7 +19,7 @@ public class Pass3CodeGeneration { public AsmProgram generate() { AsmProgram asm = new AsmProgram(); - for (ControlFlowBlock block : graph.getAllBlocks()) { + for (ControlFlowBlock block : graph.getBlockSequence()) { // Generate entry points (if needed) genBlockEntryPoints(asm, block); // Generate label diff --git a/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java b/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java index 2ccf13596..46bc2e8f0 100644 --- a/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java +++ b/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java @@ -45,11 +45,11 @@ public class Pass3RegisterAllocation { 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#3"), new RegisterAllocation.RegisterZpPointerByte(135)); - allocation.allocate(symbols.getVariable("v#1"), 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#4"), new RegisterAllocation.RegisterAByte()); - allocation.allocate(symbols.getVariable("v#5"), 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#3"), 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("$0"), new RegisterAllocation.RegisterAByte()); //allocation.allocate(symbols.getVariable("$2"), 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("sum::b#0"), 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); } diff --git a/src/dk/camelot64/kickc/test/Main.java b/src/dk/camelot64/kickc/test/Main.java index 5c9942634..e9837db69 100644 --- a/src/dk/camelot64/kickc/test/Main.java +++ b/src/dk/camelot64/kickc/test/Main.java @@ -70,7 +70,6 @@ public class Main { optimizations.add(new Pass2SelfPhiElimination(controlFlowGraph, programScope)); optimizations.add(new Pass2ConditionalJumpSimplification(controlFlowGraph, programScope)); - boolean ssaOptimized = true; while (ssaOptimized) { ssaOptimized = false; @@ -85,6 +84,8 @@ public class Main { } } + Pass3BlockSequencePlanner pass3BlockSequencePlanner = new Pass3BlockSequencePlanner(controlFlowGraph, programScope); + pass3BlockSequencePlanner.plan(); Pass3RegisterAllocation pass3RegisterAllocation = new Pass3RegisterAllocation(controlFlowGraph, programScope); pass3RegisterAllocation.allocate(); Pass3CodeGeneration pass3CodeGeneration = new Pass3CodeGeneration(controlFlowGraph, programScope);