1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-12-20 23:30:43 +00:00

Improved segment generation

This commit is contained in:
jespergravgaard 2017-08-01 20:38:55 +02:00
parent 323e10ab37
commit 14c8ec13bf
17 changed files with 577 additions and 657 deletions

View File

@ -22,7 +22,6 @@ public class Compiler {
Program program = pass1GenerateSSA(file, log);
pass2OptimizeSSA(program);
pass3RegisterAllocation(program);
pass4GenerateAsm(program);
pass5OptimizeAsm(program);
log.append("FINAL SYMBOL TABLE");
@ -57,15 +56,6 @@ public class Compiler {
}
}
public void pass4GenerateAsm(Program program) {
Pass4CodeGeneration pass4CodeGeneration = new Pass4CodeGeneration(program);
pass4CodeGeneration.generate();
program.getLog().append("INITIAL ASM");
program.getLog().append(program.getAsm().toString());
}
private void pass3RegisterAllocation(Program program) {
@ -108,21 +98,28 @@ public class Compiler {
program.getLog().append("NATURAL LOOPS WITH DEPTH");
program.getLog().append(program.getLoopSet().toString());
new Pass3ZeroPageAllocation(program).allocate();
new Pass3VariableRegisterWeightAnalysis(program).findWeights();
program.getLog().append("\nVARIABLE REGISTER WEIGHTS");
program.getLog().append(program.getScope().getSymbolTableContents(program ,Variable.class));
new Pass3ZeroPageAllocation(program).allocate();
new Pass3RegistersFinalize(program).allocate();
new Pass3AssertNoCpuClobber(program).check();
// Initial Code generation
new Pass3CodeGeneration(program).generate();
new Pass3AssertNoCpuClobber(program).check();
program.getLog().append("INITIAL ASM");
program.getLog().append(program.getAsm().toString());
// Register allocation optimization
new Pass3RegisterUplifting(program).uplift();
program.getLog().append("REGISTER UPLIFTING");
program.getLog().append(program.getScope().getSymbolTableContents(program, Variable.class));
new Pass3AssertNoCpuClobber(program).check();
// Final register coalesce and code generation
new Pass3ZeroPageCoalesce(program).allocate();
new Pass3CodeGeneration(program).generate();
new Pass3AssertNoCpuClobber(program).check();
//new Pass3CustomRegisters(program).setRegister();

View File

@ -121,4 +121,18 @@ public class AsmProgram {
}
/**
* Get all segments representing a specific ICL statement
* @param statementIndex The statement index
* @return The ASM segments representing the statement
* */
public Collection<AsmSegment> getSegmentsByStatementIndex(int statementIndex) {
List<AsmSegment> statementSegments = new ArrayList<>();
for (AsmSegment segment : segments) {
if(segment.getStatementIdx()!=null && segment.getStatementIdx()==statementIndex) {
statementSegments.add(segment);
}
}
return statementSegments;
}
}

View File

@ -192,4 +192,20 @@ public class ControlFlowGraph {
return result;
}
/**
* Get a statement from its statement index
* @param statementIdx The statement index
* @return The statement
*/
public Statement getStatementByIndex(int statementIdx) {
for (ControlFlowBlock block : getAllBlocks()) {
for (Statement statement : block.getStatements()) {
if(statementIdx==statement.getIndex()) {
return statement;
}
}
}
return null;
}
}

View File

@ -1,8 +1,7 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.asm.AsmInstruction;
import dk.camelot64.kickc.asm.AsmLine;
import dk.camelot64.kickc.asm.AsmProgram;
import dk.camelot64.kickc.asm.AsmSegment;
import dk.camelot64.kickc.asm.parser.AsmClobber;
import dk.camelot64.kickc.icl.*;
@ -17,52 +16,50 @@ public class Pass3AssertNoCpuClobber extends Pass2Base {
super(program);
}
/** Check that no statement clobbers a CPU register used by an alive variable */
/**
* Check that no statement clobbers a CPU register used by an alive variable
*/
public void check() {
if(hasClobberProblem(true, null)) {
if (hasClobberProblem(true)) {
throw new RuntimeException("CLOBBER ERROR! See log for more info.");
}
}
/**
* Determines whether any statement in the program clobbers a CPU register used by an alive variable
* Determines whether any statement in the ASM program that clobbers a CPU register used by an alive variable
*
* @return true if there is a clobber problem in the program
*/
public boolean hasClobberProblem(boolean verbose, RegisterAllocation.Register register) {
public boolean hasClobberProblem(boolean verbose) {
RegisterAllocation allocation = getProgram().getAllocation();
LiveRangeVariables liveRangeVariables = getProgram().getLiveRangeVariables();
AsmProgram asm = getProgram().getAsm();
boolean clobberProblem = false;
Pass4CodeGeneration.AsmCodegenAluState aluState = new Pass4CodeGeneration.AsmCodegenAluState();
int registerCycles = 0;
for (ControlFlowBlock block : getGraph().getAllBlocks()) {
for (Statement statement : block.getStatements()) {
// Generate ASM and find clobber
AsmProgram asm = getAsmProgram(statement, block, aluState);
Collection<RegisterAllocation.Register> clobberRegisters = getClobberedRegisters(asm);
for (AsmSegment asmSegment : asm.getSegments()) {
if (asmSegment.getStatementIdx() != null) {
// Find the ICL statement
int statementIdx = asmSegment.getStatementIdx();
Statement statement = getGraph().getStatementByIndex(statementIdx);
// Find the registered clobbered by the ASM asmSegment
AsmClobber asmSegmentClobber = asmSegment.getClobber();
Collection<RegisterAllocation.Register> clobberRegisters = getClobberRegisters(asmSegmentClobber);
// Find alive variables
List<VariableRef> aliveVars = new ArrayList<>(liveRangeVariables.getAlive(statement));
// Find vars assignedVars to
Collection<VariableRef> assignedVars = getAssignedVars(statement);
for (VariableRef aliveVar : aliveVars) {
RegisterAllocation.Register aliveVarRegister = allocation.getRegister(aliveVar);
if(aliveVarRegister.isZp()) {
if (aliveVarRegister.isZp()) {
// No need to check a zp-register - here we are only interested in CPU registers
continue;
}
if(aliveVarRegister.equals(register)) {
registerCycles += asm.getCycles();
}
if(assignedVars.contains(aliveVar)) {
if (assignedVars.contains(aliveVar)) {
// No need to register that is assigned by the statement - it will be clobbered
continue;
}
// Alive and not assigned to - clobber not allowed!
if(clobberRegisters.contains(aliveVarRegister)) {
if(verbose) {
if (clobberRegisters.contains(aliveVarRegister)) {
if (verbose) {
getLog().append("Error! Alive variable " + aliveVar + " register " + aliveVarRegister + " clobbered by the ASM generated by statement " + statement);
getLog().append(asm.toString(false));
}
@ -71,9 +68,6 @@ public class Pass3AssertNoCpuClobber extends Pass2Base {
}
}
}
if(!clobberProblem && register!=null) {
getLog().append("Register Cycles: "+register+" "+registerCycles);
}
return clobberProblem;
}
@ -86,12 +80,12 @@ public class Pass3AssertNoCpuClobber extends Pass2Base {
*/
private Collection<VariableRef> getAssignedVars(Statement statement) {
List<VariableRef> assignedVars = new ArrayList<>();
if(statement instanceof StatementAssignment) {
if (statement instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statement;
if(assignment.getlValue() instanceof VariableRef) {
if (assignment.getlValue() instanceof VariableRef) {
assignedVars.add((VariableRef) assignment.getlValue());
}
} else if(statement instanceof StatementPhiBlock) {
} else if (statement instanceof StatementPhiBlock) {
StatementPhiBlock phi = (StatementPhiBlock) statement;
for (StatementPhiBlock.PhiVariable phiVariable : phi.getPhiVariables()) {
assignedVars.add(phiVariable.getVariable());
@ -106,33 +100,18 @@ public class Pass3AssertNoCpuClobber extends Pass2Base {
* @param asm The assembler to check
* @return The clobbered CPU registers
*/
private Collection<RegisterAllocation.Register> getClobberedRegisters(AsmProgram asm) {
AsmClobber clobber = asm.getClobber();
private Collection<RegisterAllocation.Register> getClobberRegisters(AsmClobber clobber) {
List<RegisterAllocation.Register> clobberRegisters = new ArrayList<>();
if(clobber.isClobberA()) {
if (clobber.isClobberA()) {
clobberRegisters.add(RegisterAllocation.getRegisterA());
}
if(clobber.isClobberX()) {
if (clobber.isClobberX()) {
clobberRegisters.add(RegisterAllocation.getRegisterX());
}
if(clobber.isClobberY()) {
if (clobber.isClobberY()) {
clobberRegisters.add(RegisterAllocation.getRegisterY());
}
return clobberRegisters;
}
/**
* Get the ASM program generated by a specific statement in the program
*
* @param statement The statement
* @param block The block containing the statement
* @return The ASM code
*/
private AsmProgram getAsmProgram(Statement statement, ControlFlowBlock block, Pass4CodeGeneration.AsmCodegenAluState aluState) {
Pass4CodeGeneration codegen = new Pass4CodeGeneration(getProgram());
AsmProgram asm = new AsmProgram();
codegen.generateStatementAsm(asm, block, statement, aluState);
return asm;
}
}

View File

@ -8,12 +8,12 @@ import java.util.*;
/**
* Code Generation of 6502 Assembler from ICL/SSA Control Flow Graph
*/
public class Pass4CodeGeneration {
public class Pass3CodeGeneration {
private Program program;
public Pass4CodeGeneration(Program program) {
public Pass3CodeGeneration(Program program) {
this.program = program;
}

View File

@ -60,8 +60,9 @@ public class Pass3RegisterUplifting extends Pass2Base {
allocation.setRegister(var, register);
}
getProgram().setAllocation(allocation);
new Pass3CodeGeneration(getProgram()).generate();
Pass3AssertNoCpuClobber clobber = new Pass3AssertNoCpuClobber(getProgram());
if (clobber.hasClobberProblem(false, register)) {
if (clobber.hasClobberProblem(false)) {
getLog().append("Uplift to " + register + " resulted in clobber.");
} else {
getLog().append("Uplift to " + register + " succesfull.");

View File

@ -1041,20 +1041,6 @@ Found 1 loops in scope []
NATURAL LOOPS WITH DEPTH
Loop head: @1 tails: @3 blocks: @3 @1 @2 depth: 1
Initial phi equivalence classes
[ cursor#3 cursor#5 cursor#1 cursor#2 ]
[ x#2 x#1 ]
[ e#3 e#5 e#1 e#2 ]
[ y#2 y#4 y#1 ]
Complete equivalence classes
[ cursor#3 cursor#5 cursor#1 cursor#2 ]
[ x#2 x#1 ]
[ e#3 e#5 e#1 e#2 ]
[ y#2 y#4 y#1 ]
Allocated zp ptr byte:2 to zp ptr byte:2 [ cursor#3 cursor#5 cursor#1 cursor#2 ]
Allocated zp byte:4 to zp byte:4 [ x#2 x#1 ]
Allocated zp byte:5 to zp byte:5 [ e#3 e#5 e#1 e#2 ]
Allocated zp byte:6 to zp byte:6 [ y#2 y#4 y#1 ]
VARIABLE REGISTER WEIGHTS
(byte[1000]) SCREEN
@ -1083,48 +1069,20 @@ VARIABLE REGISTER WEIGHTS
(byte) y1
(byte) yd
zp ptr byte:2 [ cursor#3 cursor#5 cursor#1 cursor#2 ]
zp byte:4 [ x#2 x#1 ]
zp byte:5 [ e#3 e#5 e#1 e#2 ]
zp byte:6 [ y#2 y#4 y#1 ]
Uplifting max weight 55.0 live range equivalence class zp byte:5 [ e#3 e#5 e#1 e#2 ]
Uplift to reg byte a resulted in clobber.
Register Cycles: reg byte x 78
Uplift to reg byte x succesfull.
Uplift to reg byte y resulted in clobber.
REGISTER UPLIFTING
(byte[1000]) SCREEN
(byte) STAR
(byte*) cursor
(byte*) cursor#1 zp ptr byte:2 8.25
(byte*) cursor#2 zp ptr byte:2 11.0
(byte*) cursor#3 zp ptr byte:2 11.0
(byte*) cursor#5 zp ptr byte:2 16.5
(byte) e
(byte) e#1 zp byte:5 11.0
(byte) e#2 zp byte:5 22.0
(byte) e#3 zp byte:5 5.5
(byte) e#5 zp byte:5 16.5
(byte) x
(byte) x#1 zp byte:4 3.666666666666667
(byte) x#2 zp byte:4 11.0
(byte) x0
(byte) x1
(byte) xd
(byte) y
(byte) y#1 zp byte:6 7.333333333333333
(byte) y#2 zp byte:6 5.5
(byte) y#4 zp byte:6 16.5
(byte) y0
(byte) y1
(byte) yd
zp ptr byte:2 [ cursor#3 cursor#5 cursor#1 cursor#2 ]
zp byte:4 [ x#2 x#1 ]
zp byte:5 [ e#3 e#5 e#1 e#2 ]
zp byte:6 [ y#2 y#4 y#1 ]
Initial phi equivalence classes
[ cursor#3 cursor#5 cursor#1 cursor#2 ]
[ x#2 x#1 ]
[ e#3 e#5 e#1 e#2 ]
[ y#2 y#4 y#1 ]
Complete equivalence classes
[ cursor#3 cursor#5 cursor#1 cursor#2 ]
[ x#2 x#1 ]
[ e#3 e#5 e#1 e#2 ]
[ y#2 y#4 y#1 ]
Allocated zp ptr byte:2 to zp ptr byte:2 [ cursor#3 cursor#5 cursor#1 cursor#2 ]
Allocated zp byte:4 to zp byte:4 [ x#2 x#1 ]
Allocated zp byte:5 to zp byte:5 [ e#3 e#5 e#1 e#2 ]
Allocated zp byte:6 to zp byte:6 [ y#2 y#4 y#1 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -1213,6 +1171,42 @@ B3_from_B2:
//SEG31 [6] phi (byte*) cursor#5 = (byte*) cursor#2 -- register_copy
jmp B3
Uplifting max weight 55.0 live range equivalence class zp byte:5 [ e#3 e#5 e#1 e#2 ]
Uplift to reg byte a resulted in clobber.
Uplift to reg byte x succesfull.
Uplift to reg byte y resulted in clobber.
REGISTER UPLIFTING
(byte[1000]) SCREEN
(byte) STAR
(byte*) cursor
(byte*) cursor#1 zp ptr byte:2 8.25
(byte*) cursor#2 zp ptr byte:2 11.0
(byte*) cursor#3 zp ptr byte:2 11.0
(byte*) cursor#5 zp ptr byte:2 16.5
(byte) e
(byte) e#1 zp byte:5 11.0
(byte) e#2 zp byte:5 22.0
(byte) e#3 zp byte:5 5.5
(byte) e#5 zp byte:5 16.5
(byte) x
(byte) x#1 zp byte:4 3.666666666666667
(byte) x#2 zp byte:4 11.0
(byte) x0
(byte) x1
(byte) xd
(byte) y
(byte) y#1 zp byte:6 7.333333333333333
(byte) y#2 zp byte:6 5.5
(byte) y#4 zp byte:6 16.5
(byte) y0
(byte) y1
(byte) yd
zp ptr byte:2 [ cursor#3 cursor#5 cursor#1 cursor#2 ]
zp byte:4 [ x#2 x#1 ]
zp byte:5 [ e#3 e#5 e#1 e#2 ]
zp byte:6 [ y#2 y#4 y#1 ]
Removing instruction jmp B1
Removing instruction jmp B3
Removing instruction jmp BEND

View File

@ -415,6 +415,16 @@ Found 1 loops in scope []
NATURAL LOOPS WITH DEPTH
Loop head: @1 tails: @1 blocks: @1 depth: 1
VARIABLE REGISTER WEIGHTS
(byte~) $1 11.0
(byte~) $3 22.0
(byte~) $4 22.0
(byte[15]) fibs
(byte) i
(byte) i#1 16.5
(byte) i#2 11.0
Initial phi equivalence classes
[ i#2 i#1 ]
Added variable $1 to zero page equivalence class [ $1 ]
@ -429,42 +439,6 @@ Allocated zp byte:2 to zp byte:2 [ i#2 i#1 ]
Allocated zp byte:3 to zp byte:3 [ $1 ]
Allocated zp byte:4 to zp byte:4 [ $3 ]
Allocated zp byte:5 to zp byte:5 [ $4 ]
VARIABLE REGISTER WEIGHTS
(byte~) $1 11.0
(byte~) $3 22.0
(byte~) $4 22.0
(byte[15]) fibs
(byte) i
(byte) i#1 16.5
(byte) i#2 11.0
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ $1 ]
zp byte:4 [ $3 ]
zp byte:5 [ $4 ]
Uplifting max weight 27.5 live range equivalence class zp byte:2 [ i#2 i#1 ]
Uplift to reg byte a resulted in clobber.
Register Cycles: reg byte x 39
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 39
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte~) $1 zp byte:3 11.0
(byte~) $3 zp byte:4 22.0
(byte~) $4 zp byte:5 22.0
(byte[15]) fibs
(byte) i
(byte) i#1 zp byte:2 16.5
(byte) i#2 zp byte:2 11.0
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ $1 ]
zp byte:4 [ $3 ]
zp byte:5 [ $4 ]
Coalescing zero page register [ zp byte:3 [ $1 ] ] with [ zp byte:5 [ $4 ] ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -513,6 +487,25 @@ B1:
//SEG14 @END
BEND:
Uplifting max weight 27.5 live range equivalence class zp byte:2 [ i#2 i#1 ]
Uplift to reg byte a resulted in clobber.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte~) $1 zp byte:3 11.0
(byte~) $3 zp byte:4 22.0
(byte~) $4 zp byte:5 22.0
(byte[15]) fibs
(byte) i
(byte) i#1 zp byte:2 16.5
(byte) i#2 zp byte:2 11.0
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ $1 ]
zp byte:4 [ $3 ]
zp byte:5 [ $4 ]
Coalescing zero page register [ zp byte:3 [ $1 ] ] with [ zp byte:5 [ $4 ] ]
Removing instruction jmp B1
Removing instruction jmp BEND
Succesful ASM optimization Pass5NextJumpElimination

View File

@ -4016,56 +4016,6 @@ Loop head: flip::@1 tails: flip::@4 blocks: flip::@4 flip::@2 flip::@1 depth: 2
Loop head: flip::@3 tails: flip::@3 blocks: flip::@3 depth: 2
Loop head: prepare::@1 tails: prepare::@1 blocks: prepare::@1 depth: 1
Initial phi equivalence classes
[ main::c#2 main::c#1 ]
[ plot::line#2 plot::line#1 ]
[ plot::y#2 plot::y#1 ]
[ plot::i#2 plot::i#3 plot::i#1 ]
[ plot::x#2 plot::x#1 ]
[ flip::r#2 flip::r#1 ]
[ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
[ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
[ flip::c#2 flip::c#1 ]
[ flip::i#2 flip::i#1 ]
[ prepare::i#2 prepare::i#1 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Added variable main::$3 to zero page equivalence class [ main::$3 ]
Added variable plot::$3 to zero page equivalence class [ plot::$3 ]
Added variable flip::$0 to zero page equivalence class [ flip::$0 ]
Added variable flip::$4 to zero page equivalence class [ flip::$4 ]
Complete equivalence classes
[ main::c#2 main::c#1 ]
[ plot::line#2 plot::line#1 ]
[ plot::y#2 plot::y#1 ]
[ plot::i#2 plot::i#3 plot::i#1 ]
[ plot::x#2 plot::x#1 ]
[ flip::r#2 flip::r#1 ]
[ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
[ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
[ flip::c#2 flip::c#1 ]
[ flip::i#2 flip::i#1 ]
[ prepare::i#2 prepare::i#1 ]
[ main::$1 ]
[ main::$3 ]
[ plot::$3 ]
[ flip::$0 ]
[ flip::$4 ]
Allocated zp byte:2 to zp byte:2 [ main::c#2 main::c#1 ]
Allocated zp ptr byte:3 to zp ptr byte:3 [ plot::line#2 plot::line#1 ]
Allocated zp byte:5 to zp byte:5 [ plot::y#2 plot::y#1 ]
Allocated zp byte:6 to zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ]
Allocated zp byte:7 to zp byte:7 [ plot::x#2 plot::x#1 ]
Allocated zp byte:8 to zp byte:8 [ flip::r#2 flip::r#1 ]
Allocated zp byte:9 to zp byte:9 [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
Allocated zp byte:10 to zp byte:10 [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
Allocated zp byte:11 to zp byte:11 [ flip::c#2 flip::c#1 ]
Allocated zp byte:12 to zp byte:12 [ flip::i#2 flip::i#1 ]
Allocated zp byte:13 to zp byte:13 [ prepare::i#2 prepare::i#1 ]
Allocated zp byte:14 to zp byte:14 [ main::$1 ]
Allocated zp byte:15 to zp byte:15 [ main::$3 ]
Allocated zp byte:16 to zp byte:16 [ plot::$3 ]
Allocated zp byte:17 to zp byte:17 [ flip::$0 ]
Allocated zp byte:18 to zp byte:18 [ flip::$4 ]
VARIABLE REGISTER WEIGHTS
(byte*) RASTER
@ -4119,107 +4069,56 @@ VARIABLE REGISTER WEIGHTS
(byte) prepare::i#1 16.5
(byte) prepare::i#2 22.0
zp byte:2 [ main::c#2 main::c#1 ]
zp ptr byte:3 [ plot::line#2 plot::line#1 ]
zp byte:5 [ plot::y#2 plot::y#1 ]
zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ]
zp byte:7 [ plot::x#2 plot::x#1 ]
zp byte:8 [ flip::r#2 flip::r#1 ]
zp byte:9 [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
zp byte:10 [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
zp byte:11 [ flip::c#2 flip::c#1 ]
zp byte:12 [ flip::i#2 flip::i#1 ]
zp byte:13 [ prepare::i#2 prepare::i#1 ]
zp byte:14 [ main::$1 ]
zp byte:15 [ main::$3 ]
zp byte:16 [ plot::$3 ]
zp byte:17 [ flip::$0 ]
zp byte:18 [ flip::$4 ]
Uplifting max weight 2252.25 live range equivalence class zp byte:7 [ plot::x#2 plot::x#1 ]
Uplift to reg byte a resulted in clobber.
Uplift to reg byte x resulted in clobber.
Register Cycles: reg byte y 30
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte*) RASTER
(byte[1000]) SCREEN
(byte[256]) buffer1
(byte[256]) buffer2
(void()) flip()
(byte~) flip::$0 zp byte:17 2002.0
(byte~) flip::$4 zp byte:18 202.0
(byte) flip::c
(byte) flip::c#1 zp byte:11 1501.5
(byte) flip::c#2 zp byte:11 400.4
(byte) flip::dstIdx
(byte) flip::dstIdx#1 zp byte:10 701.0
(byte) flip::dstIdx#2 zp byte:10 67.33333333333333
(byte) flip::dstIdx#3 zp byte:10 776.0
(byte) flip::dstIdx#5 zp byte:10 202.0
(byte) flip::i
(byte) flip::i#1 zp byte:12 151.5
(byte) flip::i#2 zp byte:12 134.66666666666666
(byte) flip::r
(byte) flip::r#1 zp byte:8 151.5
(byte) flip::r#2 zp byte:8 22.444444444444443
(byte) flip::srcIdx
(byte) flip::srcIdx#1 zp byte:9 300.42857142857144
(byte) flip::srcIdx#2 zp byte:9 1034.6666666666667
(byte) flip::srcIdx#3 zp byte:9 202.0
(void()) main()
(byte~) main::$1 zp byte:14 2002.0
(byte~) main::$3 zp byte:15 2002.0
(byte) main::c
(byte) main::c#1 zp byte:2 151.5
(byte) main::c#2 zp byte:2 40.4
(void()) plot()
(byte~) plot::$3 zp byte:16 2002.0
(byte) plot::i
(byte) plot::i#1 zp byte:6 350.5
(byte) plot::i#2 zp byte:6 1034.6666666666667
(byte) plot::i#3 zp byte:6 202.0
(byte*) plot::line
(byte*) plot::line#1 zp ptr byte:3 67.33333333333333
(byte*) plot::line#2 zp ptr byte:3 171.85714285714283
(byte) plot::x
(byte) plot::x#1 zp byte:7 1501.5
(byte) plot::x#2 zp byte:7 750.75
(byte) plot::y
(byte) plot::y#1 zp byte:5 151.5
(byte) plot::y#2 zp byte:5 25.25
(void()) prepare()
(byte) prepare::i
(byte) prepare::i#1 zp byte:13 16.5
(byte) prepare::i#2 zp byte:13 22.0
zp byte:2 [ main::c#2 main::c#1 ]
zp ptr byte:3 [ plot::line#2 plot::line#1 ]
zp byte:5 [ plot::y#2 plot::y#1 ]
zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ]
zp byte:7 [ plot::x#2 plot::x#1 ]
zp byte:8 [ flip::r#2 flip::r#1 ]
zp byte:9 [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
zp byte:10 [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
zp byte:11 [ flip::c#2 flip::c#1 ]
zp byte:12 [ flip::i#2 flip::i#1 ]
zp byte:13 [ prepare::i#2 prepare::i#1 ]
zp byte:14 [ main::$1 ]
zp byte:15 [ main::$3 ]
zp byte:16 [ plot::$3 ]
zp byte:17 [ flip::$0 ]
zp byte:18 [ flip::$4 ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 ] ] with [ zp byte:5 [ plot::y#2 plot::y#1 ] ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 plot::y#2 plot::y#1 ] ] with [ zp byte:8 [ flip::r#2 flip::r#1 ] ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 plot::y#2 plot::y#1 flip::r#2 flip::r#1 ] ] with [ zp byte:12 [ flip::i#2 flip::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 plot::y#2 plot::y#1 flip::r#2 flip::r#1 flip::i#2 flip::i#1 ] ] with [ zp byte:13 [ prepare::i#2 prepare::i#1 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ] ] with [ zp byte:9 [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ] ] with [ zp byte:14 [ main::$1 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 main::$1 ] ] with [ zp byte:15 [ main::$3 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 main::$1 main::$3 ] ] with [ zp byte:18 [ flip::$4 ] ]
Coalescing zero page register [ zp byte:7 [ plot::x#2 plot::x#1 ] ] with [ zp byte:10 [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ] ]
Coalescing zero page register [ zp byte:11 [ flip::c#2 flip::c#1 ] ] with [ zp byte:16 [ plot::$3 ] ]
Initial phi equivalence classes
[ main::c#2 main::c#1 ]
[ plot::line#2 plot::line#1 ]
[ plot::y#2 plot::y#1 ]
[ plot::i#2 plot::i#3 plot::i#1 ]
[ plot::x#2 plot::x#1 ]
[ flip::r#2 flip::r#1 ]
[ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
[ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
[ flip::c#2 flip::c#1 ]
[ flip::i#2 flip::i#1 ]
[ prepare::i#2 prepare::i#1 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Added variable main::$3 to zero page equivalence class [ main::$3 ]
Added variable plot::$3 to zero page equivalence class [ plot::$3 ]
Added variable flip::$0 to zero page equivalence class [ flip::$0 ]
Added variable flip::$4 to zero page equivalence class [ flip::$4 ]
Complete equivalence classes
[ main::c#2 main::c#1 ]
[ plot::line#2 plot::line#1 ]
[ plot::y#2 plot::y#1 ]
[ plot::i#2 plot::i#3 plot::i#1 ]
[ plot::x#2 plot::x#1 ]
[ flip::r#2 flip::r#1 ]
[ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
[ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
[ flip::c#2 flip::c#1 ]
[ flip::i#2 flip::i#1 ]
[ prepare::i#2 prepare::i#1 ]
[ main::$1 ]
[ main::$3 ]
[ plot::$3 ]
[ flip::$0 ]
[ flip::$4 ]
Allocated zp byte:2 to zp byte:2 [ main::c#2 main::c#1 ]
Allocated zp ptr byte:3 to zp ptr byte:3 [ plot::line#2 plot::line#1 ]
Allocated zp byte:5 to zp byte:5 [ plot::y#2 plot::y#1 ]
Allocated zp byte:6 to zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ]
Allocated zp byte:7 to zp byte:7 [ plot::x#2 plot::x#1 ]
Allocated zp byte:8 to zp byte:8 [ flip::r#2 flip::r#1 ]
Allocated zp byte:9 to zp byte:9 [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
Allocated zp byte:10 to zp byte:10 [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
Allocated zp byte:11 to zp byte:11 [ flip::c#2 flip::c#1 ]
Allocated zp byte:12 to zp byte:12 [ flip::i#2 flip::i#1 ]
Allocated zp byte:13 to zp byte:13 [ prepare::i#2 prepare::i#1 ]
Allocated zp byte:14 to zp byte:14 [ main::$1 ]
Allocated zp byte:15 to zp byte:15 [ main::$3 ]
Allocated zp byte:16 to zp byte:16 [ plot::$3 ]
Allocated zp byte:17 to zp byte:17 [ flip::$0 ]
Allocated zp byte:18 to zp byte:18 [ flip::$4 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -4500,6 +4399,89 @@ prepare__Breturn:
//SEG107 [45] return [ ]
rts
Uplifting max weight 2252.25 live range equivalence class zp byte:7 [ plot::x#2 plot::x#1 ]
Uplift to reg byte a resulted in clobber.
Uplift to reg byte x resulted in clobber.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte*) RASTER
(byte[1000]) SCREEN
(byte[256]) buffer1
(byte[256]) buffer2
(void()) flip()
(byte~) flip::$0 zp byte:17 2002.0
(byte~) flip::$4 zp byte:18 202.0
(byte) flip::c
(byte) flip::c#1 zp byte:11 1501.5
(byte) flip::c#2 zp byte:11 400.4
(byte) flip::dstIdx
(byte) flip::dstIdx#1 zp byte:10 701.0
(byte) flip::dstIdx#2 zp byte:10 67.33333333333333
(byte) flip::dstIdx#3 zp byte:10 776.0
(byte) flip::dstIdx#5 zp byte:10 202.0
(byte) flip::i
(byte) flip::i#1 zp byte:12 151.5
(byte) flip::i#2 zp byte:12 134.66666666666666
(byte) flip::r
(byte) flip::r#1 zp byte:8 151.5
(byte) flip::r#2 zp byte:8 22.444444444444443
(byte) flip::srcIdx
(byte) flip::srcIdx#1 zp byte:9 300.42857142857144
(byte) flip::srcIdx#2 zp byte:9 1034.6666666666667
(byte) flip::srcIdx#3 zp byte:9 202.0
(void()) main()
(byte~) main::$1 zp byte:14 2002.0
(byte~) main::$3 zp byte:15 2002.0
(byte) main::c
(byte) main::c#1 zp byte:2 151.5
(byte) main::c#2 zp byte:2 40.4
(void()) plot()
(byte~) plot::$3 zp byte:16 2002.0
(byte) plot::i
(byte) plot::i#1 zp byte:6 350.5
(byte) plot::i#2 zp byte:6 1034.6666666666667
(byte) plot::i#3 zp byte:6 202.0
(byte*) plot::line
(byte*) plot::line#1 zp ptr byte:3 67.33333333333333
(byte*) plot::line#2 zp ptr byte:3 171.85714285714283
(byte) plot::x
(byte) plot::x#1 zp byte:7 1501.5
(byte) plot::x#2 zp byte:7 750.75
(byte) plot::y
(byte) plot::y#1 zp byte:5 151.5
(byte) plot::y#2 zp byte:5 25.25
(void()) prepare()
(byte) prepare::i
(byte) prepare::i#1 zp byte:13 16.5
(byte) prepare::i#2 zp byte:13 22.0
zp byte:2 [ main::c#2 main::c#1 ]
zp ptr byte:3 [ plot::line#2 plot::line#1 ]
zp byte:5 [ plot::y#2 plot::y#1 ]
zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ]
zp byte:7 [ plot::x#2 plot::x#1 ]
zp byte:8 [ flip::r#2 flip::r#1 ]
zp byte:9 [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
zp byte:10 [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
zp byte:11 [ flip::c#2 flip::c#1 ]
zp byte:12 [ flip::i#2 flip::i#1 ]
zp byte:13 [ prepare::i#2 prepare::i#1 ]
zp byte:14 [ main::$1 ]
zp byte:15 [ main::$3 ]
zp byte:16 [ plot::$3 ]
zp byte:17 [ flip::$0 ]
zp byte:18 [ flip::$4 ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 ] ] with [ zp byte:5 [ plot::y#2 plot::y#1 ] ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 plot::y#2 plot::y#1 ] ] with [ zp byte:8 [ flip::r#2 flip::r#1 ] ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 plot::y#2 plot::y#1 flip::r#2 flip::r#1 ] ] with [ zp byte:12 [ flip::i#2 flip::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ main::c#2 main::c#1 plot::y#2 plot::y#1 flip::r#2 flip::r#1 flip::i#2 flip::i#1 ] ] with [ zp byte:13 [ prepare::i#2 prepare::i#1 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ] ] with [ zp byte:9 [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ] ] with [ zp byte:14 [ main::$1 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 main::$1 ] ] with [ zp byte:15 [ main::$3 ] ]
Coalescing zero page register [ zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 main::$1 main::$3 ] ] with [ zp byte:18 [ flip::$4 ] ]
Coalescing zero page register [ zp byte:7 [ plot::x#2 plot::x#1 ] ] with [ zp byte:10 [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ] ]
Coalescing zero page register [ zp byte:11 [ flip::c#2 flip::c#1 ] ] with [ zp byte:16 [ plot::$3 ] ]
Removing instruction jmp BEND
Removing instruction jmp main__B3
Removing instruction jmp main__B4

View File

@ -360,14 +360,6 @@ Found 1 loops in scope []
NATURAL LOOPS WITH DEPTH
Loop head: @1 tails: @3 blocks: @3 @1 @2 depth: 1
Initial phi equivalence classes
[ i#2 i#1 ]
[ s#2 s#4 s#1 ]
Complete equivalence classes
[ i#2 i#1 ]
[ s#2 s#4 s#1 ]
Allocated zp byte:2 to zp byte:2 [ i#2 i#1 ]
Allocated zp byte:3 to zp byte:3 [ s#2 s#4 s#1 ]
VARIABLE REGISTER WEIGHTS
(byte) i
@ -378,27 +370,14 @@ VARIABLE REGISTER WEIGHTS
(byte) s#2 16.5
(byte) s#4 11.0
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ s#2 s#4 s#1 ]
Uplifting max weight 49.5 live range equivalence class zp byte:3 [ s#2 s#4 s#1 ]
Uplift to reg byte a resulted in clobber.
Register Cycles: reg byte x 29
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 29
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte) i
(byte) i#1 zp byte:2 16.5
(byte) i#2 zp byte:2 11.0
(byte) s
(byte) s#1 zp byte:3 22.0
(byte) s#2 zp byte:3 16.5
(byte) s#4 zp byte:3 11.0
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ s#2 s#4 s#1 ]
Initial phi equivalence classes
[ i#2 i#1 ]
[ s#2 s#4 s#1 ]
Complete equivalence classes
[ i#2 i#1 ]
[ s#2 s#4 s#1 ]
Allocated zp byte:2 to zp byte:2 [ i#2 i#1 ]
Allocated zp byte:3 to zp byte:3 [ s#2 s#4 s#1 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -450,6 +429,22 @@ B3_from_B2:
//SEG18 [2] phi (byte) s#4 = (byte) s#1 -- register_copy
jmp B3
Uplifting max weight 49.5 live range equivalence class zp byte:3 [ s#2 s#4 s#1 ]
Uplift to reg byte a resulted in clobber.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte) i
(byte) i#1 zp byte:2 16.5
(byte) i#2 zp byte:2 11.0
(byte) s
(byte) s#1 zp byte:3 22.0
(byte) s#2 zp byte:3 16.5
(byte) s#4 zp byte:3 11.0
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ s#2 s#4 s#1 ]
Removing instruction jmp B1
Removing instruction jmp B3
Removing instruction jmp BEND

View File

@ -708,14 +708,6 @@ NATURAL LOOPS WITH DEPTH
Loop head: main::@1 tails: main::@3 blocks: main::@3 main::@1 depth: 1
Loop head: nest::@1 tails: nest::@1 blocks: nest::@1 depth: 2
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ nest::j#2 nest::j#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ nest::j#2 nest::j#1 ]
Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ]
Allocated zp byte:3 to zp byte:3 [ nest::j#2 nest::j#1 ]
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
@ -728,30 +720,14 @@ VARIABLE REGISTER WEIGHTS
(byte) nest::j#1 151.5
(byte) nest::j#2 151.5
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ nest::j#2 nest::j#1 ]
Uplifting max weight 303.0 live range equivalence class zp byte:3 [ nest::j#2 nest::j#1 ]
Register Cycles: reg byte a 12
Uplift to reg byte a succesfull.
Register Cycles: reg byte x 10
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 10
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 zp byte:2 16.5
(byte) main::i#2 zp byte:2 3.142857142857143
(void()) nest()
(byte) nest::j
(byte) nest::j#1 zp byte:3 151.5
(byte) nest::j#2 zp byte:3 151.5
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ nest::j#2 nest::j#1 ]
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ nest::j#2 nest::j#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ nest::j#2 nest::j#1 ]
Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ]
Allocated zp byte:3 to zp byte:3 [ nest::j#2 nest::j#1 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -817,6 +793,24 @@ nest__Breturn:
//SEG25 [10] return [ main::i#2 ]
rts
Uplifting max weight 303.0 live range equivalence class zp byte:3 [ nest::j#2 nest::j#1 ]
Uplift to reg byte a succesfull.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 zp byte:2 16.5
(byte) main::i#2 zp byte:2 3.142857142857143
(void()) nest()
(byte) nest::j
(byte) nest::j#1 zp byte:3 151.5
(byte) nest::j#2 zp byte:3 151.5
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ nest::j#2 nest::j#1 ]
Removing instruction jmp BEND
Removing instruction jmp main__B1
Removing instruction jmp main__B3

View File

@ -1790,26 +1790,6 @@ Loop head: nest1::@1 tails: nest1::@3 blocks: nest1::@3 nest1::@5 nest1::@2 nest
Loop head: nest2::@2 tails: nest2::@2 blocks: nest2::@2 depth: 6
Loop head: nest2::@1 tails: nest2::@3 blocks: nest2::@3 nest2::@2 nest2::@1 depth: 5
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#2 main::j#1 ]
[ nest1::i#2 nest1::i#1 ]
[ nest1::j#2 nest1::j#1 ]
[ nest2::i#2 nest2::i#1 ]
[ nest2::j#2 nest2::j#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#2 main::j#1 ]
[ nest1::i#2 nest1::i#1 ]
[ nest1::j#2 nest1::j#1 ]
[ nest2::i#2 nest2::i#1 ]
[ nest2::j#2 nest2::j#1 ]
Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ]
Allocated zp byte:3 to zp byte:3 [ main::j#2 main::j#1 ]
Allocated zp byte:4 to zp byte:4 [ nest1::i#2 nest1::i#1 ]
Allocated zp byte:5 to zp byte:5 [ nest1::j#2 nest1::j#1 ]
Allocated zp byte:6 to zp byte:6 [ nest2::i#2 nest2::i#1 ]
Allocated zp byte:7 to zp byte:7 [ nest2::j#2 nest2::j#1 ]
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
@ -1835,51 +1815,26 @@ VARIABLE REGISTER WEIGHTS
(byte) nest2::j#1 1500001.5
(byte) nest2::j#2 1500001.5
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ main::j#2 main::j#1 ]
zp byte:4 [ nest1::i#2 nest1::i#1 ]
zp byte:5 [ nest1::j#2 nest1::j#1 ]
zp byte:6 [ nest2::i#2 nest2::i#1 ]
zp byte:7 [ nest2::j#2 nest2::j#1 ]
Uplifting max weight 3000003.0 live range equivalence class zp byte:7 [ nest2::j#2 nest2::j#1 ]
Register Cycles: reg byte a 12
Uplift to reg byte a succesfull.
Register Cycles: reg byte x 10
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 10
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 zp byte:2 16.5
(byte) main::i#2 zp byte:2 1.0476190476190477
(byte) main::j
(byte) main::j#1 zp byte:3 151.5
(byte) main::j#2 zp byte:3 11.222222222222221
(void()) nest1()
(byte) nest1::i
(byte) nest1::i#1 zp byte:4 1501.5
(byte) nest1::i#2 zp byte:4 154.0
(byte) nest1::j
(byte) nest1::j#1 zp byte:5 15001.5
(byte) nest1::j#2 zp byte:5 2000.2
(void()) nest2()
(byte) nest2::i
(byte) nest2::i#1 zp byte:6 150001.5
(byte) nest2::i#2 zp byte:6 40000.4
(byte) nest2::j
(byte) nest2::j#1 zp byte:7 1500001.5
(byte) nest2::j#2 zp byte:7 1500001.5
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ main::j#2 main::j#1 ]
zp byte:4 [ nest1::i#2 nest1::i#1 ]
zp byte:5 [ nest1::j#2 nest1::j#1 ]
zp byte:6 [ nest2::i#2 nest2::i#1 ]
zp byte:7 [ nest2::j#2 nest2::j#1 ]
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#2 main::j#1 ]
[ nest1::i#2 nest1::i#1 ]
[ nest1::j#2 nest1::j#1 ]
[ nest2::i#2 nest2::i#1 ]
[ nest2::j#2 nest2::j#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#2 main::j#1 ]
[ nest1::i#2 nest1::i#1 ]
[ nest1::j#2 nest1::j#1 ]
[ nest2::i#2 nest2::i#1 ]
[ nest2::j#2 nest2::j#1 ]
Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ]
Allocated zp byte:3 to zp byte:3 [ main::j#2 main::j#1 ]
Allocated zp byte:4 to zp byte:4 [ nest1::i#2 nest1::i#1 ]
Allocated zp byte:5 to zp byte:5 [ nest1::j#2 nest1::j#1 ]
Allocated zp byte:6 to zp byte:6 [ nest2::i#2 nest2::i#1 ]
Allocated zp byte:7 to zp byte:7 [ nest2::j#2 nest2::j#1 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -2034,6 +1989,41 @@ nest2__Breturn:
//SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ]
rts
Uplifting max weight 3000003.0 live range equivalence class zp byte:7 [ nest2::j#2 nest2::j#1 ]
Uplift to reg byte a succesfull.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 zp byte:2 16.5
(byte) main::i#2 zp byte:2 1.0476190476190477
(byte) main::j
(byte) main::j#1 zp byte:3 151.5
(byte) main::j#2 zp byte:3 11.222222222222221
(void()) nest1()
(byte) nest1::i
(byte) nest1::i#1 zp byte:4 1501.5
(byte) nest1::i#2 zp byte:4 154.0
(byte) nest1::j
(byte) nest1::j#1 zp byte:5 15001.5
(byte) nest1::j#2 zp byte:5 2000.2
(void()) nest2()
(byte) nest2::i
(byte) nest2::i#1 zp byte:6 150001.5
(byte) nest2::i#2 zp byte:6 40000.4
(byte) nest2::j
(byte) nest2::j#1 zp byte:7 1500001.5
(byte) nest2::j#2 zp byte:7 1500001.5
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ main::j#2 main::j#1 ]
zp byte:4 [ nest1::i#2 nest1::i#1 ]
zp byte:5 [ nest1::j#2 nest1::j#1 ]
zp byte:6 [ nest2::i#2 nest2::i#1 ]
zp byte:7 [ nest2::j#2 nest2::j#1 ]
Removing instruction jmp BEND
Removing instruction jmp main__B1
Removing instruction jmp main__B2

View File

@ -513,14 +513,6 @@ Found 1 loops in scope [main]
NATURAL LOOPS WITH DEPTH
Loop head: main::@1 tails: main::@5 main::@4 blocks: main::@5 main::@2 main::@1 main::@4 depth: 1
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ]
Allocated zp byte:3 to zp byte:3 [ main::s#3 main::s#1 main::s#2 ]
VARIABLE REGISTER WEIGHTS
(void()) main()
@ -532,28 +524,14 @@ VARIABLE REGISTER WEIGHTS
(byte) main::s#2 22.0
(byte) main::s#3 11.0
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ main::s#3 main::s#1 main::s#2 ]
Uplifting max weight 55.0 live range equivalence class zp byte:3 [ main::s#3 main::s#1 main::s#2 ]
Uplift to reg byte a resulted in clobber.
Register Cycles: reg byte x 24
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 24
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(void()) main()
(byte) main::i
(byte) main::i#1 zp byte:2 11.0
(byte) main::i#2 zp byte:2 33.0
(byte) main::s
(byte) main::s#1 zp byte:3 22.0
(byte) main::s#2 zp byte:3 22.0
(byte) main::s#3 zp byte:3 11.0
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ main::s#3 main::s#1 main::s#2 ]
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ]
Allocated zp byte:3 to zp byte:3 [ main::s#3 main::s#1 main::s#2 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -613,6 +591,23 @@ main__B1_from_B4:
//SEG23 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy
jmp main__B1
Uplifting max weight 55.0 live range equivalence class zp byte:3 [ main::s#3 main::s#1 main::s#2 ]
Uplift to reg byte a resulted in clobber.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(void()) main()
(byte) main::i
(byte) main::i#1 zp byte:2 11.0
(byte) main::i#2 zp byte:2 33.0
(byte) main::s
(byte) main::s#1 zp byte:3 22.0
(byte) main::s#2 zp byte:3 22.0
(byte) main::s#3 zp byte:3 11.0
zp byte:2 [ main::i#2 main::i#1 ]
zp byte:3 [ main::s#3 main::s#1 main::s#2 ]
Removing instruction jmp BEND
Removing instruction jmp main__B1
Removing instruction jmp main__Breturn

View File

@ -290,14 +290,6 @@ Found 1 loops in scope []
NATURAL LOOPS WITH DEPTH
Loop head: @1 tails: @1 blocks: @1 depth: 1
Initial phi equivalence classes
[ i#2 i#1 ]
Added variable $1 to zero page equivalence class [ $1 ]
Complete equivalence classes
[ i#2 i#1 ]
[ $1 ]
Allocated zp byte:2 to zp byte:2 [ i#2 i#1 ]
Allocated zp byte:3 to zp byte:3 [ $1 ]
VARIABLE REGISTER WEIGHTS
(byte~) $1 22.0
@ -306,25 +298,14 @@ VARIABLE REGISTER WEIGHTS
(byte) i#2 14.666666666666666
(byte[16]) p
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ $1 ]
Uplifting max weight 31.166666666666664 live range equivalence class zp byte:2 [ i#2 i#1 ]
Uplift to reg byte a resulted in clobber.
Register Cycles: reg byte x 23
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 23
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte~) $1 zp byte:3 22.0
(byte) i
(byte) i#1 zp byte:2 16.5
(byte) i#2 zp byte:2 14.666666666666666
(byte[16]) p
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ $1 ]
Initial phi equivalence classes
[ i#2 i#1 ]
Added variable $1 to zero page equivalence class [ $1 ]
Complete equivalence classes
[ i#2 i#1 ]
[ $1 ]
Allocated zp byte:2 to zp byte:2 [ i#2 i#1 ]
Allocated zp byte:3 to zp byte:3 [ $1 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -359,6 +340,20 @@ B1:
//SEG10 @END
BEND:
Uplifting max weight 31.166666666666664 live range equivalence class zp byte:2 [ i#2 i#1 ]
Uplift to reg byte a resulted in clobber.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte~) $1 zp byte:3 22.0
(byte) i
(byte) i#1 zp byte:2 16.5
(byte) i#2 zp byte:2 14.666666666666666
(byte[16]) p
zp byte:2 [ i#2 i#1 ]
zp byte:3 [ $1 ]
Removing instruction jmp B1
Removing instruction jmp BEND
Succesful ASM optimization Pass5NextJumpElimination

View File

@ -1808,38 +1808,6 @@ Loop head: rvaluevar::@1 tails: rvaluevar::@2 blocks: rvaluevar::@2 rvaluevar::@
Loop head: rvalue::@1 tails: rvalue::@2 blocks: rvalue::@2 rvalue::@1 depth: 1
Loop head: lvalue::@1 tails: lvalue::@2 blocks: lvalue::@2 lvalue::@1 depth: 1
Initial phi equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ]
Added variable rvaluevar::b#0 to zero page equivalence class [ rvaluevar::b#0 ]
Added variable rvalue::b#0 to zero page equivalence class [ rvalue::b#0 ]
Added variable rvalue::b#1 to zero page equivalence class [ rvalue::b#1 ]
Added variable rvalue::b#2 to zero page equivalence class [ rvalue::b#2 ]
Complete equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ]
[ rvaluevar::b#0 ]
[ rvalue::b#0 ]
[ rvalue::b#1 ]
[ rvalue::b#2 ]
Allocated zp byte:2 to zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Allocated zp ptr byte:3 to zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Allocated zp byte:5 to zp byte:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
Allocated zp ptr byte:6 to zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
Allocated zp byte:8 to zp byte:8 [ rvalue::i#2 rvalue::i#1 ]
Allocated zp byte:9 to zp byte:9 [ lvalue::i#2 lvalue::i#1 ]
Allocated zp byte:10 to zp byte:10 [ rvaluevar::b#0 ]
Allocated zp byte:11 to zp byte:11 [ rvalue::b#0 ]
Allocated zp byte:12 to zp byte:12 [ rvalue::b#1 ]
Allocated zp byte:13 to zp byte:13 [ rvalue::b#2 ]
VARIABLE REGISTER WEIGHTS
(void()) lvalue()
@ -1875,77 +1843,38 @@ VARIABLE REGISTER WEIGHTS
(byte*) rvaluevar::screen#1 11.0
(byte*) rvaluevar::screen#2 11.0
zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
zp byte:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
zp byte:8 [ rvalue::i#2 rvalue::i#1 ]
zp byte:9 [ lvalue::i#2 lvalue::i#1 ]
zp byte:10 [ rvaluevar::b#0 ]
zp byte:11 [ rvalue::b#0 ]
zp byte:12 [ rvalue::b#1 ]
zp byte:13 [ rvalue::b#2 ]
Uplifting max weight Infinity live range equivalence class zp byte:10 [ rvaluevar::b#0 ]
Register Cycles: reg byte a 0
Uplift to reg byte a succesfull.
Register Cycles: reg byte x 0
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 0
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(void()) lvalue()
(byte[1024]) lvalue::SCREEN
(byte) lvalue::i
(byte) lvalue::i#1 zp byte:9 22.0
(byte) lvalue::i#2 zp byte:9 14.666666666666666
(void()) lvaluevar()
(byte) lvaluevar::b
(byte) lvaluevar::i
(byte) lvaluevar::i#1 zp byte:2 22.0
(byte) lvaluevar::i#2 zp byte:2 8.25
(byte*) lvaluevar::screen
(byte*) lvaluevar::screen#1 zp ptr byte:3 11.0
(byte*) lvaluevar::screen#2 zp ptr byte:3 11.0
(void()) main()
(void()) rvalue()
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::b#0 zp byte:11 Infinity
(byte) rvalue::b#1 zp byte:12 Infinity
(byte) rvalue::b#2 zp byte:13 Infinity
(byte) rvalue::i
(byte) rvalue::i#1 zp byte:8 22.0
(byte) rvalue::i#2 zp byte:8 14.666666666666666
(void()) rvaluevar()
(byte) rvaluevar::b
(byte) rvaluevar::b#0 zp byte:10 Infinity
(byte) rvaluevar::i
(byte) rvaluevar::i#1 zp byte:5 22.0
(byte) rvaluevar::i#2 zp byte:5 8.25
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 zp ptr byte:6 11.0
(byte*) rvaluevar::screen#2 zp ptr byte:6 11.0
zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
zp byte:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
zp byte:8 [ rvalue::i#2 rvalue::i#1 ]
zp byte:9 [ lvalue::i#2 lvalue::i#1 ]
zp byte:10 [ rvaluevar::b#0 ]
zp byte:11 [ rvalue::b#0 ]
zp byte:12 [ rvalue::b#1 ]
zp byte:13 [ rvalue::b#2 ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ] ] with [ zp byte:5 [ rvaluevar::i#2 rvaluevar::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 ] ] with [ zp byte:8 [ rvalue::i#2 rvalue::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 ] ] with [ zp byte:9 [ lvalue::i#2 lvalue::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 ] ] with [ zp byte:10 [ rvaluevar::b#0 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 rvaluevar::b#0 ] ] with [ zp byte:11 [ rvalue::b#0 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 rvaluevar::b#0 rvalue::b#0 ] ] with [ zp byte:12 [ rvalue::b#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 rvaluevar::b#0 rvalue::b#0 rvalue::b#1 ] ] with [ zp byte:13 [ rvalue::b#2 ] ]
Coalescing zero page register [ zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] ] with [ zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] ]
Initial phi equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ]
Added variable rvaluevar::b#0 to zero page equivalence class [ rvaluevar::b#0 ]
Added variable rvalue::b#0 to zero page equivalence class [ rvalue::b#0 ]
Added variable rvalue::b#1 to zero page equivalence class [ rvalue::b#1 ]
Added variable rvalue::b#2 to zero page equivalence class [ rvalue::b#2 ]
Complete equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ]
[ rvaluevar::b#0 ]
[ rvalue::b#0 ]
[ rvalue::b#1 ]
[ rvalue::b#2 ]
Allocated zp byte:2 to zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Allocated zp ptr byte:3 to zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Allocated zp byte:5 to zp byte:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
Allocated zp ptr byte:6 to zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
Allocated zp byte:8 to zp byte:8 [ rvalue::i#2 rvalue::i#1 ]
Allocated zp byte:9 to zp byte:9 [ lvalue::i#2 lvalue::i#1 ]
Allocated zp byte:10 to zp byte:10 [ rvaluevar::b#0 ]
Allocated zp byte:11 to zp byte:11 [ rvalue::b#0 ]
Allocated zp byte:12 to zp byte:12 [ rvalue::b#1 ]
Allocated zp byte:13 to zp byte:13 [ rvalue::b#2 ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -2137,6 +2066,63 @@ lvalue__B1_from_B2:
//SEG70 [27] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 -- register_copy
jmp lvalue__B1
Uplifting max weight Infinity live range equivalence class zp byte:10 [ rvaluevar::b#0 ]
Uplift to reg byte a succesfull.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(void()) lvalue()
(byte[1024]) lvalue::SCREEN
(byte) lvalue::i
(byte) lvalue::i#1 zp byte:9 22.0
(byte) lvalue::i#2 zp byte:9 14.666666666666666
(void()) lvaluevar()
(byte) lvaluevar::b
(byte) lvaluevar::i
(byte) lvaluevar::i#1 zp byte:2 22.0
(byte) lvaluevar::i#2 zp byte:2 8.25
(byte*) lvaluevar::screen
(byte*) lvaluevar::screen#1 zp ptr byte:3 11.0
(byte*) lvaluevar::screen#2 zp ptr byte:3 11.0
(void()) main()
(void()) rvalue()
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::b#0 zp byte:11 Infinity
(byte) rvalue::b#1 zp byte:12 Infinity
(byte) rvalue::b#2 zp byte:13 Infinity
(byte) rvalue::i
(byte) rvalue::i#1 zp byte:8 22.0
(byte) rvalue::i#2 zp byte:8 14.666666666666666
(void()) rvaluevar()
(byte) rvaluevar::b
(byte) rvaluevar::b#0 zp byte:10 Infinity
(byte) rvaluevar::i
(byte) rvaluevar::i#1 zp byte:5 22.0
(byte) rvaluevar::i#2 zp byte:5 8.25
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 zp ptr byte:6 11.0
(byte*) rvaluevar::screen#2 zp ptr byte:6 11.0
zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
zp byte:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
zp byte:8 [ rvalue::i#2 rvalue::i#1 ]
zp byte:9 [ lvalue::i#2 lvalue::i#1 ]
zp byte:10 [ rvaluevar::b#0 ]
zp byte:11 [ rvalue::b#0 ]
zp byte:12 [ rvalue::b#1 ]
zp byte:13 [ rvalue::b#2 ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ] ] with [ zp byte:5 [ rvaluevar::i#2 rvaluevar::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 ] ] with [ zp byte:8 [ rvalue::i#2 rvalue::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 ] ] with [ zp byte:9 [ lvalue::i#2 lvalue::i#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 ] ] with [ zp byte:10 [ rvaluevar::b#0 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 rvaluevar::b#0 ] ] with [ zp byte:11 [ rvalue::b#0 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 rvaluevar::b#0 rvalue::b#0 ] ] with [ zp byte:12 [ rvalue::b#1 ] ]
Coalescing zero page register [ zp byte:2 [ lvaluevar::i#2 lvaluevar::i#1 rvaluevar::i#2 rvaluevar::i#1 rvalue::i#2 rvalue::i#1 lvalue::i#2 lvalue::i#1 rvaluevar::b#0 rvalue::b#0 rvalue::b#1 ] ] with [ zp byte:13 [ rvalue::b#2 ] ]
Coalescing zero page register [ zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] ] with [ zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] ]
Removing instruction jmp BEND
Removing instruction jmp main__B1
Removing instruction jmp main__B2

View File

@ -350,6 +350,22 @@ Found 0 loops in scope []
Found 0 loops in scope [sum]
NATURAL LOOPS WITH DEPTH
VARIABLE REGISTER WEIGHTS
(byte) s1
(byte) s1#0 0.5714285714285714
(byte) s2
(byte) s2#0 4.0
(byte) s3
(byte) s3#0 Infinity
(byte()) sum((byte) sum::a , (byte) sum::b)
(byte) sum::a
(byte) sum::a#2 2.0
(byte) sum::b
(byte) sum::b#2 2.0
(byte) sum::return
(byte) sum::return#0 1.2000000000000002
Initial phi equivalence classes
[ sum::a#2 ]
[ sum::b#2 ]
@ -370,61 +386,6 @@ Allocated zp byte:4 to zp byte:4 [ s1#0 ]
Allocated zp byte:5 to zp byte:5 [ s2#0 ]
Allocated zp byte:6 to zp byte:6 [ s3#0 ]
Allocated zp byte:7 to zp byte:7 [ sum::return#0 ]
VARIABLE REGISTER WEIGHTS
(byte) s1
(byte) s1#0 0.5714285714285714
(byte) s2
(byte) s2#0 4.0
(byte) s3
(byte) s3#0 Infinity
(byte()) sum((byte) sum::a , (byte) sum::b)
(byte) sum::a
(byte) sum::a#2 2.0
(byte) sum::b
(byte) sum::b#2 2.0
(byte) sum::return
(byte) sum::return#0 1.2000000000000002
zp byte:2 [ sum::a#2 ]
zp byte:3 [ sum::b#2 ]
zp byte:4 [ s1#0 ]
zp byte:5 [ s2#0 ]
zp byte:6 [ s3#0 ]
zp byte:7 [ sum::return#0 ]
Uplifting max weight Infinity live range equivalence class zp byte:6 [ s3#0 ]
Register Cycles: reg byte a 0
Uplift to reg byte a succesfull.
Register Cycles: reg byte x 0
Uplift to reg byte x succesfull.
Register Cycles: reg byte y 0
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte) s1
(byte) s1#0 zp byte:4 0.5714285714285714
(byte) s2
(byte) s2#0 zp byte:5 4.0
(byte) s3
(byte) s3#0 zp byte:6 Infinity
(byte()) sum((byte) sum::a , (byte) sum::b)
(byte) sum::a
(byte) sum::a#2 zp byte:2 2.0
(byte) sum::b
(byte) sum::b#2 zp byte:3 2.0
(byte) sum::return
(byte) sum::return#0 zp byte:7 1.2000000000000002
zp byte:2 [ sum::a#2 ]
zp byte:3 [ sum::b#2 ]
zp byte:4 [ s1#0 ]
zp byte:5 [ s2#0 ]
zp byte:6 [ s3#0 ]
zp byte:7 [ sum::return#0 ]
Coalescing zero page register [ zp byte:2 [ sum::a#2 ] ] with [ zp byte:5 [ s2#0 ] ]
Coalescing zero page register [ zp byte:2 [ sum::a#2 s2#0 ] ] with [ zp byte:6 [ s3#0 ] ]
Coalescing zero page register [ zp byte:2 [ sum::a#2 s2#0 s3#0 ] ] with [ zp byte:7 [ sum::return#0 ] ]
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -481,6 +442,35 @@ sum__Breturn:
//SEG18 [7] return [ sum::return#0 s1#0 ]
rts
Uplifting max weight Infinity live range equivalence class zp byte:6 [ s3#0 ]
Uplift to reg byte a succesfull.
Uplift to reg byte x succesfull.
Uplift to reg byte y succesfull.
REGISTER UPLIFTING
(byte) s1
(byte) s1#0 zp byte:4 0.5714285714285714
(byte) s2
(byte) s2#0 zp byte:5 4.0
(byte) s3
(byte) s3#0 zp byte:6 Infinity
(byte()) sum((byte) sum::a , (byte) sum::b)
(byte) sum::a
(byte) sum::a#2 zp byte:2 2.0
(byte) sum::b
(byte) sum::b#2 zp byte:3 2.0
(byte) sum::return
(byte) sum::return#0 zp byte:7 1.2000000000000002
zp byte:2 [ sum::a#2 ]
zp byte:3 [ sum::b#2 ]
zp byte:4 [ s1#0 ]
zp byte:5 [ s2#0 ]
zp byte:6 [ s3#0 ]
zp byte:7 [ sum::return#0 ]
Coalescing zero page register [ zp byte:2 [ sum::a#2 ] ] with [ zp byte:5 [ s2#0 ] ]
Coalescing zero page register [ zp byte:2 [ sum::a#2 s2#0 ] ] with [ zp byte:6 [ s3#0 ] ]
Coalescing zero page register [ zp byte:2 [ sum::a#2 s2#0 s3#0 ] ] with [ zp byte:7 [ sum::return#0 ] ]
Removing instruction jmp B2
Removing instruction jmp B3
Removing instruction jmp BEND

View File

@ -199,19 +199,13 @@ Found 0 loops in scope []
Found 0 loops in scope [main]
NATURAL LOOPS WITH DEPTH
Initial phi equivalence classes
Complete equivalence classes
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(void()) main()
REGISTER UPLIFTING
(byte*) SCREEN
(void()) main()
Initial phi equivalence classes
Complete equivalence classes
INITIAL ASM
//SEG0 @BEGIN
BBEGIN:
@ -231,6 +225,11 @@ main__Breturn:
//SEG6 [2] return [ ]
rts
REGISTER UPLIFTING
(byte*) SCREEN
(void()) main()
Removing instruction jmp BEND
Removing instruction jmp main__Breturn
Succesful ASM optimization Pass5NextJumpElimination