mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-12-19 15:29:48 +00:00
Added constant addition consolidation optimization.
This commit is contained in:
parent
525ac454cc
commit
7b9e80aaac
@ -141,7 +141,7 @@ public class Compiler {
|
||||
optimizations.add(new Pass2SelfPhiElimination(program));
|
||||
optimizations.add(new Pass2ConditionalJumpSimplification(program));
|
||||
optimizations.add(new Pass2ConstantIdentification(program));
|
||||
|
||||
optimizations.add(new Pass2ConstantAdditionElimination(program));
|
||||
pass2OptimizeSSA(program, optimizations);
|
||||
|
||||
// Constant inlining optimizations - as the last step to ensure that constant identification has been completed
|
||||
@ -149,9 +149,6 @@ public class Compiler {
|
||||
constantOptimizations.add(new Pass2ConstantInlining(program));
|
||||
pass2OptimizeSSA(program, constantOptimizations);
|
||||
|
||||
//optimizations.add(new Pass2ConstantPropagation(program));
|
||||
//optimizations.add(new Pass2ConstantAdditionElimination(program));
|
||||
|
||||
}
|
||||
|
||||
private void pass2OptimizeSSA(Program program, List<Pass2SsaOptimization> optimizations) {
|
||||
@ -160,12 +157,15 @@ public class Compiler {
|
||||
pass2AssertSSA(program);
|
||||
ssaOptimized = false;
|
||||
for (Pass2SsaOptimization optimization : optimizations) {
|
||||
boolean stepOptimized = optimization.optimize();
|
||||
if (stepOptimized) {
|
||||
program.getLog().append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + "");
|
||||
ssaOptimized = true;
|
||||
program.getLog().append("CONTROL FLOW GRAPH");
|
||||
program.getLog().append(program.getGraph().toString(program));
|
||||
boolean stepOptimized = true;
|
||||
while (stepOptimized) {
|
||||
stepOptimized = optimization.optimize();
|
||||
if (stepOptimized) {
|
||||
program.getLog().append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + "");
|
||||
ssaOptimized = true;
|
||||
program.getLog().append("CONTROL FLOW GRAPH");
|
||||
program.getLog().append(program.getGraph().toString(program));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,5 @@
|
||||
package dk.camelot64.kickc.icl;
|
||||
|
||||
import sun.jvm.hotspot.asm.Register;
|
||||
|
||||
/** The different registers available for a program */
|
||||
public class Registers {
|
||||
|
||||
|
@ -61,21 +61,21 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
|
||||
|
||||
private boolean optimizePointerDereferenceIndexed(StatementAssignment assignment) {
|
||||
PointerDereferenceIndexed pointerDereferenceIndexed = (PointerDereferenceIndexed) assignment.getlValue();
|
||||
if(pointerDereferenceIndexed.getPointer() instanceof ConstantInteger && pointerDereferenceIndexed.getIndex() instanceof Constant) {
|
||||
ConstantInteger ptrConstant = (ConstantInteger) pointerDereferenceIndexed.getPointer();
|
||||
ConstantInteger idxConstant = (ConstantInteger) pointerDereferenceIndexed.getIndex();
|
||||
int newPtr = ptrConstant.getNumber() + idxConstant.getNumber();
|
||||
assignment.setlValue(new PointerDereferenceSimple(new ConstantInteger(newPtr)));
|
||||
if(pointerDereferenceIndexed.getPointer() instanceof Constant && pointerDereferenceIndexed.getIndex() instanceof Constant) {
|
||||
Constant ptrConstant = (Constant) pointerDereferenceIndexed.getPointer();
|
||||
Constant idxConstant = (Constant) pointerDereferenceIndexed.getIndex();
|
||||
Constant newPtr = new ConstantBinary(ptrConstant, new Operator("+"), idxConstant);
|
||||
assignment.setlValue(new PointerDereferenceSimple(newPtr));
|
||||
getLog().append("Consolidated assigned array index constant in assignment " + assignment.getlValue());
|
||||
return true;
|
||||
}
|
||||
if(pointerDereferenceIndexed.getPointer() instanceof ConstantInteger && pointerDereferenceIndexed.getIndex() instanceof VariableRef) {
|
||||
if(pointerDereferenceIndexed.getPointer() instanceof Constant && pointerDereferenceIndexed.getIndex() instanceof VariableRef) {
|
||||
VariableRef variable = (VariableRef) pointerDereferenceIndexed.getIndex();
|
||||
ConstantInteger consolidated = consolidateSubConstants(variable);
|
||||
Constant consolidated = consolidateSubConstants(variable);
|
||||
if (consolidated != null) {
|
||||
ConstantInteger ptrConstant = (ConstantInteger) pointerDereferenceIndexed.getPointer();
|
||||
int newPtr = ptrConstant.getNumber() + consolidated.getNumber();
|
||||
pointerDereferenceIndexed.setPointer(new ConstantInteger(newPtr));
|
||||
Constant ptrConstant = (Constant) pointerDereferenceIndexed.getPointer();
|
||||
Constant newPtr = new ConstantBinary(ptrConstant, new Operator("+"), consolidated);
|
||||
pointerDereferenceIndexed.setPointer(newPtr);
|
||||
getLog().append("Consolidated assigned array index constant in assignment " + assignment.getlValue());
|
||||
return true;
|
||||
}
|
||||
@ -84,23 +84,23 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
|
||||
}
|
||||
|
||||
private boolean optimizeArrayDeref(StatementAssignment assignment) {
|
||||
if (assignment.getrValue1() instanceof ConstantInteger && assignment.getrValue2() instanceof ConstantInteger) {
|
||||
ConstantInteger ptrConstant = (ConstantInteger) assignment.getrValue1();
|
||||
ConstantInteger idxConstant = (ConstantInteger) assignment.getrValue2();
|
||||
int newPtr = ptrConstant.getNumber() + idxConstant.getNumber();
|
||||
if (assignment.getrValue1() instanceof Constant && assignment.getrValue2() instanceof Constant) {
|
||||
Constant ptrConstant = (Constant) assignment.getrValue1();
|
||||
Constant idxConstant = (Constant) assignment.getrValue2();
|
||||
Constant newPtr = new ConstantBinary(ptrConstant, new Operator("+"), idxConstant);
|
||||
assignment.setrValue1(null);
|
||||
assignment.setOperator(new Operator("*"));
|
||||
assignment.setrValue2(new ConstantInteger(newPtr));
|
||||
assignment.setrValue2(newPtr);
|
||||
getLog().append("Consolidated referenced array index constant in assignment " + assignment.getlValue());
|
||||
return true;
|
||||
}
|
||||
if (assignment.getrValue1() instanceof ConstantInteger && assignment.getrValue2() instanceof VariableRef) {
|
||||
if (assignment.getrValue1() instanceof Constant && assignment.getrValue2() instanceof VariableRef) {
|
||||
VariableRef variable = (VariableRef) assignment.getrValue2();
|
||||
ConstantInteger consolidated = consolidateSubConstants(variable);
|
||||
Constant consolidated = consolidateSubConstants(variable);
|
||||
if (consolidated != null) {
|
||||
ConstantInteger ptrConstant = (ConstantInteger) assignment.getrValue1();
|
||||
int newPtr = ptrConstant.getNumber() + consolidated.getNumber();
|
||||
assignment.setrValue1(new ConstantInteger(newPtr));
|
||||
Constant ptrConstant = (Constant) assignment.getrValue1();
|
||||
Constant newPtr = new ConstantBinary(ptrConstant, new Operator("+"), consolidated);
|
||||
assignment.setrValue1(newPtr);
|
||||
getLog().append("Consolidated referenced array index constant in assignment " + assignment.getlValue());
|
||||
return true;
|
||||
}
|
||||
@ -109,27 +109,23 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
|
||||
}
|
||||
|
||||
private boolean optimizePlus(StatementAssignment assignment) {
|
||||
if (assignment.getrValue1() instanceof ConstantInteger && assignment.getrValue2() instanceof VariableRef) {
|
||||
if (assignment.getrValue1() instanceof Constant && assignment.getrValue2() instanceof VariableRef) {
|
||||
VariableRef variable = (VariableRef) assignment.getrValue2();
|
||||
ConstantInteger consolidated = consolidateSubConstants(variable);
|
||||
Constant consolidated = consolidateSubConstants(variable);
|
||||
if (consolidated != null) {
|
||||
ConstantInteger const1 = (ConstantInteger) assignment.getrValue1();
|
||||
assignment.setrValue1(new ConstantInteger(const1.getNumber() + consolidated.getNumber()));
|
||||
Constant const1 = (Constant) assignment.getrValue1();
|
||||
assignment.setrValue1(new ConstantBinary(const1, new Operator("+"), consolidated));
|
||||
getLog().append("Consolidated constant in assignment " + assignment.getlValue());
|
||||
return true;
|
||||
}
|
||||
} else if (assignment.getrValue1() instanceof VariableRef && assignment.getrValue2() instanceof ConstantInteger) {
|
||||
} else if (assignment.getrValue1() instanceof VariableRef && assignment.getrValue2() instanceof Constant) {
|
||||
VariableRef variable = (VariableRef) assignment.getrValue1();
|
||||
ConstantInteger consolidated = consolidateSubConstants(variable);
|
||||
Constant consolidated = consolidateSubConstants(variable);
|
||||
if (consolidated != null) {
|
||||
ConstantInteger const2 = (ConstantInteger) assignment.getrValue2();
|
||||
int newNumber = const2.getNumber() + consolidated.getNumber();
|
||||
if (newNumber < 0) {
|
||||
assignment.setrValue2(new ConstantInteger(-newNumber));
|
||||
assignment.setOperator(new Operator("-"));
|
||||
} else {
|
||||
assignment.setrValue2(new ConstantInteger(newNumber));
|
||||
}
|
||||
Constant const2 = (Constant) assignment.getrValue2();
|
||||
Constant newNumber = new ConstantBinary(consolidated, new Operator("+"), const2);
|
||||
assignment.setrValue2(newNumber);
|
||||
// Handling of negative consolidated numbers?
|
||||
getLog().append("Consolidated constant in assignment " + assignment.getlValue());
|
||||
return true;
|
||||
}
|
||||
@ -141,41 +137,40 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
|
||||
* Gather up constants from sub addition expressions of a variable, remove them there, and return the aggregated sum.
|
||||
*
|
||||
* @param variable The variable to examine
|
||||
* @return The consolidated constant. Null if no sub-constants were found.
|
||||
* @return The consolidated constant. Null if no sub-constants were found, or if the constants cannot be consolidated.
|
||||
*/
|
||||
private ConstantInteger consolidateSubConstants(VariableRef variable) {
|
||||
private Constant consolidateSubConstants(VariableRef variable) {
|
||||
if(getUsages(variable) >1) {
|
||||
getLog().append("Multiple usages for variable. Not optimizing sub-constant "+variable.toString(getProgram()));
|
||||
return null;
|
||||
}
|
||||
Variable var = getSymbols().getVariable(variable);
|
||||
StatementAssignment assignment = getGraph().getAssignment(variable);
|
||||
if (assignment != null && assignment.getOperator() != null && "+".equals(assignment.getOperator().getOperator())) {
|
||||
if (assignment.getrValue1() instanceof ConstantInteger) {
|
||||
ConstantInteger constant = (ConstantInteger) assignment.getrValue1();
|
||||
if (assignment.getrValue1() instanceof Constant) {
|
||||
Constant constant = (Constant) assignment.getrValue1();
|
||||
assignment.setrValue1(null);
|
||||
assignment.setOperator(null);
|
||||
return constant;
|
||||
} else if (assignment.getrValue2() instanceof ConstantInteger) {
|
||||
ConstantInteger constant = (ConstantInteger) assignment.getrValue2();
|
||||
} else if (assignment.getrValue2() instanceof Constant) {
|
||||
Constant constant = (Constant) assignment.getrValue2();
|
||||
assignment.setrValue2(assignment.getrValue1());
|
||||
assignment.setOperator(null);
|
||||
assignment.setrValue1(null);
|
||||
return constant;
|
||||
} else {
|
||||
ConstantInteger const1 = null;
|
||||
Constant const1 = null;
|
||||
if (assignment.getrValue1() instanceof VariableRef) {
|
||||
const1 = consolidateSubConstants((VariableRef) assignment.getrValue1());
|
||||
}
|
||||
ConstantInteger const2 = null;
|
||||
Constant const2 = null;
|
||||
if (assignment.getrValue2() instanceof VariableRef) {
|
||||
const2 = consolidateSubConstants((VariableRef) assignment.getrValue2());
|
||||
}
|
||||
ConstantInteger result = null;
|
||||
Constant result = null;
|
||||
if (const1 != null) {
|
||||
result = const1;
|
||||
if (const2 != null) {
|
||||
result = new ConstantInteger(const1.getNumber() + const2.getNumber());
|
||||
result = new ConstantBinary(const1, new Operator("+"), const2);
|
||||
}
|
||||
} else if (const2 != null) {
|
||||
result = const2;
|
||||
@ -184,30 +179,30 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
|
||||
}
|
||||
}
|
||||
if (assignment != null && assignment.getOperator() != null && "-".equals(assignment.getOperator().getOperator())) {
|
||||
if (assignment.getrValue1() instanceof ConstantInteger) {
|
||||
ConstantInteger constant = (ConstantInteger) assignment.getrValue1();
|
||||
if (assignment.getrValue1() instanceof Constant) {
|
||||
Constant constant = (Constant) assignment.getrValue1();
|
||||
assignment.setrValue1(null);
|
||||
return constant;
|
||||
} else if (assignment.getrValue2() instanceof ConstantInteger) {
|
||||
ConstantInteger constant = (ConstantInteger) assignment.getrValue2();
|
||||
} else if (assignment.getrValue2() instanceof Constant) {
|
||||
Constant constant = (Constant) assignment.getrValue2();
|
||||
assignment.setrValue2(assignment.getrValue1());
|
||||
assignment.setOperator(null);
|
||||
assignment.setrValue1(null);
|
||||
return new ConstantInteger(-constant.getNumber());
|
||||
return new ConstantUnary(new Operator("-"), constant);
|
||||
} else {
|
||||
ConstantInteger const1 = null;
|
||||
Constant const1 = null;
|
||||
if (assignment.getrValue1() instanceof VariableRef) {
|
||||
const1 = consolidateSubConstants((VariableRef) assignment.getrValue1());
|
||||
}
|
||||
ConstantInteger const2 = null;
|
||||
Constant const2 = null;
|
||||
if (assignment.getrValue2() instanceof VariableRef) {
|
||||
const2 = consolidateSubConstants((VariableRef) assignment.getrValue2());
|
||||
}
|
||||
ConstantInteger result = null;
|
||||
Constant result = null;
|
||||
if (const1 != null) {
|
||||
result = const1;
|
||||
if (const2 != null) {
|
||||
result = new ConstantInteger(const1.getNumber() - const2.getNumber());
|
||||
result = new ConstantBinary(const1, new Operator("-"),const2);
|
||||
}
|
||||
} else if (const2 != null) {
|
||||
result = const2;
|
||||
|
@ -33,7 +33,7 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization {
|
||||
constScope.remove(variable);
|
||||
constScope.add(constantVar);
|
||||
constAliases.put(constRef, constantVar.getRef());
|
||||
getLog().append("Constant " + constantVar.toString(getProgram()));
|
||||
getLog().append("Constant " + constantVar.toString(getProgram()) + " = "+constantVar.getValue());
|
||||
}
|
||||
// Remove assignments to constants in the code
|
||||
removeAssignments(constants.keySet());
|
||||
|
@ -936,12 +936,12 @@ main::@return: scope:[main] from main::@2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte) STAR#0
|
||||
Constant (const byte[1000]) SCREEN#0
|
||||
Constant (const byte) main::x#0
|
||||
Constant (const byte) main::y#0
|
||||
Constant (const byte) main::x1#0
|
||||
Constant (const byte) main::y1#0
|
||||
Constant (const byte) STAR#0 = 81
|
||||
Constant (const byte[1000]) SCREEN#0 = 1024
|
||||
Constant (const byte) main::x#0 = 0
|
||||
Constant (const byte) main::y#0 = 0
|
||||
Constant (const byte) main::x1#0 = 39
|
||||
Constant (const byte) main::y1#0 = 24
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -987,98 +987,11 @@ main::@return: scope:[main] from main::@2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Alias (byte) main::yd#0 = (byte) main::yd#1
|
||||
Alias (byte) main::xd#0 = (byte) main::xd#1
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
(byte) main::xd#0 ← (const byte) main::x1#0 - (const byte) main::x#0
|
||||
(byte) main::yd#0 ← (const byte) main::y1#0 - (const byte) main::y#0
|
||||
(byte) main::e#0 ← (byte) main::yd#0 / (byte) 2
|
||||
(byte~) main::$3 ← (const byte) main::y#0 * (byte) 40
|
||||
(byte*~) main::$4 ← (const byte[1000]) SCREEN#0 + (byte~) main::$3
|
||||
(byte*) main::cursor#0 ← (byte*~) main::$4 + (const byte) main::x#0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2
|
||||
(byte) main::y#2 ← phi( main/(const byte) main::y#0 main::@2/(byte) main::y#4 )
|
||||
(byte) main::x1#2 ← phi( main/(const byte) main::x1#0 )
|
||||
(byte) main::e#3 ← phi( main/(byte) main::e#0 main::@2/(byte) main::e#5 )
|
||||
(byte) main::x#2 ← phi( main/(const byte) main::x#0 main::@2/(byte) main::x#1 )
|
||||
(byte*) main::cursor#3 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#5 )
|
||||
(byte) STAR#1 ← phi( main/(const byte) STAR#0 )
|
||||
*((byte*) main::cursor#3) ← (byte) STAR#1
|
||||
(byte) main::x#1 ← (byte) main::x#2 + (byte) 1
|
||||
(byte*) main::cursor#1 ← (byte*) main::cursor#3 + (byte) 1
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (byte) main::yd#0
|
||||
if((byte) main::xd#0>=(byte) main::e#1) goto main::@2
|
||||
to:main::@3
|
||||
main::@2: scope:[main] from main::@1 main::@3
|
||||
(byte) main::y#4 ← phi( main::@1/(byte) main::y#2 main::@3/(byte) main::y#1 )
|
||||
(byte) main::e#5 ← phi( main::@1/(byte) main::e#1 main::@3/(byte) main::e#2 )
|
||||
(byte*) main::cursor#5 ← phi( main::@1/(byte*) main::cursor#1 main::@3/(byte*) main::cursor#2 )
|
||||
(byte~) main::$14 ← (byte) main::x1#2 + (byte) 1
|
||||
if((byte) main::x#1<(byte~) main::$14) goto main::@1
|
||||
to:main::@return
|
||||
main::@3: scope:[main] from main::@1
|
||||
(byte) main::y#1 ← (byte) main::y#2 + (byte) 1
|
||||
(byte*) main::cursor#2 ← (byte*) main::cursor#1 + (byte) 40
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (byte) main::xd#0
|
||||
to:main::@2
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Redundant Phi (byte) STAR#1 (const byte) STAR#0
|
||||
Redundant Phi (byte) main::x1#2 (const byte) main::x1#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
(byte) main::xd#0 ← (const byte) main::x1#0 - (const byte) main::x#0
|
||||
(byte) main::yd#0 ← (const byte) main::y1#0 - (const byte) main::y#0
|
||||
(byte) main::e#0 ← (byte) main::yd#0 / (byte) 2
|
||||
(byte~) main::$3 ← (const byte) main::y#0 * (byte) 40
|
||||
(byte*~) main::$4 ← (const byte[1000]) SCREEN#0 + (byte~) main::$3
|
||||
(byte*) main::cursor#0 ← (byte*~) main::$4 + (const byte) main::x#0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2
|
||||
(byte) main::y#2 ← phi( main/(const byte) main::y#0 main::@2/(byte) main::y#4 )
|
||||
(byte) main::e#3 ← phi( main/(byte) main::e#0 main::@2/(byte) main::e#5 )
|
||||
(byte) main::x#2 ← phi( main/(const byte) main::x#0 main::@2/(byte) main::x#1 )
|
||||
(byte*) main::cursor#3 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#5 )
|
||||
*((byte*) main::cursor#3) ← (const byte) STAR#0
|
||||
(byte) main::x#1 ← (byte) main::x#2 + (byte) 1
|
||||
(byte*) main::cursor#1 ← (byte*) main::cursor#3 + (byte) 1
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (byte) main::yd#0
|
||||
if((byte) main::xd#0>=(byte) main::e#1) goto main::@2
|
||||
to:main::@3
|
||||
main::@2: scope:[main] from main::@1 main::@3
|
||||
(byte) main::y#4 ← phi( main::@1/(byte) main::y#2 main::@3/(byte) main::y#1 )
|
||||
(byte) main::e#5 ← phi( main::@1/(byte) main::e#1 main::@3/(byte) main::e#2 )
|
||||
(byte*) main::cursor#5 ← phi( main::@1/(byte*) main::cursor#1 main::@3/(byte*) main::cursor#2 )
|
||||
(byte~) main::$14 ← (const byte) main::x1#0 + (byte) 1
|
||||
if((byte) main::x#1<(byte~) main::$14) goto main::@1
|
||||
to:main::@return
|
||||
main::@3: scope:[main] from main::@1
|
||||
(byte) main::y#1 ← (byte) main::y#2 + (byte) 1
|
||||
(byte*) main::cursor#2 ← (byte*) main::cursor#1 + (byte) 40
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (byte) main::xd#0
|
||||
to:main::@2
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte) main::xd#0
|
||||
Constant (const byte) main::yd#0
|
||||
Constant (const byte) main::$3
|
||||
Constant (const byte) main::$14
|
||||
Constant (const byte) main::xd#0 = main::x1#0-main::x#0
|
||||
Constant (const byte) main::yd#0 = main::y1#0-main::y#0
|
||||
Constant (const byte) main::$3 = main::y#0*40
|
||||
Constant (const byte) STAR#1 = STAR#0
|
||||
Constant (const byte) main::x1#2 = main::x1#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -1091,33 +1004,39 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2
|
||||
(byte) main::y#2 ← phi( main/(const byte) main::y#0 main::@2/(byte) main::y#4 )
|
||||
(byte) main::xd#1 ← phi( main/(const byte) main::xd#0 )
|
||||
(byte) main::yd#1 ← phi( main/(const byte) main::yd#0 )
|
||||
(byte) main::e#3 ← phi( main/(byte) main::e#0 main::@2/(byte) main::e#5 )
|
||||
(byte) main::x#2 ← phi( main/(const byte) main::x#0 main::@2/(byte) main::x#1 )
|
||||
(byte*) main::cursor#3 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#5 )
|
||||
*((byte*) main::cursor#3) ← (const byte) STAR#0
|
||||
*((byte*) main::cursor#3) ← (const byte) STAR#1
|
||||
(byte) main::x#1 ← (byte) main::x#2 + (byte) 1
|
||||
(byte*) main::cursor#1 ← (byte*) main::cursor#3 + (byte) 1
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (const byte) main::yd#0
|
||||
if((const byte) main::xd#0>=(byte) main::e#1) goto main::@2
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (byte) main::yd#1
|
||||
if((byte) main::xd#1>=(byte) main::e#1) goto main::@2
|
||||
to:main::@3
|
||||
main::@2: scope:[main] from main::@1 main::@3
|
||||
(byte) main::y#4 ← phi( main::@1/(byte) main::y#2 main::@3/(byte) main::y#1 )
|
||||
(byte) main::e#5 ← phi( main::@1/(byte) main::e#1 main::@3/(byte) main::e#2 )
|
||||
(byte*) main::cursor#5 ← phi( main::@1/(byte*) main::cursor#1 main::@3/(byte*) main::cursor#2 )
|
||||
if((byte) main::x#1<(const byte) main::$14) goto main::@1
|
||||
(byte~) main::$14 ← (const byte) main::x1#2 + (byte) 1
|
||||
if((byte) main::x#1<(byte~) main::$14) goto main::@1
|
||||
to:main::@return
|
||||
main::@3: scope:[main] from main::@1
|
||||
(byte) main::y#1 ← (byte) main::y#2 + (byte) 1
|
||||
(byte*) main::cursor#2 ← (byte*) main::cursor#1 + (byte) 40
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (const byte) main::xd#0
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (byte) main::xd#1
|
||||
to:main::@2
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte) main::e#0
|
||||
Constant (const byte*) main::$4
|
||||
Constant (const byte) main::e#0 = main::yd#0/2
|
||||
Constant (const byte*) main::$4 = SCREEN#0+main::$3
|
||||
Constant (const byte) main::yd#1 = main::yd#0
|
||||
Constant (const byte) main::xd#1 = main::xd#0
|
||||
Constant (const byte) main::$14 = main::x1#2+1
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -1131,11 +1050,11 @@ main::@1: scope:[main] from main main::@2
|
||||
(byte) main::e#3 ← phi( main/(const byte) main::e#0 main::@2/(byte) main::e#5 )
|
||||
(byte) main::x#2 ← phi( main/(const byte) main::x#0 main::@2/(byte) main::x#1 )
|
||||
(byte*) main::cursor#3 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#5 )
|
||||
*((byte*) main::cursor#3) ← (const byte) STAR#0
|
||||
*((byte*) main::cursor#3) ← (const byte) STAR#1
|
||||
(byte) main::x#1 ← (byte) main::x#2 + (byte) 1
|
||||
(byte*) main::cursor#1 ← (byte*) main::cursor#3 + (byte) 1
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (const byte) main::yd#0
|
||||
if((const byte) main::xd#0>=(byte) main::e#1) goto main::@2
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (const byte) main::yd#1
|
||||
if((const byte) main::xd#1>=(byte) main::e#1) goto main::@2
|
||||
to:main::@3
|
||||
main::@2: scope:[main] from main::@1 main::@3
|
||||
(byte) main::y#4 ← phi( main::@1/(byte) main::y#2 main::@3/(byte) main::y#1 )
|
||||
@ -1146,14 +1065,14 @@ main::@2: scope:[main] from main::@1 main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
(byte) main::y#1 ← (byte) main::y#2 + (byte) 1
|
||||
(byte*) main::cursor#2 ← (byte*) main::cursor#1 + (byte) 40
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (const byte) main::xd#0
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (const byte) main::xd#1
|
||||
to:main::@2
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) main::cursor#0
|
||||
Constant (const byte*) main::cursor#0 = main::$4+main::x#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -1166,11 +1085,11 @@ main::@1: scope:[main] from main main::@2
|
||||
(byte) main::e#3 ← phi( main/(const byte) main::e#0 main::@2/(byte) main::e#5 )
|
||||
(byte) main::x#2 ← phi( main/(const byte) main::x#0 main::@2/(byte) main::x#1 )
|
||||
(byte*) main::cursor#3 ← phi( main/(const byte*) main::cursor#0 main::@2/(byte*) main::cursor#5 )
|
||||
*((byte*) main::cursor#3) ← (const byte) STAR#0
|
||||
*((byte*) main::cursor#3) ← (const byte) STAR#1
|
||||
(byte) main::x#1 ← (byte) main::x#2 + (byte) 1
|
||||
(byte*) main::cursor#1 ← (byte*) main::cursor#3 + (byte) 1
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (const byte) main::yd#0
|
||||
if((const byte) main::xd#0>=(byte) main::e#1) goto main::@2
|
||||
(byte) main::e#1 ← (byte) main::e#3 + (const byte) main::yd#1
|
||||
if((const byte) main::xd#1>=(byte) main::e#1) goto main::@2
|
||||
to:main::@3
|
||||
main::@2: scope:[main] from main::@1 main::@3
|
||||
(byte) main::y#4 ← phi( main::@1/(byte) main::y#2 main::@3/(byte) main::y#1 )
|
||||
@ -1181,20 +1100,28 @@ main::@2: scope:[main] from main::@1 main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
(byte) main::y#1 ← (byte) main::y#2 + (byte) 1
|
||||
(byte*) main::cursor#2 ← (byte*) main::cursor#1 + (byte) 40
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (const byte) main::xd#0
|
||||
(byte) main::e#2 ← (byte) main::e#1 - (const byte) main::xd#1
|
||||
to:main::@2
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::y#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte*) main::cursor#1
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::y#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte*) main::cursor#1
|
||||
Constant inlined main::$3 = (byte) 0*(byte) 40
|
||||
Constant inlined main::$4 = (const byte[1000]) SCREEN#0+(byte) 0*(byte) 40
|
||||
Constant inlined main::xd#1 = (const byte) main::xd#0
|
||||
Constant inlined main::x#0 = (byte) 0
|
||||
Constant inlined STAR#1 = (const byte) STAR#0
|
||||
Constant inlined main::x1#2 = (const byte) main::x1#0
|
||||
Constant inlined main::cursor#0 = (const byte[1000]) SCREEN#0+(byte) 0*(byte) 40+(byte) 0
|
||||
Constant inlined main::$14 = (const byte) main::x1#0+(byte) 1
|
||||
Constant inlined main::y#0 = (byte) 0
|
||||
Constant inlined main::e#0 = (const byte) main::yd#0/(byte) 2
|
||||
Constant inlined main::yd#1 = (const byte) main::yd#0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
|
@ -767,12 +767,12 @@ CONTROL FLOW GRAPH
|
||||
to:@2
|
||||
@end: scope:[] from @2
|
||||
|
||||
Constant (const byte) STAR#0
|
||||
Constant (const byte[1000]) screen#0
|
||||
Constant (const byte) x#0
|
||||
Constant (const byte) y#0
|
||||
Constant (const byte) x1#0
|
||||
Constant (const byte) y1#0
|
||||
Constant (const byte) STAR#0 = 81
|
||||
Constant (const byte[1000]) screen#0 = 1024
|
||||
Constant (const byte) x#0 = 0
|
||||
Constant (const byte) y#0 = 0
|
||||
Constant (const byte) x1#0 = 39
|
||||
Constant (const byte) y1#0 = 24
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -812,86 +812,12 @@ CONTROL FLOW GRAPH
|
||||
to:@2
|
||||
@end: scope:[] from @2
|
||||
|
||||
Alias (byte) yd#0 = (byte) yd#1
|
||||
Alias (byte) xd#0 = (byte) xd#1
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte) xd#0 ← (const byte) x1#0 - (const byte) x#0
|
||||
(byte) yd#0 ← (const byte) y1#0 - (const byte) y#0
|
||||
(byte) e#0 ← (byte) yd#0 / (byte) 2
|
||||
(byte~) $3 ← (const byte) y#0 * (byte) 40
|
||||
(word) idx#0 ← (const byte) x#0 + (byte~) $3
|
||||
to:@1
|
||||
@1: scope:[] from @2 @begin
|
||||
(byte) y#2 ← phi( @2/(byte) y#4 @begin/(const byte) y#0 )
|
||||
(byte) x1#2 ← phi( @begin/(const byte) x1#0 )
|
||||
(byte) e#3 ← phi( @2/(byte) e#5 @begin/(byte) e#0 )
|
||||
(byte) x#2 ← phi( @2/(byte) x#1 @begin/(const byte) x#0 )
|
||||
(word) idx#3 ← phi( @2/(word) idx#5 @begin/(word) idx#0 )
|
||||
(byte[1000]) screen#1 ← phi( @begin/(const byte[1000]) screen#0 )
|
||||
(byte) STAR#1 ← phi( @begin/(const byte) STAR#0 )
|
||||
*((byte[1000]) screen#1 + (word) idx#3) ← (byte) STAR#1
|
||||
(byte) x#1 ← (byte) x#2 + (byte) 1
|
||||
(word) idx#1 ← (word) idx#3 + (byte) 1
|
||||
(byte) e#1 ← (byte) e#3 + (byte) yd#0
|
||||
if((byte) xd#0>=(byte) e#1) goto @2
|
||||
to:@3
|
||||
@2: scope:[] from @1 @3
|
||||
(byte) y#4 ← phi( @1/(byte) y#2 @3/(byte) y#1 )
|
||||
(byte) e#5 ← phi( @1/(byte) e#1 @3/(byte) e#2 )
|
||||
(word) idx#5 ← phi( @1/(word) idx#1 @3/(word) idx#2 )
|
||||
(byte~) $13 ← (byte) x1#2 + (byte) 1
|
||||
if((byte) x#1<(byte~) $13) goto @1
|
||||
to:@end
|
||||
@3: scope:[] from @1
|
||||
(byte) y#1 ← (byte) y#2 + (byte) 1
|
||||
(word) idx#2 ← (word) idx#1 + (byte) 40
|
||||
(byte) e#2 ← (byte) e#1 - (byte) xd#0
|
||||
to:@2
|
||||
@end: scope:[] from @2
|
||||
|
||||
Redundant Phi (byte) STAR#1 (const byte) STAR#0
|
||||
Redundant Phi (byte[1000]) screen#1 (const byte[1000]) screen#0
|
||||
Redundant Phi (byte) x1#2 (const byte) x1#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte) xd#0 ← (const byte) x1#0 - (const byte) x#0
|
||||
(byte) yd#0 ← (const byte) y1#0 - (const byte) y#0
|
||||
(byte) e#0 ← (byte) yd#0 / (byte) 2
|
||||
(byte~) $3 ← (const byte) y#0 * (byte) 40
|
||||
(word) idx#0 ← (const byte) x#0 + (byte~) $3
|
||||
to:@1
|
||||
@1: scope:[] from @2 @begin
|
||||
(byte) y#2 ← phi( @2/(byte) y#4 @begin/(const byte) y#0 )
|
||||
(byte) e#3 ← phi( @2/(byte) e#5 @begin/(byte) e#0 )
|
||||
(byte) x#2 ← phi( @2/(byte) x#1 @begin/(const byte) x#0 )
|
||||
(word) idx#3 ← phi( @2/(word) idx#5 @begin/(word) idx#0 )
|
||||
*((const byte[1000]) screen#0 + (word) idx#3) ← (const byte) STAR#0
|
||||
(byte) x#1 ← (byte) x#2 + (byte) 1
|
||||
(word) idx#1 ← (word) idx#3 + (byte) 1
|
||||
(byte) e#1 ← (byte) e#3 + (byte) yd#0
|
||||
if((byte) xd#0>=(byte) e#1) goto @2
|
||||
to:@3
|
||||
@2: scope:[] from @1 @3
|
||||
(byte) y#4 ← phi( @1/(byte) y#2 @3/(byte) y#1 )
|
||||
(byte) e#5 ← phi( @1/(byte) e#1 @3/(byte) e#2 )
|
||||
(word) idx#5 ← phi( @1/(word) idx#1 @3/(word) idx#2 )
|
||||
(byte~) $13 ← (const byte) x1#0 + (byte) 1
|
||||
if((byte) x#1<(byte~) $13) goto @1
|
||||
to:@end
|
||||
@3: scope:[] from @1
|
||||
(byte) y#1 ← (byte) y#2 + (byte) 1
|
||||
(word) idx#2 ← (word) idx#1 + (byte) 40
|
||||
(byte) e#2 ← (byte) e#1 - (byte) xd#0
|
||||
to:@2
|
||||
@end: scope:[] from @2
|
||||
|
||||
Constant (const byte) xd#0
|
||||
Constant (const byte) yd#0
|
||||
Constant (const byte) $3
|
||||
Constant (const byte) $13
|
||||
Constant (const byte) xd#0 = x1#0-x#0
|
||||
Constant (const byte) yd#0 = y1#0-y#0
|
||||
Constant (const byte) $3 = y#0*40
|
||||
Constant (const byte) STAR#1 = STAR#0
|
||||
Constant (const byte[1000]) screen#1 = screen#0
|
||||
Constant (const byte) x1#2 = x1#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -900,30 +826,36 @@ CONTROL FLOW GRAPH
|
||||
to:@1
|
||||
@1: scope:[] from @2 @begin
|
||||
(byte) y#2 ← phi( @2/(byte) y#4 @begin/(const byte) y#0 )
|
||||
(byte) xd#1 ← phi( @begin/(const byte) xd#0 )
|
||||
(byte) yd#1 ← phi( @begin/(const byte) yd#0 )
|
||||
(byte) e#3 ← phi( @2/(byte) e#5 @begin/(byte) e#0 )
|
||||
(byte) x#2 ← phi( @2/(byte) x#1 @begin/(const byte) x#0 )
|
||||
(word) idx#3 ← phi( @2/(word) idx#5 @begin/(word) idx#0 )
|
||||
*((const byte[1000]) screen#0 + (word) idx#3) ← (const byte) STAR#0
|
||||
*((const byte[1000]) screen#1 + (word) idx#3) ← (const byte) STAR#1
|
||||
(byte) x#1 ← (byte) x#2 + (byte) 1
|
||||
(word) idx#1 ← (word) idx#3 + (byte) 1
|
||||
(byte) e#1 ← (byte) e#3 + (const byte) yd#0
|
||||
if((const byte) xd#0>=(byte) e#1) goto @2
|
||||
(byte) e#1 ← (byte) e#3 + (byte) yd#1
|
||||
if((byte) xd#1>=(byte) e#1) goto @2
|
||||
to:@3
|
||||
@2: scope:[] from @1 @3
|
||||
(byte) y#4 ← phi( @1/(byte) y#2 @3/(byte) y#1 )
|
||||
(byte) e#5 ← phi( @1/(byte) e#1 @3/(byte) e#2 )
|
||||
(word) idx#5 ← phi( @1/(word) idx#1 @3/(word) idx#2 )
|
||||
if((byte) x#1<(const byte) $13) goto @1
|
||||
(byte~) $13 ← (const byte) x1#2 + (byte) 1
|
||||
if((byte) x#1<(byte~) $13) goto @1
|
||||
to:@end
|
||||
@3: scope:[] from @1
|
||||
(byte) y#1 ← (byte) y#2 + (byte) 1
|
||||
(word) idx#2 ← (word) idx#1 + (byte) 40
|
||||
(byte) e#2 ← (byte) e#1 - (const byte) xd#0
|
||||
(byte) e#2 ← (byte) e#1 - (byte) xd#1
|
||||
to:@2
|
||||
@end: scope:[] from @2
|
||||
|
||||
Constant (const byte) e#0
|
||||
Constant (const word) idx#0
|
||||
Constant (const byte) e#0 = yd#0/2
|
||||
Constant (const word) idx#0 = x#0+$3
|
||||
Constant (const byte) yd#1 = yd#0
|
||||
Constant (const byte) xd#1 = xd#0
|
||||
Constant (const byte) $13 = x1#2+1
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -933,11 +865,11 @@ CONTROL FLOW GRAPH
|
||||
(byte) e#3 ← phi( @2/(byte) e#5 @begin/(const byte) e#0 )
|
||||
(byte) x#2 ← phi( @2/(byte) x#1 @begin/(const byte) x#0 )
|
||||
(word) idx#3 ← phi( @2/(word) idx#5 @begin/(const word) idx#0 )
|
||||
*((const byte[1000]) screen#0 + (word) idx#3) ← (const byte) STAR#0
|
||||
*((const byte[1000]) screen#1 + (word) idx#3) ← (const byte) STAR#1
|
||||
(byte) x#1 ← (byte) x#2 + (byte) 1
|
||||
(word) idx#1 ← (word) idx#3 + (byte) 1
|
||||
(byte) e#1 ← (byte) e#3 + (const byte) yd#0
|
||||
if((const byte) xd#0>=(byte) e#1) goto @2
|
||||
(byte) e#1 ← (byte) e#3 + (const byte) yd#1
|
||||
if((const byte) xd#1>=(byte) e#1) goto @2
|
||||
to:@3
|
||||
@2: scope:[] from @1 @3
|
||||
(byte) y#4 ← phi( @1/(byte) y#2 @3/(byte) y#1 )
|
||||
@ -948,14 +880,23 @@ CONTROL FLOW GRAPH
|
||||
@3: scope:[] from @1
|
||||
(byte) y#1 ← (byte) y#2 + (byte) 1
|
||||
(word) idx#2 ← (word) idx#1 + (byte) 40
|
||||
(byte) e#2 ← (byte) e#1 - (const byte) xd#0
|
||||
(byte) e#2 ← (byte) e#1 - (const byte) xd#1
|
||||
to:@2
|
||||
@end: scope:[] from @2
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) y#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (word) idx#1
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) y#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (word) idx#1
|
||||
Constant inlined yd#1 = (const byte) yd#0
|
||||
Constant inlined $13 = (const byte) x1#0+(byte) 1
|
||||
Constant inlined x1#2 = (const byte) x1#0
|
||||
Constant inlined e#0 = (const byte) yd#0/(byte) 2
|
||||
Constant inlined xd#1 = (const byte) xd#0
|
||||
Constant inlined y#0 = (byte) 0
|
||||
Constant inlined idx#0 = (byte) 0+(byte) 0*(byte) 40
|
||||
Constant inlined screen#1 = (const byte[1000]) screen#0
|
||||
Constant inlined STAR#1 = (const byte) STAR#0
|
||||
Constant inlined x#0 = (byte) 0
|
||||
Constant inlined $3 = (byte) 0*(byte) 40
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
|
@ -402,12 +402,12 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) SCREEN#0
|
||||
Constant (const byte) STAR#0
|
||||
Constant (const byte*) VIC#0
|
||||
Constant (const byte) $0
|
||||
Constant (const byte) RED#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte*) SCREEN#0 = 1024
|
||||
Constant (const byte) STAR#0 = 81
|
||||
Constant (const byte*) VIC#0 = 53248
|
||||
Constant (const byte) $0 = 16*2
|
||||
Constant (const byte) RED#0 = 2
|
||||
Constant (const byte) main::i#0 = 40
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -433,33 +433,9 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Redundant Phi (byte) STAR#2 (const byte) STAR#0
|
||||
Redundant Phi (byte*) SCREEN#2 (const byte*) SCREEN#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte*~) $1 ← (const byte*) VIC#0 + (const byte) $0
|
||||
(byte*) BGCOL#0 ← (byte*~) $1 + (byte) 1
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((const byte*) SCREEN#0) ← (const byte) STAR#0
|
||||
*((byte*) BGCOL#0) ← (const byte) RED#0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (const byte) STAR#0 + (byte) 1
|
||||
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 80) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) $1
|
||||
Constant (const byte) main::$0
|
||||
Constant (const byte*) $1 = VIC#0+$0
|
||||
Constant (const byte) STAR#2 = STAR#0
|
||||
Constant (const byte*) SCREEN#2 = SCREEN#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -472,7 +448,8 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (const byte) main::$0
|
||||
(byte~) main::$0 ← (const byte) STAR#2 + (byte) 1
|
||||
*((const byte*) SCREEN#2 + (byte) main::i#2) ← (byte~) main::$0
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 80) goto main::@1
|
||||
to:main::@return
|
||||
@ -481,7 +458,8 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) BGCOL#0
|
||||
Constant (const byte*) BGCOL#0 = $1+1
|
||||
Constant (const byte) main::$0 = STAR#2+1
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -493,7 +471,7 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (const byte) main::$0
|
||||
*((const byte*) SCREEN#2 + (byte) main::i#2) ← (const byte) main::$0
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 80) goto main::@1
|
||||
to:main::@return
|
||||
@ -502,6 +480,8 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant inlined SCREEN#2 = (const byte*) SCREEN#0
|
||||
Constant inlined STAR#2 = (const byte) STAR#0
|
||||
Constant inlined $1 = (const byte*) VIC#0+(byte) 16*(byte) 2
|
||||
Constant inlined $0 = (byte) 16*(byte) 2
|
||||
Constant inlined main::i#0 = (byte) 40
|
||||
|
@ -1,15 +1,16 @@
|
||||
.const fibs = $1100
|
||||
jsr main
|
||||
main: {
|
||||
lda #$0
|
||||
sta $1100
|
||||
sta fibs+$0
|
||||
lda #$1
|
||||
sta $1101
|
||||
sta fibs+$1
|
||||
ldx #$0
|
||||
b1:
|
||||
lda $1100,x
|
||||
lda fibs,x
|
||||
clc
|
||||
adc $1101,x
|
||||
sta $1102,x
|
||||
adc fibs+$1,x
|
||||
sta fibs+$2,x
|
||||
inx
|
||||
cpx #$f
|
||||
bcc b1
|
||||
|
@ -3,15 +3,15 @@
|
||||
to:@end
|
||||
@end: scope:[] from @begin
|
||||
main: scope:[main] from @begin
|
||||
[1] *((word) 4352) ← (byte) 0 [ ]
|
||||
[2] *((word) 4353) ← (byte) 1 [ ]
|
||||
[1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ]
|
||||
[2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ]
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[3] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ]
|
||||
[4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
|
||||
[5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
[4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
|
||||
[5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
[6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ]
|
||||
[7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
|
||||
[7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
|
||||
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
|
||||
[9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ]
|
||||
to:main::@return
|
||||
|
@ -250,51 +250,21 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (byte[15]) fibs#0 (word) 4352
|
||||
Constant (byte) main::i#0 (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantPropagation
|
||||
Alias (byte[15]) fibs#0 = (byte[15]) fibs#1
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte[15]) fibs#0 ← (word) 4352
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
(byte[15]) fibs#1 ← phi( @begin/(word) 4352 )
|
||||
*((byte[15]) fibs#1 + (byte) 0) ← (byte) 0
|
||||
*((byte[15]) fibs#1 + (byte) 1) ← (byte) 1
|
||||
*((byte[15]) fibs#0 + (byte) 0) ← (byte) 0
|
||||
*((byte[15]) fibs#0 + (byte) 1) ← (byte) 1
|
||||
(byte) main::i#0 ← (byte) 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#1 main::@1/(byte[15]) fibs#2 )
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (byte) main::i#2 + (byte) 2
|
||||
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$2 ← (byte) main::i#2 + (byte) 1
|
||||
(byte~) main::$3 ← (byte[15]) fibs#2 *idx (byte~) main::$2
|
||||
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
|
||||
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
(boolean~) main::$5 ← (byte) main::i#1 < (byte) 15
|
||||
if((boolean~) main::$5) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Redundant Phi (byte[15]) fibs#1 (word) 4352
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((word) 4352 + (byte) 0) ← (byte) 0
|
||||
*((word) 4352 + (byte) 1) ← (byte) 1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte[15]) fibs#2 ← phi( main/(word) 4352 main::@1/(byte[15]) fibs#2 )
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#0 main::@1/(byte[15]) fibs#2 )
|
||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (byte) main::i#2 + (byte) 2
|
||||
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$2 ← (byte) main::i#2 + (byte) 1
|
||||
@ -314,15 +284,17 @@ Self Phi Eliminated (byte[15]) fibs#2
|
||||
Succesful SSA optimization Pass2SelfPhiElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte[15]) fibs#0 ← (word) 4352
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((word) 4352 + (byte) 0) ← (byte) 0
|
||||
*((word) 4352 + (byte) 1) ← (byte) 1
|
||||
*((byte[15]) fibs#0 + (byte) 0) ← (byte) 0
|
||||
*((byte[15]) fibs#0 + (byte) 1) ← (byte) 1
|
||||
(byte) main::i#0 ← (byte) 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte[15]) fibs#2 ← phi( main/(word) 4352 )
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#0 )
|
||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (byte) main::i#2 + (byte) 2
|
||||
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$2 ← (byte) main::i#2 + (byte) 1
|
||||
@ -342,15 +314,17 @@ Simple Condition (boolean~) main::$5 if((byte) main::i#1<(byte) 15) goto main::@
|
||||
Succesful SSA optimization Pass2ConditionalJumpSimplification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte[15]) fibs#0 ← (word) 4352
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((word) 4352 + (byte) 0) ← (byte) 0
|
||||
*((word) 4352 + (byte) 1) ← (byte) 1
|
||||
*((byte[15]) fibs#0 + (byte) 0) ← (byte) 0
|
||||
*((byte[15]) fibs#0 + (byte) 1) ← (byte) 1
|
||||
(byte) main::i#0 ← (byte) 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte[15]) fibs#2 ← phi( main/(word) 4352 )
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#0 )
|
||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (byte) main::i#2 + (byte) 2
|
||||
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$2 ← (byte) main::i#2 + (byte) 1
|
||||
@ -365,24 +339,26 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (byte[15]) fibs#2 (word) 4352
|
||||
Succesful SSA optimization Pass2ConstantPropagation
|
||||
Constant (const byte[15]) fibs#0 = 4352
|
||||
Constant (const byte) main::i#0 = 0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((word) 4352 + (byte) 0) ← (byte) 0
|
||||
*((word) 4352 + (byte) 1) ← (byte) 1
|
||||
*((const byte[15]) fibs#0 + (byte) 0) ← (byte) 0
|
||||
*((const byte[15]) fibs#0 + (byte) 1) ← (byte) 1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte[15]) fibs#2 ← phi( main/(const byte[15]) fibs#0 )
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (byte) main::i#2 + (byte) 2
|
||||
(byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2
|
||||
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$2 ← (byte) main::i#2 + (byte) 1
|
||||
(byte~) main::$3 ← (word) 4352 *idx (byte~) main::$2
|
||||
(byte~) main::$3 ← (byte[15]) fibs#2 *idx (byte~) main::$2
|
||||
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
|
||||
*((word) 4352 + (byte~) main::$0) ← (byte~) main::$4
|
||||
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1<(byte) 15) goto main::@1
|
||||
to:main::@return
|
||||
@ -391,30 +367,56 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Consolidated assigned array index constant in assignment *(4352)
|
||||
Consolidated assigned array index constant in assignment *(4353)
|
||||
Constant (const byte[15]) fibs#2 = fibs#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((const byte[15]) fibs#0 + (byte) 0) ← (byte) 0
|
||||
*((const byte[15]) fibs#0 + (byte) 1) ← (byte) 1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (byte) main::i#2 + (byte) 2
|
||||
(byte~) main::$1 ← (const byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$2 ← (byte) main::i#2 + (byte) 1
|
||||
(byte~) main::$3 ← (const byte[15]) fibs#2 *idx (byte~) main::$2
|
||||
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
|
||||
*((const byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1<(byte) 15) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Consolidated assigned array index constant in assignment *(fibs#0+0)
|
||||
Consolidated assigned array index constant in assignment *(fibs#0+1)
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Consolidated referenced array index constant in assignment main::$3
|
||||
Consolidated assigned array index constant in assignment *(4354 + main::$0)
|
||||
Consolidated assigned array index constant in assignment *(fibs#2+2 + main::$0)
|
||||
Succesful SSA optimization Pass2ConstantAdditionElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((word) 4352) ← (byte) 0
|
||||
*((word) 4353) ← (byte) 1
|
||||
*((const byte[15]) fibs#0+(byte) 0) ← (byte) 0
|
||||
*((const byte[15]) fibs#0+(byte) 1) ← (byte) 1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$0 ← (byte) main::i#2
|
||||
(byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2
|
||||
(byte~) main::$1 ← (const byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$2 ← (byte) main::i#2
|
||||
(byte~) main::$3 ← (word) 4353 *idx (byte~) main::$2
|
||||
(byte~) main::$3 ← (const byte[15]) fibs#2+(byte) 1 *idx (byte~) main::$2
|
||||
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
|
||||
*((word) 4354 + (byte~) main::$0) ← (byte~) main::$4
|
||||
*((const byte[15]) fibs#2+(byte) 2 + (byte~) main::$0) ← (byte~) main::$4
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1<(byte) 15) goto main::@1
|
||||
to:main::@return
|
||||
@ -423,6 +425,7 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Alias (byte) main::i#2 = (byte~) main::$0 (byte~) main::$2
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@ -430,15 +433,15 @@ CONTROL FLOW GRAPH
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((word) 4352) ← (byte) 0
|
||||
*((word) 4353) ← (byte) 1
|
||||
*((const byte[15]) fibs#0+(byte) 0) ← (byte) 0
|
||||
*((const byte[15]) fibs#0+(byte) 1) ← (byte) 1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2
|
||||
(byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$1 ← (const byte[15]) fibs#2 *idx (byte) main::i#2
|
||||
(byte~) main::$3 ← (const byte[15]) fibs#2+(byte) 1 *idx (byte) main::i#2
|
||||
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
|
||||
*((word) 4354 + (byte) main::i#2) ← (byte~) main::$4
|
||||
*((const byte[15]) fibs#2+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1<(byte) 15) goto main::@1
|
||||
to:main::@return
|
||||
@ -450,10 +453,39 @@ main::@return: scope:[main] from main::@1
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Constant inlined fibs#2 = (const byte[15]) fibs#0
|
||||
Constant inlined main::i#0 = (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
*((const byte[15]) fibs#0+(byte) 0) ← (byte) 0
|
||||
*((const byte[15]) fibs#0+(byte) 1) ← (byte) 1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
(byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2
|
||||
(byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2
|
||||
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
|
||||
*((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1<(byte) 15) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[15]) fibs
|
||||
(const byte[15]) fibs#0 = (word) 4352
|
||||
(void()) main()
|
||||
(byte~) main::$1
|
||||
(byte~) main::$3
|
||||
@ -473,15 +505,15 @@ CONTROL FLOW GRAPH - PHI LIFTED
|
||||
to:@end
|
||||
@end: scope:[] from @begin
|
||||
main: scope:[main] from @begin
|
||||
*((word) 4352) ← (byte) 0
|
||||
*((word) 4353) ← (byte) 1
|
||||
*((const byte[15]) fibs#0+(byte) 0) ← (byte) 0
|
||||
*((const byte[15]) fibs#0+(byte) 1) ← (byte) 1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@3
|
||||
(byte) main::i#2 ← phi( main/(byte) 0 main::@3/(byte~) main::i#3 )
|
||||
(byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2
|
||||
(byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2
|
||||
(byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2
|
||||
(byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2
|
||||
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
|
||||
*((word) 4354 + (byte) main::i#2) ← (byte~) main::$4
|
||||
*((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1<(byte) 15) goto main::@3
|
||||
to:main::@return
|
||||
@ -504,15 +536,15 @@ CONTROL FLOW GRAPH - LIVE RANGES FOUND
|
||||
to:@end
|
||||
@end: scope:[] from @begin
|
||||
main: scope:[main] from @begin
|
||||
[1] *((word) 4352) ← (byte) 0 [ ]
|
||||
[2] *((word) 4353) ← (byte) 1 [ ]
|
||||
[1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ]
|
||||
[2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ]
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@3
|
||||
[3] (byte) main::i#2 ← phi( main/(byte) 0 main::@3/(byte~) main::i#3 ) [ main::i#2 ]
|
||||
[4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
|
||||
[5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
[4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
|
||||
[5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
[6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ]
|
||||
[7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
|
||||
[7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
|
||||
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
|
||||
[9] if((byte) main::i#1<(byte) 15) goto main::@3 [ main::i#1 ]
|
||||
to:main::@return
|
||||
@ -537,15 +569,15 @@ CONTROL FLOW GRAPH - PHI MEM COALESCED
|
||||
to:@end
|
||||
@end: scope:[] from @begin
|
||||
main: scope:[main] from @begin
|
||||
[1] *((word) 4352) ← (byte) 0 [ ]
|
||||
[2] *((word) 4353) ← (byte) 1 [ ]
|
||||
[1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ]
|
||||
[2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ]
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[3] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ]
|
||||
[4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
|
||||
[5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
[4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
|
||||
[5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
[6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ]
|
||||
[7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
|
||||
[7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
|
||||
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
|
||||
[9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ]
|
||||
to:main::@return
|
||||
@ -597,7 +629,8 @@ Allocated zp ZP_BYTE:3 [ main::$1 ]
|
||||
Allocated zp ZP_BYTE:4 [ main::$3 ]
|
||||
Allocated zp ZP_BYTE:5 [ main::$4 ]
|
||||
INITIAL ASM
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const fibs = $1100
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
@ -611,12 +644,12 @@ main: {
|
||||
.label _3 = 4
|
||||
.label _4 = 5
|
||||
.label i = 2
|
||||
//SEG5 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
//SEG5 [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
lda #$0
|
||||
sta $1100
|
||||
//SEG6 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
sta fibs+$0
|
||||
//SEG6 [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
lda #$1
|
||||
sta $1101
|
||||
sta fibs+$1
|
||||
//SEG7 [3] phi from main to main::@1
|
||||
b1_from_main:
|
||||
//SEG8 [3] phi (byte) main::i#2 = (byte) 0 -- zpby1=coby1
|
||||
@ -629,23 +662,23 @@ main: {
|
||||
jmp b1
|
||||
//SEG11 main::@1
|
||||
b1:
|
||||
//SEG12 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- zpby1=cowo1_staridx_zpby2
|
||||
//SEG12 [4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- zpby1=cowo1_staridx_zpby2
|
||||
ldx i
|
||||
lda $1100,x
|
||||
lda fibs,x
|
||||
sta _1
|
||||
//SEG13 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] -- zpby1=cowo1_staridx_zpby2
|
||||
//SEG13 [5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] -- zpby1=cowo1_staridx_zpby2
|
||||
ldx i
|
||||
lda $1101,x
|
||||
lda fibs+$1,x
|
||||
sta _3
|
||||
//SEG14 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- zpby1=zpby2_plus_zpby3
|
||||
lda _1
|
||||
clc
|
||||
adc _3
|
||||
sta _4
|
||||
//SEG15 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_zpby1=zpby2
|
||||
//SEG15 [7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_zpby1=zpby2
|
||||
lda _4
|
||||
ldx i
|
||||
sta $1102,x
|
||||
sta fibs+$2,x
|
||||
//SEG16 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- zpby1=_inc_zpby1
|
||||
inc i
|
||||
//SEG17 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- zpby1_lt_coby1_then_la1
|
||||
@ -659,10 +692,10 @@ main: {
|
||||
rts
|
||||
}
|
||||
|
||||
Statement [1] *((word) 4352) ← (byte) 0 [ ] always clobbers reg byte a
|
||||
Statement [2] *((word) 4353) ← (byte) 1 [ ] always clobbers reg byte a
|
||||
Statement [1] *((word) 4352) ← (byte) 0 [ ] always clobbers reg byte a
|
||||
Statement [2] *((word) 4353) ← (byte) 1 [ ] always clobbers reg byte a
|
||||
Statement [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] always clobbers reg byte a
|
||||
Statement [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] always clobbers reg byte a
|
||||
Statement [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] always clobbers reg byte a
|
||||
Statement [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] always clobbers reg byte a
|
||||
Equivalence Class zp ZP_BYTE:4 [ main::$3 ] has ALU potential.
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
|
||||
@ -719,7 +752,8 @@ Removing instruction jmp b1
|
||||
Removing instruction jmp breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const fibs = $1100
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
@ -728,12 +762,12 @@ bbegin:
|
||||
bend:
|
||||
//SEG4 main
|
||||
main: {
|
||||
//SEG5 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
//SEG5 [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
lda #$0
|
||||
sta $1100
|
||||
//SEG6 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
sta fibs+$0
|
||||
//SEG6 [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
lda #$1
|
||||
sta $1101
|
||||
sta fibs+$1
|
||||
//SEG7 [3] phi from main to main::@1
|
||||
b1_from_main:
|
||||
//SEG8 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1
|
||||
@ -744,15 +778,15 @@ main: {
|
||||
//SEG10 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy
|
||||
//SEG11 main::@1
|
||||
b1:
|
||||
//SEG12 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda $1100,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← 4353 *idx main::i#2 // ALU
|
||||
//SEG12 [4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda fibs,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← fibs#0+1 *idx main::i#2 // ALU
|
||||
//SEG14 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby
|
||||
clc
|
||||
adc $1101,x
|
||||
//SEG15 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1102,x
|
||||
adc fibs+$1,x
|
||||
//SEG15 [7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta fibs+$2,x
|
||||
//SEG16 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -768,7 +802,8 @@ Replacing label b1_from_b1 with b1
|
||||
Removing instruction b1_from_b1:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const fibs = $1100
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
@ -777,12 +812,12 @@ bbegin:
|
||||
bend:
|
||||
//SEG4 main
|
||||
main: {
|
||||
//SEG5 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
//SEG5 [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
lda #$0
|
||||
sta $1100
|
||||
//SEG6 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
sta fibs+$0
|
||||
//SEG6 [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
lda #$1
|
||||
sta $1101
|
||||
sta fibs+$1
|
||||
//SEG7 [3] phi from main to main::@1
|
||||
b1_from_main:
|
||||
//SEG8 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1
|
||||
@ -792,15 +827,15 @@ main: {
|
||||
//SEG10 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy
|
||||
//SEG11 main::@1
|
||||
b1:
|
||||
//SEG12 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda $1100,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← 4353 *idx main::i#2 // ALU
|
||||
//SEG12 [4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda fibs,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← fibs#0+1 *idx main::i#2 // ALU
|
||||
//SEG14 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby
|
||||
clc
|
||||
adc $1101,x
|
||||
//SEG15 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1102,x
|
||||
adc fibs+$1,x
|
||||
//SEG15 [7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta fibs+$2,x
|
||||
//SEG16 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -818,19 +853,20 @@ Removing instruction b1_from_main:
|
||||
Removing instruction breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const fibs = $1100
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
jsr main
|
||||
//SEG3 @end
|
||||
//SEG4 main
|
||||
main: {
|
||||
//SEG5 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
//SEG5 [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
lda #$0
|
||||
sta $1100
|
||||
//SEG6 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
sta fibs+$0
|
||||
//SEG6 [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
lda #$1
|
||||
sta $1101
|
||||
sta fibs+$1
|
||||
//SEG7 [3] phi from main to main::@1
|
||||
//SEG8 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1
|
||||
ldx #$0
|
||||
@ -839,15 +875,15 @@ main: {
|
||||
//SEG10 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy
|
||||
//SEG11 main::@1
|
||||
b1:
|
||||
//SEG12 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda $1100,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← 4353 *idx main::i#2 // ALU
|
||||
//SEG12 [4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda fibs,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← fibs#0+1 *idx main::i#2 // ALU
|
||||
//SEG14 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby
|
||||
clc
|
||||
adc $1101,x
|
||||
//SEG15 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1102,x
|
||||
adc fibs+$1,x
|
||||
//SEG15 [7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta fibs+$2,x
|
||||
//SEG16 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -861,19 +897,20 @@ main: {
|
||||
Removing instruction jmp b1
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const fibs = $1100
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
jsr main
|
||||
//SEG3 @end
|
||||
//SEG4 main
|
||||
main: {
|
||||
//SEG5 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
//SEG5 [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
lda #$0
|
||||
sta $1100
|
||||
//SEG6 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
sta fibs+$0
|
||||
//SEG6 [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
lda #$1
|
||||
sta $1101
|
||||
sta fibs+$1
|
||||
//SEG7 [3] phi from main to main::@1
|
||||
//SEG8 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1
|
||||
ldx #$0
|
||||
@ -881,15 +918,15 @@ main: {
|
||||
//SEG10 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy
|
||||
//SEG11 main::@1
|
||||
b1:
|
||||
//SEG12 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda $1100,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← 4353 *idx main::i#2 // ALU
|
||||
//SEG12 [4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda fibs,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← fibs#0+1 *idx main::i#2 // ALU
|
||||
//SEG14 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby
|
||||
clc
|
||||
adc $1101,x
|
||||
//SEG15 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1102,x
|
||||
adc fibs+$1,x
|
||||
//SEG15 [7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta fibs+$2,x
|
||||
//SEG16 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -904,6 +941,7 @@ FINAL SYMBOL TABLE
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[15]) fibs
|
||||
(const byte[15]) fibs#0 = (word) 4352
|
||||
(void()) main()
|
||||
(byte~) main::$1 reg byte a 11.0
|
||||
(byte~) main::$3 reg byte alu 22.0
|
||||
@ -920,19 +958,20 @@ reg byte alu [ main::$3 ]
|
||||
reg byte a [ main::$4 ]
|
||||
|
||||
FINAL CODE
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const fibs = $1100
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
jsr main
|
||||
//SEG3 @end
|
||||
//SEG4 main
|
||||
main: {
|
||||
//SEG5 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
//SEG5 [1] *((const byte[15]) fibs#0+(byte) 0) ← (byte) 0 [ ] -- _star_cowo1=coby2
|
||||
lda #$0
|
||||
sta $1100
|
||||
//SEG6 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
sta fibs+$0
|
||||
//SEG6 [2] *((const byte[15]) fibs#0+(byte) 1) ← (byte) 1 [ ] -- _star_cowo1=coby2
|
||||
lda #$1
|
||||
sta $1101
|
||||
sta fibs+$1
|
||||
//SEG7 [3] phi from main to main::@1
|
||||
//SEG8 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1
|
||||
ldx #$0
|
||||
@ -940,15 +979,15 @@ main: {
|
||||
//SEG10 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy
|
||||
//SEG11 main::@1
|
||||
b1:
|
||||
//SEG12 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda $1100,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← 4353 *idx main::i#2 // ALU
|
||||
//SEG12 [4] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby
|
||||
lda fibs,x
|
||||
//SEG13 [5] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
|
||||
// [5] main::$3 ← fibs#0+1 *idx main::i#2 // ALU
|
||||
//SEG14 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby
|
||||
clc
|
||||
adc $1101,x
|
||||
//SEG15 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1102,x
|
||||
adc fibs+$1,x
|
||||
//SEG15 [7] *((const byte[15]) fibs#0+(byte) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta fibs+$2,x
|
||||
//SEG16 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1
|
||||
|
@ -1,6 +1,7 @@
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[15]) fibs
|
||||
(const byte[15]) fibs#0 = (word) 4352
|
||||
(void()) main()
|
||||
(byte~) main::$1 reg byte a 11.0
|
||||
(byte~) main::$3 reg byte alu 22.0
|
||||
|
@ -28,9 +28,9 @@ plot: {
|
||||
.label y = 4
|
||||
lda #$10
|
||||
sta y
|
||||
lda #<(SCREEN+($5*$28))+$c
|
||||
lda #<SCREEN+(($5*$28)+$c)
|
||||
sta line
|
||||
lda #>(SCREEN+($5*$28))+$c
|
||||
lda #>SCREEN+(($5*$28)+$c)
|
||||
sta line+$1
|
||||
ldx #$0
|
||||
b1:
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -282,8 +282,8 @@ main::@return: scope:[main] from main::@1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Constant (const byte*) SCREEN#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte*) SCREEN#0 = 1024
|
||||
Constant (const byte) main::i#0 = 0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -305,8 +305,8 @@ main::@return: scope:[main] from main::@1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Redundant Phi (byte*) SCREEN#1 (const byte*) SCREEN#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Constant (const byte*) SCREEN#1 = SCREEN#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@ -314,7 +314,7 @@ main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2
|
||||
*((const byte*) SCREEN#1 + (byte) main::i#2) ← (byte) main::i#2
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 100) goto main::@1
|
||||
to:main::@return
|
||||
@ -326,6 +326,9 @@ main::@return: scope:[main] from main::@1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Constant inlined SCREEN#1 = (const byte*) SCREEN#0
|
||||
Constant inlined main::i#0 = (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
|
@ -434,10 +434,10 @@ main::@return: scope:[main] from main::@2
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Constant (const byte*) SCREEN1#0
|
||||
Constant (const byte*) SCREEN2#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte) main::j#0
|
||||
Constant (const byte*) SCREEN1#0 = 1024
|
||||
Constant (const byte*) SCREEN2#0 = 1280
|
||||
Constant (const byte) main::i#0 = 0
|
||||
Constant (const byte) main::j#0 = 100
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -469,6 +469,68 @@ main::@return: scope:[main] from main::@2
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Constant (const byte*) SCREEN1#1 = SCREEN1#0
|
||||
Constant (const byte*) SCREEN2#2 = SCREEN2#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((const byte*) SCREEN1#1 + (byte) main::i#2) ← (byte) main::i#2
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 0) goto main::@1
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@2 main::@3
|
||||
(byte*) SCREEN2#1 ← phi( main::@3/(const byte*) SCREEN2#2 )
|
||||
(byte) main::j#2 ← phi( main::@2/(byte) main::j#1 main::@3/(const byte) main::j#0 )
|
||||
*((byte*) SCREEN2#1 + (byte) main::j#2) ← (byte) main::j#2
|
||||
(byte) main::j#1 ← -- (byte) main::j#2
|
||||
if((byte) main::j#1!=(byte) 255) goto main::@2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@1: scope:[] from @begin
|
||||
call main param-assignment
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Constant (const byte*) SCREEN2#1 = SCREEN2#2
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((const byte*) SCREEN1#1 + (byte) main::i#2) ← (byte) main::i#2
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 0) goto main::@1
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@2 main::@3
|
||||
(byte) main::j#2 ← phi( main::@2/(byte) main::j#1 main::@3/(const byte) main::j#0 )
|
||||
*((const byte*) SCREEN2#1 + (byte) main::j#2) ← (byte) main::j#2
|
||||
(byte) main::j#1 ← -- (byte) main::j#2
|
||||
if((byte) main::j#1!=(byte) 255) goto main::@2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@1: scope:[] from @begin
|
||||
call main param-assignment
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::j#2
|
||||
Culled Empty Block (label) main::@3
|
||||
Succesful SSA optimization Pass2CullEmptyBlocks
|
||||
CONTROL FLOW GRAPH
|
||||
@ -477,74 +539,14 @@ CONTROL FLOW GRAPH
|
||||
main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte*) SCREEN2#2 ← phi( main/(const byte*) SCREEN2#0 )
|
||||
(byte*) SCREEN1#1 ← phi( main/(const byte*) SCREEN1#0 )
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((byte*) SCREEN1#1 + (byte) main::i#2) ← (byte) main::i#2
|
||||
*((const byte*) SCREEN1#1 + (byte) main::i#2) ← (byte) main::i#2
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 0) goto main::@1
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1 main::@2
|
||||
(byte*) SCREEN2#1 ← phi( main::@1/(byte*) SCREEN2#2 )
|
||||
(byte) main::j#2 ← phi( main::@2/(byte) main::j#1 main::@1/(const byte) main::j#0 )
|
||||
*((byte*) SCREEN2#1 + (byte) main::j#2) ← (byte) main::j#2
|
||||
(byte) main::j#1 ← -- (byte) main::j#2
|
||||
if((byte) main::j#1!=(byte) 255) goto main::@2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@1: scope:[] from @begin
|
||||
call main param-assignment
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Alias (byte*) SCREEN2#1 = (byte*) SCREEN2#2
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte*) SCREEN2#1 ← phi( main/(const byte*) SCREEN2#0 )
|
||||
(byte*) SCREEN1#1 ← phi( main/(const byte*) SCREEN1#0 )
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((byte*) SCREEN1#1 + (byte) main::i#2) ← (byte) main::i#2
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 0) goto main::@1
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1 main::@2
|
||||
(byte) main::j#2 ← phi( main::@2/(byte) main::j#1 main::@1/(const byte) main::j#0 )
|
||||
*((byte*) SCREEN2#1 + (byte) main::j#2) ← (byte) main::j#2
|
||||
(byte) main::j#1 ← -- (byte) main::j#2
|
||||
if((byte) main::j#1!=(byte) 255) goto main::@2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@1: scope:[] from @begin
|
||||
call main param-assignment
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Redundant Phi (byte*) SCREEN1#1 (const byte*) SCREEN1#0
|
||||
Redundant Phi (byte*) SCREEN2#1 (const byte*) SCREEN2#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
*((const byte*) SCREEN1#0 + (byte) main::i#2) ← (byte) main::i#2
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 0) goto main::@1
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1 main::@2
|
||||
(byte) main::j#2 ← phi( main::@2/(byte) main::j#1 main::@1/(const byte) main::j#0 )
|
||||
*((const byte*) SCREEN2#0 + (byte) main::j#2) ← (byte) main::j#2
|
||||
*((const byte*) SCREEN2#1 + (byte) main::j#2) ← (byte) main::j#2
|
||||
(byte) main::j#1 ← -- (byte) main::j#2
|
||||
if((byte) main::j#1!=(byte) 255) goto main::@2
|
||||
to:main::@return
|
||||
@ -556,6 +558,13 @@ main::@return: scope:[main] from main::@2
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::j#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::j#2
|
||||
Constant inlined SCREEN1#1 = (const byte*) SCREEN1#0
|
||||
Constant inlined SCREEN2#1 = (const byte*) SCREEN2#0
|
||||
Constant inlined SCREEN2#2 = (const byte*) SCREEN2#0
|
||||
Constant inlined main::j#0 = (byte) 100
|
||||
Constant inlined main::i#0 = (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
|
@ -417,8 +417,8 @@ main::@return: scope:[main] from main::@2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) SCREEN#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte*) SCREEN#0 = 1024
|
||||
Constant (const byte) main::i#0 = 0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -443,8 +443,8 @@ main::@return: scope:[main] from main::@2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Redundant Phi (byte*) SCREEN#1 (const byte*) SCREEN#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Constant (const byte*) SCREEN#1 = SCREEN#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -460,13 +460,14 @@ main::@2: scope:[main] from main::@1 main::@3
|
||||
if((byte) main::i#1<(byte) 100) goto main::@1
|
||||
to:main::@return
|
||||
main::@3: scope:[main] from main::@1
|
||||
*((const byte*) SCREEN#0) ← (byte) main::i#2
|
||||
*((const byte*) SCREEN#1) ← (byte) main::i#2
|
||||
to:main::@2
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant inlined SCREEN#1 = (const byte*) SCREEN#0
|
||||
Constant inlined main::i#0 = (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
|
@ -361,8 +361,12 @@ inc::@return: scope:[inc] from inc
|
||||
to:@return
|
||||
@end: scope:[] from @3
|
||||
|
||||
Constant (const byte) i#0
|
||||
Constant (const byte) main::a#0
|
||||
Not aliassing across scopes: main::$0 inc::return#0
|
||||
Not aliassing across scopes: main::$2 inc::return#0
|
||||
Not aliassing across scopes: i#1 inc::$0
|
||||
Not aliassing across scopes: inc::return#0 i#1
|
||||
Constant (const byte) i#0 = 0
|
||||
Constant (const byte) main::a#0 = 4
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
|
@ -281,8 +281,8 @@ CONTROL FLOW GRAPH
|
||||
to:@2
|
||||
@end: scope:[] from @2
|
||||
|
||||
Constant (const byte) i#0
|
||||
Constant (const byte) s#0
|
||||
Constant (const byte) i#0 = 10
|
||||
Constant (const byte) s#0 = 0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
|
@ -450,9 +450,9 @@ nest::@return: scope:[nest] from nest::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) SCREEN#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte) nest::j#0
|
||||
Constant (const byte*) SCREEN#0 = 1024
|
||||
Constant (const byte) main::i#0 = 100
|
||||
Constant (const byte) nest::j#0 = 100
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -486,8 +486,8 @@ nest::@return: scope:[nest] from nest::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Alias (byte*) SCREEN#1 = (byte*) SCREEN#2
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
Constant (const byte*) SCREEN#2 = SCREEN#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -495,7 +495,6 @@ CONTROL FLOW GRAPH
|
||||
main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@3
|
||||
(byte*) SCREEN#1 ← phi( main/(const byte*) SCREEN#0 )
|
||||
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@3/(byte) main::i#1 )
|
||||
call nest param-assignment
|
||||
to:main::@3
|
||||
@ -509,6 +508,7 @@ main::@return: scope:[main] from main::@3
|
||||
nest: scope:[nest] from main::@1
|
||||
to:nest::@1
|
||||
nest::@1: scope:[nest] from nest nest::@1
|
||||
(byte*) SCREEN#1 ← phi( nest/(const byte*) SCREEN#2 )
|
||||
(byte) nest::j#2 ← phi( nest/(const byte) nest::j#0 nest::@1/(byte) nest::j#1 )
|
||||
*((byte*) SCREEN#1) ← (byte) nest::j#2
|
||||
(byte) nest::j#1 ← -- (byte) nest::j#2
|
||||
@ -519,8 +519,8 @@ nest::@return: scope:[nest] from nest::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Redundant Phi (byte*) SCREEN#1 (const byte*) SCREEN#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Constant (const byte*) SCREEN#1 = SCREEN#2
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -542,7 +542,7 @@ nest: scope:[nest] from main::@1
|
||||
to:nest::@1
|
||||
nest::@1: scope:[nest] from nest nest::@1
|
||||
(byte) nest::j#2 ← phi( nest/(const byte) nest::j#0 nest::@1/(byte) nest::j#1 )
|
||||
*((const byte*) SCREEN#0) ← (byte) nest::j#2
|
||||
*((const byte*) SCREEN#1) ← (byte) nest::j#2
|
||||
(byte) nest::j#1 ← -- (byte) nest::j#2
|
||||
if((byte) nest::j#1>(byte) 0) goto nest::@1
|
||||
to:nest::@return
|
||||
@ -551,6 +551,8 @@ nest::@return: scope:[nest] from nest::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant inlined SCREEN#2 = (const byte*) SCREEN#0
|
||||
Constant inlined SCREEN#1 = (const byte*) SCREEN#0
|
||||
Constant inlined main::i#0 = (byte) 100
|
||||
Constant inlined nest::j#0 = (byte) 100
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
|
@ -1016,13 +1016,13 @@ nest2::@return: scope:[nest2] from nest2::@3
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) SCREEN#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte) main::j#0
|
||||
Constant (const byte) nest1::i#0
|
||||
Constant (const byte) nest1::j#0
|
||||
Constant (const byte) nest2::i#0
|
||||
Constant (const byte) nest2::j#0
|
||||
Constant (const byte*) SCREEN#0 = 1024
|
||||
Constant (const byte) main::i#0 = 100
|
||||
Constant (const byte) main::j#0 = 100
|
||||
Constant (const byte) nest1::i#0 = 100
|
||||
Constant (const byte) nest1::j#0 = 100
|
||||
Constant (const byte) nest2::i#0 = 100
|
||||
Constant (const byte) nest2::j#0 = 100
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -1242,7 +1242,7 @@ nest2::@return: scope:[nest2] from nest2::@3
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) SCREEN#10
|
||||
Constant (const byte*) SCREEN#10 = SCREEN#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -1310,8 +1310,8 @@ nest2::@return: scope:[nest2] from nest2::@3
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Alias (byte*) SCREEN#1 = (byte*) SCREEN#3
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
Constant (const byte*) SCREEN#3 = SCREEN#10
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -1339,7 +1339,6 @@ main::@return: scope:[main] from main::@3
|
||||
nest1: scope:[nest1] from main::@2
|
||||
to:nest1::@1
|
||||
nest1::@1: scope:[nest1] from nest1 nest1::@3
|
||||
(byte*) SCREEN#1 ← phi( nest1/(const byte*) SCREEN#10 )
|
||||
(byte) nest1::i#2 ← phi( nest1/(const byte) nest1::i#0 nest1::@3/(byte) nest1::i#1 )
|
||||
to:nest1::@2
|
||||
nest1::@2: scope:[nest1] from nest1::@1 nest1::@5
|
||||
@ -1361,6 +1360,7 @@ nest2: scope:[nest2] from nest1::@2
|
||||
to:nest2::@1
|
||||
nest2::@1: scope:[nest2] from nest2 nest2::@3
|
||||
(byte) nest2::i#2 ← phi( nest2/(const byte) nest2::i#0 nest2::@3/(byte) nest2::i#1 )
|
||||
(byte*) SCREEN#1 ← phi( nest2/(const byte*) SCREEN#3 )
|
||||
to:nest2::@2
|
||||
nest2::@2: scope:[nest2] from nest2::@1 nest2::@2
|
||||
(byte) nest2::j#2 ← phi( nest2::@1/(const byte) nest2::j#0 nest2::@2/(byte) nest2::j#1 )
|
||||
@ -1377,8 +1377,8 @@ nest2::@return: scope:[nest2] from nest2::@3
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Redundant Phi (byte*) SCREEN#1 (const byte*) SCREEN#10
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Constant (const byte*) SCREEN#1 = SCREEN#3
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -1430,7 +1430,7 @@ nest2::@1: scope:[nest2] from nest2 nest2::@3
|
||||
to:nest2::@2
|
||||
nest2::@2: scope:[nest2] from nest2::@1 nest2::@2
|
||||
(byte) nest2::j#2 ← phi( nest2::@1/(const byte) nest2::j#0 nest2::@2/(byte) nest2::j#1 )
|
||||
*((const byte*) SCREEN#10) ← (byte) nest2::j#2
|
||||
*((const byte*) SCREEN#1) ← (byte) nest2::j#2
|
||||
(byte) nest2::j#1 ← -- (byte) nest2::j#2
|
||||
if((byte) nest2::j#1>(byte) 0) goto nest2::@2
|
||||
to:nest2::@3
|
||||
@ -1446,6 +1446,8 @@ nest2::@return: scope:[nest2] from nest2::@3
|
||||
Constant inlined nest1::i#0 = (byte) 100
|
||||
Constant inlined nest1::j#0 = (byte) 100
|
||||
Constant inlined nest2::i#0 = (byte) 100
|
||||
Constant inlined SCREEN#1 = (const byte*) SCREEN#0
|
||||
Constant inlined SCREEN#3 = (const byte*) SCREEN#0
|
||||
Constant inlined nest2::j#0 = (byte) 100
|
||||
Constant inlined main::j#0 = (byte) 100
|
||||
Constant inlined main::i#0 = (byte) 100
|
||||
|
@ -418,8 +418,8 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte) main::s#0
|
||||
Constant (const byte) main::i#0 = 100
|
||||
Constant (const byte) main::s#0 = 0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
|
@ -1,9 +1,10 @@
|
||||
.const p = $1100
|
||||
ldx #$5
|
||||
b1:
|
||||
txa
|
||||
clc
|
||||
adc #$4
|
||||
sta $1100,x
|
||||
adc #$2+$2
|
||||
sta p,x
|
||||
inx
|
||||
cpx #$a
|
||||
bcc b1
|
||||
|
@ -2,8 +2,8 @@
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
[0] (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) [ i#2 ]
|
||||
[1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ]
|
||||
[2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ]
|
||||
[1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ]
|
||||
[2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ]
|
||||
[3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ]
|
||||
[4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ]
|
||||
to:@end
|
||||
|
@ -132,55 +132,18 @@ INITIAL SSA SYMBOL TABLE
|
||||
(byte[16]) p#0
|
||||
(byte[16]) p#1
|
||||
|
||||
Constant (byte[16]) p#0 (word) 4352
|
||||
Constant (byte) i#0 (byte) 5
|
||||
Succesful SSA optimization Pass2ConstantPropagation
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(word) 4352 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 )
|
||||
(byte~) $0 ← (byte) 2 + (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 2
|
||||
*((byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte~) $2 ← (byte) i#2 + (byte) 1
|
||||
(byte) i#1 ← (byte~) $2
|
||||
(boolean~) $3 ← (byte) i#1 < (byte) 10
|
||||
if((boolean~) $3) goto @1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Consolidated constant in assignment $1
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Succesful SSA optimization Pass2ConstantAdditionElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(word) 4352 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 )
|
||||
(byte~) $0 ← (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 4
|
||||
*((byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte~) $2 ← (byte) i#2 + (byte) 1
|
||||
(byte) i#1 ← (byte~) $2
|
||||
(boolean~) $3 ← (byte) i#1 < (byte) 10
|
||||
if((boolean~) $3) goto @1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Alias (byte) i#2 = (byte~) $0
|
||||
Alias (byte) i#1 = (byte~) $2
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte[16]) p#0 ← (word) 4352
|
||||
(byte) i#0 ← (byte) 5
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(word) 4352 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 )
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 4
|
||||
(byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(byte[16]) p#0 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) i#0 )
|
||||
(byte~) $0 ← (byte) 2 + (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 2
|
||||
*((byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
(boolean~) $3 ← (byte) i#1 < (byte) 10
|
||||
@ -192,11 +155,14 @@ Self Phi Eliminated (byte[16]) p#1
|
||||
Succesful SSA optimization Pass2SelfPhiElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte[16]) p#0 ← (word) 4352
|
||||
(byte) i#0 ← (byte) 5
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte[16]) p#1 ← phi( @begin/(word) 4352 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 )
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 4
|
||||
(byte[16]) p#1 ← phi( @begin/(byte[16]) p#0 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) i#0 )
|
||||
(byte~) $0 ← (byte) 2 + (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 2
|
||||
*((byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
(boolean~) $3 ← (byte) i#1 < (byte) 10
|
||||
@ -208,26 +174,81 @@ Simple Condition (boolean~) $3 if((byte) i#1<(byte) 10) goto @1
|
||||
Succesful SSA optimization Pass2ConditionalJumpSimplification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte[16]) p#0 ← (word) 4352
|
||||
(byte) i#0 ← (byte) 5
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte[16]) p#1 ← phi( @begin/(word) 4352 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 )
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 4
|
||||
(byte[16]) p#1 ← phi( @begin/(byte[16]) p#0 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) i#0 )
|
||||
(byte~) $0 ← (byte) 2 + (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 2
|
||||
*((byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
if((byte) i#1<(byte) 10) goto @1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Constant (byte[16]) p#1 (word) 4352
|
||||
Succesful SSA optimization Pass2ConstantPropagation
|
||||
Constant (const byte[16]) p#0 = 4352
|
||||
Constant (const byte) i#0 = 5
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 )
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 4
|
||||
*((word) 4352 + (byte) i#2) ← (byte~) $1
|
||||
(byte[16]) p#1 ← phi( @begin/(const byte[16]) p#0 )
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(const byte) i#0 )
|
||||
(byte~) $0 ← (byte) 2 + (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 2
|
||||
*((byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
if((byte) i#1<(byte) 10) goto @1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Constant (const byte[16]) p#1 = p#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(const byte) i#0 )
|
||||
(byte~) $0 ← (byte) 2 + (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 2
|
||||
*((const byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
if((byte) i#1<(byte) 10) goto @1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Consolidated constant in assignment $1
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Succesful SSA optimization Pass2ConstantAdditionElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(const byte) i#0 )
|
||||
(byte~) $0 ← (byte) i#2
|
||||
(byte~) $1 ← (byte~) $0 + (byte) 2+(byte) 2
|
||||
*((const byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
if((byte) i#1<(byte) 10) goto @1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Alias (byte) i#2 = (byte~) $0
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(const byte) i#0 )
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2
|
||||
*((const byte[16]) p#1 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
if((byte) i#1<(byte) 10) goto @1
|
||||
to:@end
|
||||
@ -239,6 +260,21 @@ Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) i#2
|
||||
Constant inlined p#1 = (const byte[16]) p#0
|
||||
Constant inlined i#0 = (byte) 5
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
(byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 )
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2
|
||||
*((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
if((byte) i#1<(byte) 10) goto @1
|
||||
to:@end
|
||||
@end: scope:[] from @1
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(byte~) $1
|
||||
(label) @1
|
||||
@ -248,6 +284,7 @@ FINAL SYMBOL TABLE
|
||||
(byte) i#1
|
||||
(byte) i#2
|
||||
(byte[16]) p
|
||||
(const byte[16]) p#0 = (word) 4352
|
||||
|
||||
Block Sequence Planned @begin @1 @end
|
||||
Added new block during phi lifting @3(between @1 and @1)
|
||||
@ -257,8 +294,8 @@ CONTROL FLOW GRAPH - PHI LIFTED
|
||||
to:@1
|
||||
@1: scope:[] from @3 @begin
|
||||
(byte) i#2 ← phi( @3/(byte~) i#3 @begin/(byte) 5 )
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 4
|
||||
*((word) 4352 + (byte) i#2) ← (byte~) $1
|
||||
(byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2
|
||||
*((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1
|
||||
(byte) i#1 ← (byte) i#2 + (byte) 1
|
||||
if((byte) i#1<(byte) 10) goto @3
|
||||
to:@end
|
||||
@ -276,8 +313,8 @@ CONTROL FLOW GRAPH - LIVE RANGES FOUND
|
||||
to:@1
|
||||
@1: scope:[] from @3 @begin
|
||||
[0] (byte) i#2 ← phi( @3/(byte~) i#3 @begin/(byte) 5 ) [ i#2 ]
|
||||
[1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ]
|
||||
[2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ]
|
||||
[1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ]
|
||||
[2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ]
|
||||
[3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ]
|
||||
[4] if((byte) i#1<(byte) 10) goto @3 [ i#1 ]
|
||||
to:@end
|
||||
@ -298,8 +335,8 @@ CONTROL FLOW GRAPH - PHI MEM COALESCED
|
||||
to:@1
|
||||
@1: scope:[] from @1 @begin
|
||||
[0] (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) [ i#2 ]
|
||||
[1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ]
|
||||
[2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ]
|
||||
[1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ]
|
||||
[2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ]
|
||||
[3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ]
|
||||
[4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ]
|
||||
to:@end
|
||||
@ -337,7 +374,8 @@ Complete equivalence classes
|
||||
Allocated zp ZP_BYTE:2 [ i#2 i#1 ]
|
||||
Allocated zp ZP_BYTE:3 [ $1 ]
|
||||
INITIAL ASM
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const p = $1100
|
||||
.label _1 = 3
|
||||
.label i = 2
|
||||
//SEG1 @begin
|
||||
@ -354,15 +392,15 @@ b1_from_b1:
|
||||
jmp b1
|
||||
//SEG6 @1
|
||||
b1:
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- zpby1=zpby2_plus_coby1
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] -- zpby1=zpby2_plus_coby1
|
||||
lda i
|
||||
clc
|
||||
adc #$4
|
||||
adc #$2+$2
|
||||
sta _1
|
||||
//SEG8 [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_zpby1=zpby2
|
||||
//SEG8 [2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_zpby1=zpby2
|
||||
lda _1
|
||||
ldx i
|
||||
sta $1100,x
|
||||
sta p,x
|
||||
//SEG9 [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] -- zpby1=zpby1_plus_1
|
||||
inc i
|
||||
//SEG10 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- zpby1_lt_coby1_then_la1
|
||||
@ -373,9 +411,9 @@ b1:
|
||||
//SEG11 @end
|
||||
bend:
|
||||
|
||||
Statement [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] always clobbers reg byte a
|
||||
Statement [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] always clobbers reg byte a
|
||||
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ i#2 i#1 ]
|
||||
Statement [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] always clobbers reg byte a
|
||||
Statement [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] always clobbers reg byte a
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Potential registers zp ZP_BYTE:2 [ i#2 i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
|
||||
Potential registers zp ZP_BYTE:3 [ $1 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
|
||||
@ -388,7 +426,8 @@ Removing instruction jmp b1
|
||||
Removing instruction jmp bend
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const p = $1100
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
//SEG2 [0] phi from @begin to @1
|
||||
@ -401,12 +440,12 @@ b1_from_b1:
|
||||
//SEG5 [0] phi (byte) i#2 = (byte) i#1 -- register_copy
|
||||
//SEG6 @1
|
||||
b1:
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
txa
|
||||
clc
|
||||
adc #$4
|
||||
//SEG8 [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1100,x
|
||||
adc #$2+$2
|
||||
//SEG8 [2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta p,x
|
||||
//SEG9 [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] -- xby=xby_plus_1
|
||||
inx
|
||||
//SEG10 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -420,7 +459,8 @@ Removing instruction b1_from_bbegin:
|
||||
Removing instruction b1_from_b1:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const p = $1100
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
//SEG2 [0] phi from @begin to @1
|
||||
@ -431,12 +471,12 @@ bbegin:
|
||||
//SEG5 [0] phi (byte) i#2 = (byte) i#1 -- register_copy
|
||||
//SEG6 @1
|
||||
b1:
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
txa
|
||||
clc
|
||||
adc #$4
|
||||
//SEG8 [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1100,x
|
||||
adc #$2+$2
|
||||
//SEG8 [2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta p,x
|
||||
//SEG9 [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] -- xby=xby_plus_1
|
||||
inx
|
||||
//SEG10 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -449,7 +489,8 @@ Removing instruction bbegin:
|
||||
Removing instruction bend:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const p = $1100
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] phi from @begin to @1
|
||||
//SEG3 [0] phi (byte) i#2 = (byte) 5 -- xby=coby1
|
||||
@ -459,12 +500,12 @@ ASSEMBLER
|
||||
//SEG5 [0] phi (byte) i#2 = (byte) i#1 -- register_copy
|
||||
//SEG6 @1
|
||||
b1:
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
txa
|
||||
clc
|
||||
adc #$4
|
||||
//SEG8 [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1100,x
|
||||
adc #$2+$2
|
||||
//SEG8 [2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta p,x
|
||||
//SEG9 [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] -- xby=xby_plus_1
|
||||
inx
|
||||
//SEG10 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -475,7 +516,8 @@ b1:
|
||||
Removing instruction jmp b1
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const p = $1100
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] phi from @begin to @1
|
||||
//SEG3 [0] phi (byte) i#2 = (byte) 5 -- xby=coby1
|
||||
@ -484,12 +526,12 @@ ASSEMBLER
|
||||
//SEG5 [0] phi (byte) i#2 = (byte) i#1 -- register_copy
|
||||
//SEG6 @1
|
||||
b1:
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
txa
|
||||
clc
|
||||
adc #$4
|
||||
//SEG8 [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1100,x
|
||||
adc #$2+$2
|
||||
//SEG8 [2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta p,x
|
||||
//SEG9 [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] -- xby=xby_plus_1
|
||||
inx
|
||||
//SEG10 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1
|
||||
@ -506,12 +548,14 @@ FINAL SYMBOL TABLE
|
||||
(byte) i#1 reg byte x 16.5
|
||||
(byte) i#2 reg byte x 14.666666666666666
|
||||
(byte[16]) p
|
||||
(const byte[16]) p#0 = (word) 4352
|
||||
|
||||
reg byte x [ i#2 i#1 ]
|
||||
reg byte a [ $1 ]
|
||||
|
||||
FINAL CODE
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const p = $1100
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] phi from @begin to @1
|
||||
//SEG3 [0] phi (byte) i#2 = (byte) 5 -- xby=coby1
|
||||
@ -520,12 +564,12 @@ FINAL CODE
|
||||
//SEG5 [0] phi (byte) i#2 = (byte) i#1 -- register_copy
|
||||
//SEG6 @1
|
||||
b1:
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
//SEG7 [1] (byte~) $1 ← (byte) i#2 + (byte) 2+(byte) 2 [ i#2 $1 ] -- aby=xby_plus_coby1
|
||||
txa
|
||||
clc
|
||||
adc #$4
|
||||
//SEG8 [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta $1100,x
|
||||
adc #$2+$2
|
||||
//SEG8 [2] *((const byte[16]) p#0 + (byte) i#2) ← (byte~) $1 [ i#2 ] -- cowo1_staridx_xby=aby
|
||||
sta p,x
|
||||
//SEG9 [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] -- xby=xby_plus_1
|
||||
inx
|
||||
//SEG10 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1
|
||||
|
@ -6,6 +6,7 @@
|
||||
(byte) i#1 reg byte x 16.5
|
||||
(byte) i#2 reg byte x 14.666666666666666
|
||||
(byte[16]) p
|
||||
(const byte[16]) p#0 = (word) 4352
|
||||
|
||||
reg byte x [ i#2 i#1 ]
|
||||
reg byte a [ $1 ]
|
||||
|
@ -1,3 +1,4 @@
|
||||
.const SCREEN = $400
|
||||
.label cnt3 = 2
|
||||
jsr main
|
||||
main: {
|
||||
@ -6,10 +7,10 @@ main: {
|
||||
ldy #$0
|
||||
ldx #$0
|
||||
jsr inccnt
|
||||
sta $400
|
||||
sta SCREEN+$0
|
||||
inx
|
||||
jsr inccnt
|
||||
sta $401
|
||||
sta SCREEN+$1
|
||||
rts
|
||||
}
|
||||
inccnt: {
|
||||
|
@ -8,13 +8,13 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ]
|
||||
[4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ]
|
||||
[4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ]
|
||||
[5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ]
|
||||
[6] call inccnt param-assignment [ inccnt::return#0 ]
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
[7] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ]
|
||||
[8] *((word) 1025) ← (byte~) main::$1 [ ]
|
||||
[8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ]
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
[9] return [ ]
|
||||
|
@ -431,128 +431,48 @@ INITIAL SSA SYMBOL TABLE
|
||||
(label) main::@2
|
||||
(label) main::@return
|
||||
|
||||
Constant (byte) cnt#0 (byte) 0
|
||||
Constant (byte) cnt2#0 (byte) 0
|
||||
Constant (byte) cnt3#0 (byte) 0
|
||||
Constant (byte[256]) SCREEN#0 (word) 1024
|
||||
Succesful SSA optimization Pass2ConstantPropagation
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@3
|
||||
@3: scope:[] from @begin
|
||||
(byte) cnt3#7 ← phi( @begin/(byte) cnt3#4 )
|
||||
(byte) cnt2#7 ← phi( @begin/(byte) cnt2#4 )
|
||||
(byte) cnt#8 ← phi( @begin/(byte) cnt#5 )
|
||||
(byte) cnt#1 ← (byte) cnt#8
|
||||
(byte) cnt2#1 ← (byte) cnt2#7
|
||||
(byte) cnt3#1 ← (byte) cnt3#7
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
(byte[256]) SCREEN#3 ← phi( @begin/(word) 1024 )
|
||||
(byte) cnt3#13 ← phi( @begin/(byte) 0 )
|
||||
(byte) cnt2#13 ← phi( @begin/(byte) 0 )
|
||||
(byte) cnt#14 ← phi( @begin/(byte) 0 )
|
||||
call inccnt param-assignment
|
||||
(byte) inccnt::return#0 ← (byte) inccnt::return#3
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte[256]) SCREEN#1 ← phi( main/(byte[256]) SCREEN#3 )
|
||||
(byte) cnt3#8 ← phi( main/(byte) cnt3#6 )
|
||||
(byte) cnt2#8 ← phi( main/(byte) cnt2#6 )
|
||||
(byte) cnt#9 ← phi( main/(byte) cnt#7 )
|
||||
(byte) inccnt::return#4 ← phi( main/(byte) inccnt::return#0 )
|
||||
(byte~) main::$0 ← (byte) inccnt::return#4
|
||||
(byte) cnt#2 ← (byte) cnt#9
|
||||
(byte) cnt2#2 ← (byte) cnt2#8
|
||||
(byte) cnt3#2 ← (byte) cnt3#8
|
||||
*((byte[256]) SCREEN#1 + (byte) 0) ← (byte~) main::$0
|
||||
(byte) cnt#3 ← ++ (byte) cnt#2
|
||||
call inccnt param-assignment
|
||||
(byte) inccnt::return#1 ← (byte) inccnt::return#3
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte[256]) SCREEN#2 ← phi( main::@1/(byte[256]) SCREEN#1 )
|
||||
(byte) cnt3#9 ← phi( main::@1/(byte) cnt3#6 )
|
||||
(byte) cnt2#9 ← phi( main::@1/(byte) cnt2#6 )
|
||||
(byte) cnt#10 ← phi( main::@1/(byte) cnt#7 )
|
||||
(byte) inccnt::return#5 ← phi( main::@1/(byte) inccnt::return#1 )
|
||||
(byte~) main::$1 ← (byte) inccnt::return#5
|
||||
(byte) cnt#4 ← (byte) cnt#10
|
||||
(byte) cnt2#3 ← (byte) cnt2#9
|
||||
(byte) cnt3#3 ← (byte) cnt3#9
|
||||
*((byte[256]) SCREEN#2 + (byte) 1) ← (byte~) main::$1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
(byte) cnt3#10 ← phi( main::@2/(byte) cnt3#3 )
|
||||
(byte) cnt2#10 ← phi( main::@2/(byte) cnt2#3 )
|
||||
(byte) cnt#11 ← phi( main::@2/(byte) cnt#4 )
|
||||
(byte) cnt#5 ← (byte) cnt#11
|
||||
(byte) cnt2#4 ← (byte) cnt2#10
|
||||
(byte) cnt3#4 ← (byte) cnt3#10
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt3#11 ← phi( main/(byte) cnt3#13 main::@1/(byte) cnt3#2 )
|
||||
(byte) cnt2#11 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#2 )
|
||||
(byte) cnt#12 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#6 ← ++ (byte) cnt#12
|
||||
(byte) cnt2#5 ← ++ (byte) cnt2#11
|
||||
(byte) cnt3#5 ← ++ (byte) cnt3#11
|
||||
(byte) inccnt::return#2 ← (byte) cnt#6
|
||||
to:inccnt::@return
|
||||
inccnt::@return: scope:[inccnt] from inccnt
|
||||
(byte) cnt3#12 ← phi( inccnt/(byte) cnt3#5 )
|
||||
(byte) cnt2#12 ← phi( inccnt/(byte) cnt2#5 )
|
||||
(byte) cnt#13 ← phi( inccnt/(byte) cnt#6 )
|
||||
(byte) inccnt::return#6 ← phi( inccnt/(byte) inccnt::return#2 )
|
||||
(byte) inccnt::return#3 ← (byte) inccnt::return#6
|
||||
(byte) cnt#7 ← (byte) cnt#13
|
||||
(byte) cnt2#6 ← (byte) cnt2#12
|
||||
(byte) cnt3#6 ← (byte) cnt3#12
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @3
|
||||
|
||||
Not aliassing across scopes: main::$0 inccnt::return#4
|
||||
Not aliassing across scopes: main::$1 inccnt::return#5
|
||||
Not aliassing across scopes: inccnt::return#2 cnt#6
|
||||
Alias (byte) cnt#1 = (byte) cnt#8 (byte) cnt#5 (byte) cnt#9 (byte) cnt#7 (byte) cnt#2 (byte) cnt#10 (byte) cnt#4 (byte) cnt#11 (byte) cnt#13 (byte) cnt#6
|
||||
Alias (byte) cnt2#1 = (byte) cnt2#7 (byte) cnt2#4 (byte) cnt2#8 (byte) cnt2#6 (byte) cnt2#2 (byte) cnt2#9 (byte) cnt2#3 (byte) cnt2#10 (byte) cnt2#12 (byte) cnt2#5
|
||||
Alias (byte) cnt3#1 = (byte) cnt3#7 (byte) cnt3#4 (byte) cnt3#8 (byte) cnt3#6 (byte) cnt3#2 (byte) cnt3#9 (byte) cnt3#3 (byte) cnt3#10 (byte) cnt3#12 (byte) cnt3#5
|
||||
Alias (byte) cnt#0 = (byte) cnt#14
|
||||
Alias (byte) cnt2#0 = (byte) cnt2#13
|
||||
Alias (byte) cnt3#0 = (byte) cnt3#13
|
||||
Alias (byte[256]) SCREEN#0 = (byte[256]) SCREEN#3 (byte[256]) SCREEN#1 (byte[256]) SCREEN#2
|
||||
Alias (byte) inccnt::return#0 = (byte) inccnt::return#3 (byte) inccnt::return#4 (byte) inccnt::return#1 (byte) inccnt::return#5 (byte) inccnt::return#6 (byte) inccnt::return#2
|
||||
Alias (byte[256]) SCREEN#1 = (byte[256]) SCREEN#3 (byte[256]) SCREEN#2
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte) cnt#0 ← (byte) 0
|
||||
(byte) cnt2#0 ← (byte) 0
|
||||
(byte) cnt3#0 ← (byte) 0
|
||||
(byte[256]) SCREEN#0 ← (word) 1024
|
||||
call main param-assignment
|
||||
to:@3
|
||||
@3: scope:[] from @begin
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
(byte[256]) SCREEN#1 ← phi( @begin/(word) 1024 )
|
||||
(byte) cnt3#13 ← phi( @begin/(byte) 0 )
|
||||
(byte) cnt2#13 ← phi( @begin/(byte) 0 )
|
||||
(byte) cnt#14 ← phi( @begin/(byte) 0 )
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte~) main::$0 ← (byte) inccnt::return#0
|
||||
*((byte[256]) SCREEN#1 + (byte) 0) ← (byte~) main::$0
|
||||
*((byte[256]) SCREEN#0 + (byte) 0) ← (byte~) main::$0
|
||||
(byte) cnt#3 ← ++ (byte) cnt#1
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte~) main::$1 ← (byte) inccnt::return#0
|
||||
*((byte[256]) SCREEN#1 + (byte) 1) ← (byte~) main::$1
|
||||
*((byte[256]) SCREEN#0 + (byte) 1) ← (byte~) main::$1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt3#11 ← phi( main/(byte) cnt3#13 main::@1/(byte) cnt3#1 )
|
||||
(byte) cnt2#11 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#1 )
|
||||
(byte) cnt#12 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt3#11 ← phi( main/(byte) cnt3#0 main::@1/(byte) cnt3#1 )
|
||||
(byte) cnt2#11 ← phi( main/(byte) cnt2#0 main::@1/(byte) cnt2#1 )
|
||||
(byte) cnt#12 ← phi( main/(byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#1 ← ++ (byte) cnt#12
|
||||
(byte) cnt2#1 ← ++ (byte) cnt2#11
|
||||
(byte) cnt3#1 ← ++ (byte) cnt3#11
|
||||
@ -563,11 +483,14 @@ inccnt::@return: scope:[inccnt] from inccnt
|
||||
to:@return
|
||||
@end: scope:[] from @3
|
||||
|
||||
Redundant Phi (byte) cnt#14 (byte) 0
|
||||
Redundant Phi (byte) cnt2#13 (byte) 0
|
||||
Redundant Phi (byte) cnt3#13 (byte) 0
|
||||
Redundant Phi (byte[256]) SCREEN#1 (word) 1024
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Not aliassing across scopes: main::$0 inccnt::return#0
|
||||
Not aliassing across scopes: main::$1 inccnt::return#0
|
||||
Not aliassing across scopes: inccnt::return#0 cnt#1
|
||||
Constant (const byte) cnt#0 = 0
|
||||
Constant (const byte) cnt2#0 = 0
|
||||
Constant (const byte) cnt3#0 = 0
|
||||
Constant (const byte[256]) SCREEN#0 = 1024
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -579,21 +502,60 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte~) main::$0 ← (byte) inccnt::return#0
|
||||
*((word) 1024 + (byte) 0) ← (byte~) main::$0
|
||||
*((const byte[256]) SCREEN#0 + (byte) 0) ← (byte~) main::$0
|
||||
(byte) cnt#3 ← ++ (byte) cnt#1
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte~) main::$1 ← (byte) inccnt::return#0
|
||||
*((word) 1024 + (byte) 1) ← (byte~) main::$1
|
||||
*((const byte[256]) SCREEN#0 + (byte) 1) ← (byte~) main::$1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt3#11 ← phi( main/(byte) 0 main::@1/(byte) cnt3#1 )
|
||||
(byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte) cnt2#1 )
|
||||
(byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt3#11 ← phi( main/(const byte) cnt3#0 main::@1/(byte) cnt3#1 )
|
||||
(byte) cnt2#11 ← phi( main/(const byte) cnt2#0 main::@1/(byte) cnt2#1 )
|
||||
(byte) cnt#12 ← phi( main/(const byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#1 ← ++ (byte) cnt#12
|
||||
(byte) cnt2#1 ← ++ (byte) cnt2#11
|
||||
(byte) cnt3#1 ← ++ (byte) cnt3#11
|
||||
(byte) inccnt::return#0 ← (byte) cnt#1
|
||||
to:inccnt::@return
|
||||
inccnt::@return: scope:[inccnt] from inccnt
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @3
|
||||
|
||||
Consolidated assigned array index constant in assignment *(SCREEN#0+0)
|
||||
Consolidated assigned array index constant in assignment *(SCREEN#0+1)
|
||||
Succesful SSA optimization Pass2ConstantAdditionElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@3
|
||||
@3: scope:[] from @begin
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte~) main::$0 ← (byte) inccnt::return#0
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0
|
||||
(byte) cnt#3 ← ++ (byte) cnt#1
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte~) main::$1 ← (byte) inccnt::return#0
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt3#11 ← phi( main/(const byte) cnt3#0 main::@1/(byte) cnt3#1 )
|
||||
(byte) cnt2#11 ← phi( main/(const byte) cnt2#0 main::@1/(byte) cnt2#1 )
|
||||
(byte) cnt#12 ← phi( main/(const byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#1 ← ++ (byte) cnt#12
|
||||
(byte) cnt2#1 ← ++ (byte) cnt2#11
|
||||
(byte) cnt3#1 ← ++ (byte) cnt3#11
|
||||
@ -615,21 +577,21 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte~) main::$0 ← (byte) inccnt::return#0
|
||||
*((word) 1024 + (byte) 0) ← (byte~) main::$0
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0
|
||||
(byte) cnt#3 ← ++ (byte) cnt#1
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte~) main::$1 ← (byte) inccnt::return#0
|
||||
*((word) 1024 + (byte) 1) ← (byte~) main::$1
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt3#11 ← phi( main/(byte) 0 main::@1/(byte) cnt3#1 )
|
||||
(byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte) cnt2#1 )
|
||||
(byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt3#11 ← phi( main/(const byte) cnt3#0 main::@1/(byte) cnt3#1 )
|
||||
(byte) cnt2#11 ← phi( main/(const byte) cnt2#0 main::@1/(byte) cnt2#1 )
|
||||
(byte) cnt#12 ← phi( main/(const byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#1 ← ++ (byte) cnt#12
|
||||
(byte) cnt2#1 ← ++ (byte) cnt2#11
|
||||
(byte) cnt3#1 ← ++ (byte) cnt3#11
|
||||
@ -640,9 +602,16 @@ inccnt::@return: scope:[inccnt] from inccnt
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Consolidated assigned array index constant in assignment *(1024)
|
||||
Consolidated assigned array index constant in assignment *(1025)
|
||||
Succesful SSA optimization Pass2ConstantAdditionElimination
|
||||
Not aliassing across scopes: main::$0 inccnt::return#0
|
||||
Not aliassing across scopes: main::$1 inccnt::return#0
|
||||
Not aliassing across scopes: inccnt::return#0 cnt#1
|
||||
Not aliassing across scopes: main::$0 inccnt::return#0
|
||||
Not aliassing across scopes: main::$1 inccnt::return#0
|
||||
Not aliassing across scopes: inccnt::return#0 cnt#1
|
||||
Constant inlined cnt#0 = (byte) 0
|
||||
Constant inlined cnt3#0 = (byte) 0
|
||||
Constant inlined cnt2#0 = (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -652,13 +621,13 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte~) main::$0 ← (byte) inccnt::return#0
|
||||
*((word) 1024) ← (byte~) main::$0
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0
|
||||
(byte) cnt#3 ← ++ (byte) cnt#1
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte~) main::$1 ← (byte) inccnt::return#0
|
||||
*((word) 1025) ← (byte~) main::$1
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
@ -677,16 +646,11 @@ inccnt::@return: scope:[inccnt] from inccnt
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Not aliassing across scopes: main::$0 inccnt::return#0
|
||||
Not aliassing across scopes: main::$1 inccnt::return#0
|
||||
Not aliassing across scopes: inccnt::return#0 cnt#1
|
||||
Not aliassing across scopes: main::$0 inccnt::return#0
|
||||
Not aliassing across scopes: main::$1 inccnt::return#0
|
||||
Not aliassing across scopes: inccnt::return#0 cnt#1
|
||||
FINAL SYMBOL TABLE
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[256]) SCREEN
|
||||
(const byte[256]) SCREEN#0 = (word) 1024
|
||||
(byte) cnt
|
||||
(byte) cnt#1
|
||||
(byte) cnt#12
|
||||
@ -720,7 +684,7 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte~) main::$0 ← (byte) inccnt::return#0
|
||||
*((word) 1024) ← (byte~) main::$0
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0
|
||||
(byte) cnt#3 ← ++ (byte) cnt#1
|
||||
(byte~) cnt#15 ← (byte) cnt#3
|
||||
(byte~) cnt2#14 ← (byte) cnt2#1
|
||||
@ -729,7 +693,7 @@ main::@1: scope:[main] from main
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte~) main::$1 ← (byte) inccnt::return#0
|
||||
*((word) 1025) ← (byte~) main::$1
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
@ -772,7 +736,7 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ]
|
||||
[4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ]
|
||||
[4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ]
|
||||
[5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ]
|
||||
[6] (byte~) cnt#15 ← (byte) cnt#3 [ cnt#15 cnt2#1 cnt3#1 ]
|
||||
[7] (byte~) cnt2#14 ← (byte) cnt2#1 [ cnt#15 cnt2#14 cnt3#1 ]
|
||||
@ -781,7 +745,7 @@ main::@1: scope:[main] from main
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
[10] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ]
|
||||
[11] *((word) 1025) ← (byte~) main::$1 [ ]
|
||||
[11] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ]
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
[12] return [ ]
|
||||
@ -825,13 +789,13 @@ main: scope:[main] from @begin
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ]
|
||||
[4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ]
|
||||
[4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ]
|
||||
[5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ]
|
||||
[6] call inccnt param-assignment [ inccnt::return#0 ]
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
[7] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ]
|
||||
[8] *((word) 1025) ← (byte~) main::$1 [ ]
|
||||
[8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ]
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
[9] return [ ]
|
||||
@ -910,7 +874,8 @@ Allocated zp ZP_BYTE:6 [ main::$1 ]
|
||||
Allocated zp ZP_BYTE:7 [ cnt#1 ]
|
||||
Allocated zp ZP_BYTE:8 [ inccnt::return#0 ]
|
||||
INITIAL ASM
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
.label cnt = 7
|
||||
.label cnt2 = 3
|
||||
.label cnt3 = 4
|
||||
@ -948,9 +913,9 @@ main: {
|
||||
//SEG12 [3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ] -- zpby1=zpby2
|
||||
lda inccnt.return
|
||||
sta _0
|
||||
//SEG13 [4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=zpby1
|
||||
//SEG13 [4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=zpby1
|
||||
lda _0
|
||||
sta $400
|
||||
sta SCREEN+$0
|
||||
//SEG14 [5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ] -- zpby1=_inc_zpby2
|
||||
lda cnt
|
||||
sta cnt_3
|
||||
@ -968,9 +933,9 @@ main: {
|
||||
//SEG21 [7] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ] -- zpby1=zpby2
|
||||
lda inccnt.return
|
||||
sta _1
|
||||
//SEG22 [8] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=zpby1
|
||||
//SEG22 [8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ] -- _star_cowo1=zpby1
|
||||
lda _1
|
||||
sta $401
|
||||
sta SCREEN+$1
|
||||
jmp breturn
|
||||
//SEG23 main::@return
|
||||
breturn:
|
||||
@ -1025,7 +990,8 @@ Removing instruction jmp breturn
|
||||
Removing instruction jmp breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
.label cnt3 = 2
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
@ -1052,8 +1018,8 @@ main: {
|
||||
b1:
|
||||
//SEG12 [3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ]
|
||||
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG13 [4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta $400
|
||||
//SEG13 [4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta SCREEN+$0
|
||||
//SEG14 [5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG15 [6] call inccnt param-assignment [ inccnt::return#0 ]
|
||||
@ -1067,8 +1033,8 @@ main: {
|
||||
b2:
|
||||
//SEG21 [7] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ]
|
||||
// (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG22 [8] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta $401
|
||||
//SEG22 [8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta SCREEN+$1
|
||||
//SEG23 main::@return
|
||||
breturn:
|
||||
//SEG24 [9] return [ ]
|
||||
@ -1093,7 +1059,8 @@ inccnt: {
|
||||
Removing instruction main_from_bbegin:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
.label cnt3 = 2
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
@ -1119,8 +1086,8 @@ main: {
|
||||
b1:
|
||||
//SEG12 [3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ]
|
||||
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG13 [4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta $400
|
||||
//SEG13 [4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta SCREEN+$0
|
||||
//SEG14 [5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG15 [6] call inccnt param-assignment [ inccnt::return#0 ]
|
||||
@ -1134,8 +1101,8 @@ main: {
|
||||
b2:
|
||||
//SEG21 [7] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ]
|
||||
// (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG22 [8] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta $401
|
||||
//SEG22 [8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta SCREEN+$1
|
||||
//SEG23 main::@return
|
||||
breturn:
|
||||
//SEG24 [9] return [ ]
|
||||
@ -1167,7 +1134,8 @@ Removing instruction breturn:
|
||||
Removing instruction breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
.label cnt3 = 2
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
@ -1189,8 +1157,8 @@ main: {
|
||||
//SEG11 main::@1
|
||||
//SEG12 [3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ]
|
||||
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG13 [4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta $400
|
||||
//SEG13 [4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta SCREEN+$0
|
||||
//SEG14 [5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG15 [6] call inccnt param-assignment [ inccnt::return#0 ]
|
||||
@ -1202,8 +1170,8 @@ main: {
|
||||
//SEG20 main::@2
|
||||
//SEG21 [7] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ]
|
||||
// (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG22 [8] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta $401
|
||||
//SEG22 [8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta SCREEN+$1
|
||||
//SEG23 main::@return
|
||||
//SEG24 [9] return [ ]
|
||||
rts
|
||||
@ -1227,6 +1195,7 @@ FINAL SYMBOL TABLE
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[256]) SCREEN
|
||||
(const byte[256]) SCREEN#0 = (word) 1024
|
||||
(byte) cnt
|
||||
(byte) cnt#1 reg byte x 0.75
|
||||
(byte) cnt#12 reg byte x 4.0
|
||||
@ -1257,7 +1226,8 @@ reg byte x [ cnt#1 ]
|
||||
reg byte a [ inccnt::return#0 ]
|
||||
|
||||
FINAL CODE
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
.label cnt3 = 2
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
@ -1279,8 +1249,8 @@ main: {
|
||||
//SEG11 main::@1
|
||||
//SEG12 [3] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 cnt3#1 ]
|
||||
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG13 [4] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta $400
|
||||
//SEG13 [4] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte~) main::$0 [ cnt#1 cnt2#1 cnt3#1 ] -- _star_cowo1=aby
|
||||
sta SCREEN+$0
|
||||
//SEG14 [5] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 cnt3#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG15 [6] call inccnt param-assignment [ inccnt::return#0 ]
|
||||
@ -1292,8 +1262,8 @@ main: {
|
||||
//SEG20 main::@2
|
||||
//SEG21 [7] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ]
|
||||
// (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a
|
||||
//SEG22 [8] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta $401
|
||||
//SEG22 [8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte~) main::$1 [ ] -- _star_cowo1=aby
|
||||
sta SCREEN+$1
|
||||
//SEG23 main::@return
|
||||
//SEG24 [9] return [ ]
|
||||
rts
|
||||
|
@ -1,6 +1,7 @@
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[256]) SCREEN
|
||||
(const byte[256]) SCREEN#0 = (word) 1024
|
||||
(byte) cnt
|
||||
(byte) cnt#1 reg byte x 0.75
|
||||
(byte) cnt#12 reg byte x 4.0
|
||||
|
@ -1,12 +1,13 @@
|
||||
.const SCREEN = $400
|
||||
jsr main
|
||||
main: {
|
||||
ldx #$0
|
||||
jsr inccnt
|
||||
stx $400
|
||||
stx SCREEN+$0
|
||||
inx
|
||||
jsr inccnt
|
||||
inx
|
||||
stx $401
|
||||
stx SCREEN+$1
|
||||
rts
|
||||
}
|
||||
inccnt: {
|
||||
|
@ -7,13 +7,13 @@ main: scope:[main] from @begin
|
||||
[2] call inccnt param-assignment [ cnt#10 ]
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ]
|
||||
[3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ]
|
||||
[4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ]
|
||||
[5] call inccnt param-assignment [ cnt#10 ]
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
[6] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ]
|
||||
[7] *((word) 1025) ← (byte) cnt#1 [ ]
|
||||
[7] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ]
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
[8] return [ ]
|
||||
|
@ -274,82 +274,36 @@ INITIAL SSA SYMBOL TABLE
|
||||
(label) main::@2
|
||||
(label) main::@return
|
||||
|
||||
Constant (byte) cnt#0 (byte) 0
|
||||
Constant (byte[256]) SCREEN#0 (word) 1024
|
||||
Succesful SSA optimization Pass2ConstantPropagation
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@3
|
||||
@3: scope:[] from @begin
|
||||
(byte) cnt#9 ← phi( @begin/(byte) cnt#6 )
|
||||
(byte) cnt#1 ← (byte) cnt#9
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
(byte[256]) SCREEN#3 ← phi( @begin/(word) 1024 )
|
||||
(byte) cnt#15 ← phi( @begin/(byte) 0 )
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte[256]) SCREEN#1 ← phi( main/(byte[256]) SCREEN#3 )
|
||||
(byte) cnt#10 ← phi( main/(byte) cnt#8 )
|
||||
(byte) cnt#2 ← (byte) cnt#10
|
||||
*((byte[256]) SCREEN#1 + (byte) 0) ← (byte) cnt#2
|
||||
(byte) cnt#3 ← ++ (byte) cnt#2
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte[256]) SCREEN#2 ← phi( main::@1/(byte[256]) SCREEN#1 )
|
||||
(byte) cnt#11 ← phi( main::@1/(byte) cnt#8 )
|
||||
(byte) cnt#4 ← (byte) cnt#11
|
||||
(byte) cnt#5 ← ++ (byte) cnt#4
|
||||
*((byte[256]) SCREEN#2 + (byte) 1) ← (byte) cnt#5
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
(byte) cnt#12 ← phi( main::@2/(byte) cnt#5 )
|
||||
(byte) cnt#6 ← (byte) cnt#12
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt#13 ← phi( main/(byte) cnt#15 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#7 ← ++ (byte) cnt#13
|
||||
to:inccnt::@return
|
||||
inccnt::@return: scope:[inccnt] from inccnt
|
||||
(byte) cnt#14 ← phi( inccnt/(byte) cnt#7 )
|
||||
(byte) cnt#8 ← (byte) cnt#14
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @3
|
||||
|
||||
Alias (byte) cnt#1 = (byte) cnt#9 (byte) cnt#6 (byte) cnt#12 (byte) cnt#5
|
||||
Alias (byte) cnt#0 = (byte) cnt#15
|
||||
Alias (byte[256]) SCREEN#0 = (byte[256]) SCREEN#3 (byte[256]) SCREEN#1 (byte[256]) SCREEN#2
|
||||
Alias (byte) cnt#10 = (byte) cnt#8 (byte) cnt#2 (byte) cnt#11 (byte) cnt#4 (byte) cnt#14 (byte) cnt#7
|
||||
Alias (byte[256]) SCREEN#1 = (byte[256]) SCREEN#3 (byte[256]) SCREEN#2
|
||||
Succesful SSA optimization Pass2AliasElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
(byte) cnt#0 ← (byte) 0
|
||||
(byte[256]) SCREEN#0 ← (word) 1024
|
||||
call main param-assignment
|
||||
to:@3
|
||||
@3: scope:[] from @begin
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
(byte[256]) SCREEN#1 ← phi( @begin/(word) 1024 )
|
||||
(byte) cnt#15 ← phi( @begin/(byte) 0 )
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
*((byte[256]) SCREEN#1 + (byte) 0) ← (byte) cnt#10
|
||||
*((byte[256]) SCREEN#0 + (byte) 0) ← (byte) cnt#10
|
||||
(byte) cnt#3 ← ++ (byte) cnt#10
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte) cnt#1 ← ++ (byte) cnt#10
|
||||
*((byte[256]) SCREEN#1 + (byte) 1) ← (byte) cnt#1
|
||||
*((byte[256]) SCREEN#0 + (byte) 1) ← (byte) cnt#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt#13 ← phi( main/(byte) cnt#15 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#13 ← phi( main/(byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#10 ← ++ (byte) cnt#13
|
||||
to:inccnt::@return
|
||||
inccnt::@return: scope:[inccnt] from inccnt
|
||||
@ -357,9 +311,9 @@ inccnt::@return: scope:[inccnt] from inccnt
|
||||
to:@return
|
||||
@end: scope:[] from @3
|
||||
|
||||
Redundant Phi (byte) cnt#15 (byte) 0
|
||||
Redundant Phi (byte[256]) SCREEN#1 (word) 1024
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Constant (const byte) cnt#0 = 0
|
||||
Constant (const byte[256]) SCREEN#0 = 1024
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -370,19 +324,52 @@ main: scope:[main] from @begin
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
*((word) 1024 + (byte) 0) ← (byte) cnt#10
|
||||
*((const byte[256]) SCREEN#0 + (byte) 0) ← (byte) cnt#10
|
||||
(byte) cnt#3 ← ++ (byte) cnt#10
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte) cnt#1 ← ++ (byte) cnt#10
|
||||
*((word) 1024 + (byte) 1) ← (byte) cnt#1
|
||||
*((const byte[256]) SCREEN#0 + (byte) 1) ← (byte) cnt#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#13 ← phi( main/(const byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#10 ← ++ (byte) cnt#13
|
||||
to:inccnt::@return
|
||||
inccnt::@return: scope:[inccnt] from inccnt
|
||||
return
|
||||
to:@return
|
||||
@end: scope:[] from @3
|
||||
|
||||
Consolidated assigned array index constant in assignment *(SCREEN#0+0)
|
||||
Consolidated assigned array index constant in assignment *(SCREEN#0+1)
|
||||
Succesful SSA optimization Pass2ConstantAdditionElimination
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
to:@3
|
||||
@3: scope:[] from @begin
|
||||
to:@end
|
||||
main: scope:[main] from @begin
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10
|
||||
(byte) cnt#3 ← ++ (byte) cnt#10
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte) cnt#1 ← ++ (byte) cnt#10
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt#13 ← phi( main/(const byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#10 ← ++ (byte) cnt#13
|
||||
to:inccnt::@return
|
||||
inccnt::@return: scope:[inccnt] from inccnt
|
||||
@ -400,19 +387,19 @@ main: scope:[main] from @begin
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
*((word) 1024 + (byte) 0) ← (byte) cnt#10
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10
|
||||
(byte) cnt#3 ← ++ (byte) cnt#10
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte) cnt#1 ← ++ (byte) cnt#10
|
||||
*((word) 1024 + (byte) 1) ← (byte) cnt#1
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
to:@return
|
||||
inccnt: scope:[inccnt] from main main::@1
|
||||
(byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#13 ← phi( main/(const byte) cnt#0 main::@1/(byte) cnt#3 )
|
||||
(byte) cnt#10 ← ++ (byte) cnt#13
|
||||
to:inccnt::@return
|
||||
inccnt::@return: scope:[inccnt] from inccnt
|
||||
@ -420,9 +407,8 @@ inccnt::@return: scope:[inccnt] from inccnt
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Consolidated assigned array index constant in assignment *(1024)
|
||||
Consolidated assigned array index constant in assignment *(1025)
|
||||
Succesful SSA optimization Pass2ConstantAdditionElimination
|
||||
Constant inlined cnt#0 = (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -431,13 +417,13 @@ main: scope:[main] from @begin
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
*((word) 1024) ← (byte) cnt#10
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10
|
||||
(byte) cnt#3 ← ++ (byte) cnt#10
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte) cnt#1 ← ++ (byte) cnt#10
|
||||
*((word) 1025) ← (byte) cnt#1
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
@ -455,6 +441,7 @@ FINAL SYMBOL TABLE
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[256]) SCREEN
|
||||
(const byte[256]) SCREEN#0 = (word) 1024
|
||||
(byte) cnt
|
||||
(byte) cnt#1
|
||||
(byte) cnt#10
|
||||
@ -478,14 +465,14 @@ main: scope:[main] from @begin
|
||||
call inccnt param-assignment
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
*((word) 1024) ← (byte) cnt#10
|
||||
*((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10
|
||||
(byte) cnt#3 ← ++ (byte) cnt#10
|
||||
(byte~) cnt#16 ← (byte) cnt#3
|
||||
call inccnt param-assignment
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte) cnt#1 ← ++ (byte) cnt#10
|
||||
*((word) 1025) ← (byte) cnt#1
|
||||
*((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
return
|
||||
@ -516,14 +503,14 @@ main: scope:[main] from @begin
|
||||
[2] call inccnt param-assignment [ cnt#10 ]
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ]
|
||||
[3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ]
|
||||
[4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ]
|
||||
[5] (byte~) cnt#16 ← (byte) cnt#3 [ cnt#16 ]
|
||||
[6] call inccnt param-assignment [ cnt#10 ]
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
[7] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ]
|
||||
[8] *((word) 1025) ← (byte) cnt#1 [ ]
|
||||
[8] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ]
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
[9] return [ ]
|
||||
@ -554,13 +541,13 @@ main: scope:[main] from @begin
|
||||
[2] call inccnt param-assignment [ cnt#10 ]
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ]
|
||||
[3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ]
|
||||
[4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ]
|
||||
[5] call inccnt param-assignment [ cnt#10 ]
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1
|
||||
[6] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ]
|
||||
[7] *((word) 1025) ← (byte) cnt#1 [ ]
|
||||
[7] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ]
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@2
|
||||
[8] return [ ]
|
||||
@ -613,7 +600,8 @@ Allocated zp ZP_BYTE:2 [ cnt#13 cnt#3 ]
|
||||
Allocated zp ZP_BYTE:3 [ cnt#1 ]
|
||||
Allocated zp ZP_BYTE:4 [ cnt#10 ]
|
||||
INITIAL ASM
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
.label cnt = 3
|
||||
.label cnt_3 = 2
|
||||
.label cnt_10 = 4
|
||||
@ -639,9 +627,9 @@ main: {
|
||||
jmp b1
|
||||
//SEG9 main::@1
|
||||
b1:
|
||||
//SEG10 [3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=zpby1
|
||||
//SEG10 [3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=zpby1
|
||||
lda cnt_10
|
||||
sta $400
|
||||
sta SCREEN+$0
|
||||
//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- zpby1=_inc_zpby2
|
||||
lda cnt_10
|
||||
sta cnt_3
|
||||
@ -658,9 +646,9 @@ main: {
|
||||
lda cnt_10
|
||||
sta cnt
|
||||
inc cnt
|
||||
//SEG17 [7] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=zpby1
|
||||
//SEG17 [7] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ] -- _star_cowo1=zpby1
|
||||
lda cnt
|
||||
sta $401
|
||||
sta SCREEN+$1
|
||||
jmp breturn
|
||||
//SEG18 main::@return
|
||||
breturn:
|
||||
@ -700,7 +688,8 @@ Removing instruction jmp breturn
|
||||
Removing instruction jmp breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
@ -719,8 +708,8 @@ main: {
|
||||
jsr inccnt
|
||||
//SEG9 main::@1
|
||||
b1:
|
||||
//SEG10 [3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx $400
|
||||
//SEG10 [3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx SCREEN+$0
|
||||
//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG12 [5] call inccnt param-assignment [ cnt#10 ]
|
||||
@ -732,8 +721,8 @@ main: {
|
||||
b2:
|
||||
//SEG16 [6] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [7] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx $401
|
||||
//SEG17 [7] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx SCREEN+$1
|
||||
//SEG18 main::@return
|
||||
breturn:
|
||||
//SEG19 [8] return [ ]
|
||||
@ -752,7 +741,8 @@ inccnt: {
|
||||
Removing instruction main_from_bbegin:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
//SEG1 @begin
|
||||
bbegin:
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
@ -770,8 +760,8 @@ main: {
|
||||
jsr inccnt
|
||||
//SEG9 main::@1
|
||||
b1:
|
||||
//SEG10 [3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx $400
|
||||
//SEG10 [3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx SCREEN+$0
|
||||
//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG12 [5] call inccnt param-assignment [ cnt#10 ]
|
||||
@ -783,8 +773,8 @@ main: {
|
||||
b2:
|
||||
//SEG16 [6] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [7] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx $401
|
||||
//SEG17 [7] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx SCREEN+$1
|
||||
//SEG18 main::@return
|
||||
breturn:
|
||||
//SEG19 [8] return [ ]
|
||||
@ -810,7 +800,8 @@ Removing instruction breturn:
|
||||
Removing instruction breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
ASSEMBLER
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
//SEG3 [1] phi from @begin to main
|
||||
@ -824,8 +815,8 @@ main: {
|
||||
ldx #$0
|
||||
jsr inccnt
|
||||
//SEG9 main::@1
|
||||
//SEG10 [3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx $400
|
||||
//SEG10 [3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx SCREEN+$0
|
||||
//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG12 [5] call inccnt param-assignment [ cnt#10 ]
|
||||
@ -835,8 +826,8 @@ main: {
|
||||
//SEG15 main::@2
|
||||
//SEG16 [6] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [7] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx $401
|
||||
//SEG17 [7] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx SCREEN+$1
|
||||
//SEG18 main::@return
|
||||
//SEG19 [8] return [ ]
|
||||
rts
|
||||
@ -854,6 +845,7 @@ FINAL SYMBOL TABLE
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[256]) SCREEN
|
||||
(const byte[256]) SCREEN#0 = (word) 1024
|
||||
(byte) cnt
|
||||
(byte) cnt#1 reg byte x 4.0
|
||||
(byte) cnt#10 reg byte x 1.6
|
||||
@ -871,7 +863,8 @@ reg byte x [ cnt#1 ]
|
||||
reg byte x [ cnt#10 ]
|
||||
|
||||
FINAL CODE
|
||||
//SEG0 Global ZP labels
|
||||
//SEG0 Global Constants & labels
|
||||
.const SCREEN = $400
|
||||
//SEG1 @begin
|
||||
//SEG2 [0] call main param-assignment [ ]
|
||||
//SEG3 [1] phi from @begin to main
|
||||
@ -885,8 +878,8 @@ main: {
|
||||
ldx #$0
|
||||
jsr inccnt
|
||||
//SEG9 main::@1
|
||||
//SEG10 [3] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx $400
|
||||
//SEG10 [3] *((const byte[256]) SCREEN#0+(byte) 0) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby
|
||||
stx SCREEN+$0
|
||||
//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG12 [5] call inccnt param-assignment [ cnt#10 ]
|
||||
@ -896,8 +889,8 @@ main: {
|
||||
//SEG15 main::@2
|
||||
//SEG16 [6] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby
|
||||
inx
|
||||
//SEG17 [7] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx $401
|
||||
//SEG17 [7] *((const byte[256]) SCREEN#0+(byte) 1) ← (byte) cnt#1 [ ] -- _star_cowo1=xby
|
||||
stx SCREEN+$1
|
||||
//SEG18 main::@return
|
||||
//SEG19 [8] return [ ]
|
||||
rts
|
||||
|
@ -1,6 +1,7 @@
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte[256]) SCREEN
|
||||
(const byte[256]) SCREEN#0 = (word) 1024
|
||||
(byte) cnt
|
||||
(byte) cnt#1 reg byte x 4.0
|
||||
(byte) cnt#10 reg byte x 1.6
|
||||
|
@ -7,6 +7,7 @@ main: {
|
||||
rts
|
||||
}
|
||||
lvaluevar: {
|
||||
.const b = $4
|
||||
.label screen = 2
|
||||
lda #<$400
|
||||
sta screen
|
||||
@ -19,7 +20,7 @@ lvaluevar: {
|
||||
rts
|
||||
b2:
|
||||
ldy #$0
|
||||
lda #$4
|
||||
lda #b
|
||||
sta (screen),y
|
||||
inc screen
|
||||
bne !+
|
||||
@ -50,23 +51,25 @@ rvaluevar: {
|
||||
jmp b1
|
||||
}
|
||||
rvalue: {
|
||||
lda $400
|
||||
lda $401
|
||||
.const SCREEN = $400
|
||||
lda SCREEN
|
||||
lda SCREEN+$1
|
||||
ldx #$2
|
||||
b1:
|
||||
cpx #$a
|
||||
bcc b2
|
||||
rts
|
||||
b2:
|
||||
lda $400,x
|
||||
lda SCREEN,x
|
||||
inx
|
||||
jmp b1
|
||||
}
|
||||
lvalue: {
|
||||
.const SCREEN = $400
|
||||
lda #$1
|
||||
sta $400
|
||||
sta SCREEN
|
||||
lda #$2
|
||||
sta $401
|
||||
sta SCREEN+$1
|
||||
ldx #$2
|
||||
b1:
|
||||
cpx #$a
|
||||
@ -74,7 +77,7 @@ lvalue: {
|
||||
rts
|
||||
b2:
|
||||
lda #$3
|
||||
sta $400,x
|
||||
sta SCREEN,x
|
||||
inx
|
||||
jmp b1
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ lvaluevar::@return: scope:[lvaluevar] from lvaluevar::@1
|
||||
[10] return [ ]
|
||||
to:@return
|
||||
lvaluevar::@2: scope:[lvaluevar] from lvaluevar::@1
|
||||
[11] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ lvaluevar::i#2 lvaluevar::screen#2 ]
|
||||
[11] *((byte*) lvaluevar::screen#2) ← (const byte) lvaluevar::b#0 [ lvaluevar::i#2 lvaluevar::screen#2 ]
|
||||
[12] (byte*) lvaluevar::screen#1 ← ++ (byte*) lvaluevar::screen#2 [ lvaluevar::i#2 lvaluevar::screen#1 ]
|
||||
[13] (byte) lvaluevar::i#1 ← ++ (byte) lvaluevar::i#2 [ lvaluevar::i#1 lvaluevar::screen#1 ]
|
||||
to:lvaluevar::@1
|
||||
@ -51,8 +51,8 @@ rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
|
||||
[20] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ]
|
||||
to:rvaluevar::@1
|
||||
rvalue: scope:[rvalue] from main::@1
|
||||
[21] (byte) rvalue::b#0 ← * (word) 1024 [ ]
|
||||
[22] (byte) rvalue::b#1 ← * (word) 1025 [ ]
|
||||
[21] (byte) rvalue::b#0 ← * (const byte[1024]) rvalue::SCREEN#0 [ ]
|
||||
[22] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte) 1 [ ]
|
||||
to:rvalue::@1
|
||||
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
|
||||
[23] (byte) rvalue::i#2 ← phi( rvalue/(byte) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ]
|
||||
@ -62,12 +62,12 @@ rvalue::@return: scope:[rvalue] from rvalue::@1
|
||||
[25] return [ ]
|
||||
to:@return
|
||||
rvalue::@2: scope:[rvalue] from rvalue::@1
|
||||
[26] (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 [ rvalue::i#2 ]
|
||||
[26] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ]
|
||||
[27] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ]
|
||||
to:rvalue::@1
|
||||
lvalue: scope:[lvalue] from main
|
||||
[28] *((word) 1024) ← (byte) 1 [ ]
|
||||
[29] *((word) 1025) ← (byte) 2 [ ]
|
||||
[28] *((const byte[1024]) lvalue::SCREEN#0) ← (byte) 1 [ ]
|
||||
[29] *((const byte[1024]) lvalue::SCREEN#0+(byte) 1) ← (byte) 2 [ ]
|
||||
to:lvalue::@1
|
||||
lvalue::@1: scope:[lvalue] from lvalue lvalue::@2
|
||||
[30] (byte) lvalue::i#2 ← phi( lvalue/(byte) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ]
|
||||
@ -77,6 +77,6 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
|
||||
[32] return [ ]
|
||||
to:@return
|
||||
lvalue::@2: scope:[lvalue] from lvalue::@1
|
||||
[33] *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ]
|
||||
[33] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ]
|
||||
[34] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ]
|
||||
to:lvalue::@1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,7 @@
|
||||
(label) lvalue::@2
|
||||
(label) lvalue::@return
|
||||
(byte[1024]) lvalue::SCREEN
|
||||
(const byte[1024]) lvalue::SCREEN#0 = (word) 1024
|
||||
(byte) lvalue::i
|
||||
(byte) lvalue::i#1 reg byte x 22.0
|
||||
(byte) lvalue::i#2 reg byte x 14.666666666666666
|
||||
@ -13,6 +14,7 @@
|
||||
(label) lvaluevar::@2
|
||||
(label) lvaluevar::@return
|
||||
(byte) lvaluevar::b
|
||||
(const byte) lvaluevar::b#0 = (byte) 4
|
||||
(byte) lvaluevar::i
|
||||
(byte) lvaluevar::i#1 reg byte x 22.0
|
||||
(byte) lvaluevar::i#2 reg byte x 8.25
|
||||
@ -29,6 +31,7 @@
|
||||
(label) rvalue::@2
|
||||
(label) rvalue::@return
|
||||
(byte[1024]) rvalue::SCREEN
|
||||
(const byte[1024]) rvalue::SCREEN#0 = (word) 1024
|
||||
(byte) rvalue::b
|
||||
(byte) rvalue::b#0 reg byte a 20.0
|
||||
(byte) rvalue::b#1 reg byte a 20.0
|
||||
|
@ -319,8 +319,8 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte[1024]) main::SCREEN#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte[1024]) main::SCREEN#0 = 1024
|
||||
Constant (const byte) main::i#0 = 2
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -342,8 +342,8 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Redundant Phi (byte[1024]) main::SCREEN#1 (const byte[1024]) main::SCREEN#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Constant (const byte[1024]) main::SCREEN#1 = main::SCREEN#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -355,7 +355,7 @@ main::@1: scope:[main] from main main::@2
|
||||
if((byte) main::i#2<(byte) 10) goto main::@2
|
||||
to:main::@return
|
||||
main::@2: scope:[main] from main::@1
|
||||
(byte) main::b#0 ← (const byte[1024]) main::SCREEN#0 *idx (byte) main::i#2
|
||||
(byte) main::b#0 ← (const byte[1024]) main::SCREEN#1 *idx (byte) main::i#2
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
to:main::@1
|
||||
main::@return: scope:[main] from main::@1
|
||||
@ -363,6 +363,9 @@ main::@return: scope:[main] from main::@1
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Constant inlined main::SCREEN#1 = (const byte[1024]) main::SCREEN#0
|
||||
Constant inlined main::i#0 = (byte) 2
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
|
@ -316,12 +316,15 @@ sum::@return: scope:[sum] from sum
|
||||
to:@return
|
||||
@end: scope:[] from @4
|
||||
|
||||
Constant (const byte) sum::a#0
|
||||
Constant (const byte) sum::b#0
|
||||
Constant (const byte) sum::a#1
|
||||
Constant (const byte) sum::b#1
|
||||
Constant (const byte) sum::a#2
|
||||
Constant (const byte) sum::b#2
|
||||
Not aliassing across scopes: s1#0 sum::return#0
|
||||
Not aliassing across scopes: s2#0 sum::return#0
|
||||
Not aliassing across scopes: s3#0 sum::return#0
|
||||
Constant (const byte) sum::a#0 = 1
|
||||
Constant (const byte) sum::b#0 = 2
|
||||
Constant (const byte) sum::a#1 = 3
|
||||
Constant (const byte) sum::b#1 = 4
|
||||
Constant (const byte) sum::a#2 = 9
|
||||
Constant (const byte) sum::b#2 = 13
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
|
@ -139,7 +139,7 @@ main::@return: scope:[main] from main
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) SCREEN#0
|
||||
Constant (const byte*) SCREEN#0 = 1024
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
|
@ -1,3 +1,9 @@
|
||||
.const SCREEN = $400
|
||||
.const COLORS = $d800
|
||||
.const FILL = $e6
|
||||
.const XPOS = $1000
|
||||
.const YPOS = $1100
|
||||
.const COLS = $1200
|
||||
.label numpoints = 8
|
||||
jsr main
|
||||
main: {
|
||||
@ -41,64 +47,64 @@ main: {
|
||||
rts
|
||||
}
|
||||
animate: {
|
||||
lda $1000
|
||||
lda XPOS+$0
|
||||
clc
|
||||
adc #$1
|
||||
sta $1000
|
||||
lda $1000
|
||||
sta XPOS+$0
|
||||
lda XPOS+$0
|
||||
cmp #$28
|
||||
bne b1
|
||||
lda #$0
|
||||
sta $1000
|
||||
sta XPOS+$0
|
||||
b1:
|
||||
lda $1100
|
||||
lda YPOS+$0
|
||||
clc
|
||||
adc #$1
|
||||
sta $1100
|
||||
lda $1100
|
||||
sta YPOS+$0
|
||||
lda YPOS+$0
|
||||
cmp #$19
|
||||
bne b2
|
||||
lda #$0
|
||||
sta $1100
|
||||
sta YPOS+$0
|
||||
b2:
|
||||
ldx $1001
|
||||
ldx XPOS+$1
|
||||
dex
|
||||
stx $1001
|
||||
lda $1001
|
||||
stx XPOS+$1
|
||||
lda XPOS+$1
|
||||
cmp #$ff
|
||||
bne b3
|
||||
lda #$28
|
||||
sta $1001
|
||||
sta XPOS+$1
|
||||
b3:
|
||||
lda $1102
|
||||
lda YPOS+$2
|
||||
clc
|
||||
adc #$1
|
||||
sta $1102
|
||||
lda $1102
|
||||
sta YPOS+$2
|
||||
lda YPOS+$2
|
||||
cmp #$19
|
||||
bne b4
|
||||
lda #$0
|
||||
sta $1102
|
||||
sta YPOS+$2
|
||||
b4:
|
||||
ldx $1103
|
||||
ldx YPOS+$3
|
||||
dex
|
||||
stx $1103
|
||||
lda $1103
|
||||
stx YPOS+$3
|
||||
lda YPOS+$3
|
||||
cmp #$ff
|
||||
bne breturn
|
||||
lda #$19
|
||||
sta $1103
|
||||
lda $1003
|
||||
sta YPOS+$3
|
||||
lda XPOS+$3
|
||||
clc
|
||||
adc #$7
|
||||
sta $1003
|
||||
lda $1003
|
||||
sta XPOS+$3
|
||||
lda XPOS+$3
|
||||
cmp #$28
|
||||
bcc breturn
|
||||
lda $1003
|
||||
lda XPOS+$3
|
||||
sec
|
||||
sbc #$28
|
||||
sta $1003
|
||||
sta XPOS+$3
|
||||
breturn:
|
||||
rts
|
||||
}
|
||||
@ -106,9 +112,9 @@ render: {
|
||||
.label x = 5
|
||||
.label colline = 3
|
||||
.label y = 2
|
||||
lda #<$d800
|
||||
lda #<COLORS
|
||||
sta colline
|
||||
lda #>$d800
|
||||
lda #>COLORS
|
||||
sta colline+$1
|
||||
lda #$0
|
||||
sta y
|
||||
@ -153,9 +159,9 @@ findcol: {
|
||||
sta mindiff
|
||||
ldx #$0
|
||||
b1:
|
||||
lda $1000,x
|
||||
lda XPOS,x
|
||||
sta xp
|
||||
lda $1100,x
|
||||
lda YPOS,x
|
||||
sta yp
|
||||
lda x
|
||||
cmp xp
|
||||
@ -186,7 +192,7 @@ findcol: {
|
||||
b7:
|
||||
cmp mindiff
|
||||
bcs b21
|
||||
ldy $1200,x
|
||||
ldy COLS,x
|
||||
b8:
|
||||
inx
|
||||
cpx numpoints
|
||||
@ -214,24 +220,24 @@ findcol: {
|
||||
}
|
||||
initscreen: {
|
||||
.label screen = 3
|
||||
lda #<$400
|
||||
lda #<SCREEN
|
||||
sta screen
|
||||
lda #>$400
|
||||
lda #>SCREEN
|
||||
sta screen+$1
|
||||
b1:
|
||||
ldy #$0
|
||||
lda #$e6
|
||||
lda #FILL
|
||||
sta (screen),y
|
||||
inc screen
|
||||
bne !+
|
||||
inc screen+$1
|
||||
!:
|
||||
lda screen+$1
|
||||
cmp #>$7e8
|
||||
cmp #>SCREEN+$3e8
|
||||
bcc b1
|
||||
bne !+
|
||||
lda screen
|
||||
cmp #<$7e8
|
||||
cmp #<SCREEN+$3e8
|
||||
bcc b1
|
||||
!:
|
||||
rts
|
||||
@ -239,13 +245,13 @@ initscreen: {
|
||||
addpoint: {
|
||||
.label c = 2
|
||||
ldx numpoints
|
||||
sta $1000,x
|
||||
sta XPOS,x
|
||||
tya
|
||||
ldy numpoints
|
||||
sta $1100,y
|
||||
sta YPOS,y
|
||||
lda c
|
||||
ldx numpoints
|
||||
sta $1200,x
|
||||
sta COLS,x
|
||||
inc numpoints
|
||||
rts
|
||||
}
|
||||
|
@ -37,64 +37,64 @@ main::@return: scope:[main] from main::@11
|
||||
[12] return [ ]
|
||||
to:@return
|
||||
animate: scope:[animate] from main::@10
|
||||
[13] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ]
|
||||
[13] (byte~) animate::$0 ← * (const byte[256]) XPOS#0+(byte) 0 [ animate::$0 ]
|
||||
[14] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ]
|
||||
[15] *((word) 4096) ← (byte~) animate::$1 [ ]
|
||||
[16] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ]
|
||||
[15] *((const byte[256]) XPOS#0+(byte) 0) ← (byte~) animate::$1 [ ]
|
||||
[16] (byte~) animate::$2 ← * (const byte[256]) XPOS#0+(byte) 0 [ animate::$2 ]
|
||||
[17] if((byte~) animate::$2!=(byte) 40) goto animate::@1 [ ]
|
||||
to:animate::@7
|
||||
animate::@7: scope:[animate] from animate
|
||||
[18] *((word) 4096) ← (byte) 0 [ ]
|
||||
[18] *((const byte[256]) XPOS#0+(byte) 0) ← (byte) 0 [ ]
|
||||
to:animate::@1
|
||||
animate::@1: scope:[animate] from animate animate::@7
|
||||
[19] (byte~) animate::$5 ← * (word) 4352 [ animate::$5 ]
|
||||
[19] (byte~) animate::$5 ← * (const byte[256]) YPOS#0+(byte) 0 [ animate::$5 ]
|
||||
[20] (byte~) animate::$6 ← (byte~) animate::$5 + (byte) 1 [ animate::$6 ]
|
||||
[21] *((word) 4352) ← (byte~) animate::$6 [ ]
|
||||
[22] (byte~) animate::$7 ← * (word) 4352 [ animate::$7 ]
|
||||
[21] *((const byte[256]) YPOS#0+(byte) 0) ← (byte~) animate::$6 [ ]
|
||||
[22] (byte~) animate::$7 ← * (const byte[256]) YPOS#0+(byte) 0 [ animate::$7 ]
|
||||
[23] if((byte~) animate::$7!=(byte) 25) goto animate::@2 [ ]
|
||||
to:animate::@8
|
||||
animate::@8: scope:[animate] from animate::@1
|
||||
[24] *((word) 4352) ← (byte) 0 [ ]
|
||||
[24] *((const byte[256]) YPOS#0+(byte) 0) ← (byte) 0 [ ]
|
||||
to:animate::@2
|
||||
animate::@2: scope:[animate] from animate::@1 animate::@8
|
||||
[25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ]
|
||||
[25] (byte~) animate::$10 ← * (const byte[256]) XPOS#0+(byte) 1 [ animate::$10 ]
|
||||
[26] (byte~) animate::$11 ← (byte~) animate::$10 - (byte) 1 [ animate::$11 ]
|
||||
[27] *((word) 4097) ← (byte~) animate::$11 [ ]
|
||||
[28] (byte~) animate::$12 ← * (word) 4097 [ animate::$12 ]
|
||||
[27] *((const byte[256]) XPOS#0+(byte) 1) ← (byte~) animate::$11 [ ]
|
||||
[28] (byte~) animate::$12 ← * (const byte[256]) XPOS#0+(byte) 1 [ animate::$12 ]
|
||||
[29] if((byte~) animate::$12!=(byte) 255) goto animate::@3 [ ]
|
||||
to:animate::@9
|
||||
animate::@9: scope:[animate] from animate::@2
|
||||
[30] *((word) 4097) ← (byte) 40 [ ]
|
||||
[30] *((const byte[256]) XPOS#0+(byte) 1) ← (byte) 40 [ ]
|
||||
to:animate::@3
|
||||
animate::@3: scope:[animate] from animate::@2 animate::@9
|
||||
[31] (byte~) animate::$15 ← * (word) 4354 [ animate::$15 ]
|
||||
[31] (byte~) animate::$15 ← * (const byte[256]) YPOS#0+(byte) 2 [ animate::$15 ]
|
||||
[32] (byte~) animate::$16 ← (byte~) animate::$15 + (byte) 1 [ animate::$16 ]
|
||||
[33] *((word) 4354) ← (byte~) animate::$16 [ ]
|
||||
[34] (byte~) animate::$17 ← * (word) 4354 [ animate::$17 ]
|
||||
[33] *((const byte[256]) YPOS#0+(byte) 2) ← (byte~) animate::$16 [ ]
|
||||
[34] (byte~) animate::$17 ← * (const byte[256]) YPOS#0+(byte) 2 [ animate::$17 ]
|
||||
[35] if((byte~) animate::$17!=(byte) 25) goto animate::@4 [ ]
|
||||
to:animate::@10
|
||||
animate::@10: scope:[animate] from animate::@3
|
||||
[36] *((word) 4354) ← (byte) 0 [ ]
|
||||
[36] *((const byte[256]) YPOS#0+(byte) 2) ← (byte) 0 [ ]
|
||||
to:animate::@4
|
||||
animate::@4: scope:[animate] from animate::@10 animate::@3
|
||||
[37] (byte~) animate::$20 ← * (word) 4355 [ animate::$20 ]
|
||||
[37] (byte~) animate::$20 ← * (const byte[256]) YPOS#0+(byte) 3 [ animate::$20 ]
|
||||
[38] (byte~) animate::$21 ← (byte~) animate::$20 - (byte) 1 [ animate::$21 ]
|
||||
[39] *((word) 4355) ← (byte~) animate::$21 [ ]
|
||||
[40] (byte~) animate::$22 ← * (word) 4355 [ animate::$22 ]
|
||||
[39] *((const byte[256]) YPOS#0+(byte) 3) ← (byte~) animate::$21 [ ]
|
||||
[40] (byte~) animate::$22 ← * (const byte[256]) YPOS#0+(byte) 3 [ animate::$22 ]
|
||||
[41] if((byte~) animate::$22!=(byte) 255) goto animate::@return [ ]
|
||||
to:animate::@11
|
||||
animate::@11: scope:[animate] from animate::@4
|
||||
[42] *((word) 4355) ← (byte) 25 [ ]
|
||||
[43] (byte~) animate::$25 ← * (word) 4099 [ animate::$25 ]
|
||||
[42] *((const byte[256]) YPOS#0+(byte) 3) ← (byte) 25 [ ]
|
||||
[43] (byte~) animate::$25 ← * (const byte[256]) XPOS#0+(byte) 3 [ animate::$25 ]
|
||||
[44] (byte~) animate::$26 ← (byte~) animate::$25 + (byte) 7 [ animate::$26 ]
|
||||
[45] *((word) 4099) ← (byte~) animate::$26 [ ]
|
||||
[46] (byte~) animate::$27 ← * (word) 4099 [ animate::$27 ]
|
||||
[45] *((const byte[256]) XPOS#0+(byte) 3) ← (byte~) animate::$26 [ ]
|
||||
[46] (byte~) animate::$27 ← * (const byte[256]) XPOS#0+(byte) 3 [ animate::$27 ]
|
||||
[47] if((byte~) animate::$27<(byte) 40) goto animate::@return [ ]
|
||||
to:animate::@12
|
||||
animate::@12: scope:[animate] from animate::@11
|
||||
[48] (byte~) animate::$30 ← * (word) 4099 [ animate::$30 ]
|
||||
[48] (byte~) animate::$30 ← * (const byte[256]) XPOS#0+(byte) 3 [ animate::$30 ]
|
||||
[49] (byte~) animate::$31 ← (byte~) animate::$30 - (byte) 40 [ animate::$31 ]
|
||||
[50] *((word) 4099) ← (byte~) animate::$31 [ ]
|
||||
[50] *((const byte[256]) XPOS#0+(byte) 3) ← (byte~) animate::$31 [ ]
|
||||
to:animate::@return
|
||||
animate::@return: scope:[animate] from animate::@11 animate::@12 animate::@4
|
||||
[51] return [ ]
|
||||
@ -103,7 +103,7 @@ render: scope:[render] from main::@1
|
||||
[52] phi() [ numpoints#1 ]
|
||||
to:render::@1
|
||||
render::@1: scope:[render] from render render::@3
|
||||
[53] (byte*) render::colline#2 ← phi( render/(word) 55296 render::@3/(byte*) render::colline#1 ) [ render::y#2 render::colline#2 numpoints#1 ]
|
||||
[53] (byte*) render::colline#2 ← phi( render/(const byte*) COLORS#0 render::@3/(byte*) render::colline#1 ) [ render::y#2 render::colline#2 numpoints#1 ]
|
||||
[53] (byte) render::y#2 ← phi( render/(byte) 0 render::@3/(byte) render::y#1 ) [ render::y#2 render::colline#2 numpoints#1 ]
|
||||
to:render::@2
|
||||
render::@2: scope:[render] from render::@1 render::@5
|
||||
@ -133,8 +133,8 @@ findcol::@1: scope:[findcol] from findcol findcol::@19
|
||||
[67] (byte) findcol::mincol#11 ← phi( findcol/(byte) 0 findcol::@19/(byte) findcol::mincol#2 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ]
|
||||
[67] (byte) findcol::mindiff#10 ← phi( findcol/(byte) 255 findcol::@19/(byte~) findcol::mindiff#13 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ]
|
||||
[67] (byte) findcol::i#12 ← phi( findcol/(byte) 0 findcol::@19/(byte) findcol::i#1 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ]
|
||||
[68] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 numpoints#1 ]
|
||||
[69] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 numpoints#1 ]
|
||||
[68] (byte) findcol::xp#0 ← (const byte[256]) XPOS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 numpoints#1 ]
|
||||
[69] (byte) findcol::yp#0 ← (const byte[256]) YPOS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 numpoints#1 ]
|
||||
[70] if((byte) findcol::x#0!=(byte) findcol::xp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 numpoints#1 ]
|
||||
to:findcol::@9
|
||||
findcol::@9: scope:[findcol] from findcol::@1
|
||||
@ -163,7 +163,7 @@ findcol::@7: scope:[findcol] from findcol::@14 findcol::@6
|
||||
[81] if((byte) findcol::diff#6>=(byte) findcol::mindiff#10) goto findcol::@21 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#6 numpoints#1 ]
|
||||
to:findcol::@16
|
||||
findcol::@16: scope:[findcol] from findcol::@7
|
||||
[82] (byte) findcol::mincol#1 ← (word) 4608 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::diff#6 findcol::mincol#1 numpoints#1 ]
|
||||
[82] (byte) findcol::mincol#1 ← (const byte[256]) COLS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::diff#6 findcol::mincol#1 numpoints#1 ]
|
||||
to:findcol::@8
|
||||
findcol::@8: scope:[findcol] from findcol::@16 findcol::@21
|
||||
[83] (byte) findcol::mindiff#11 ← phi( findcol::@16/(byte) findcol::diff#6 findcol::@21/(byte~) findcol::mindiff#14 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mincol#2 findcol::mindiff#11 numpoints#1 ]
|
||||
@ -188,10 +188,10 @@ initscreen: scope:[initscreen] from main::@8
|
||||
[91] phi() [ ]
|
||||
to:initscreen::@1
|
||||
initscreen::@1: scope:[initscreen] from initscreen initscreen::@1
|
||||
[92] (byte*) initscreen::screen#2 ← phi( initscreen/(word) 1024 initscreen::@1/(byte*) initscreen::screen#1 ) [ initscreen::screen#2 ]
|
||||
[93] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ]
|
||||
[92] (byte*) initscreen::screen#2 ← phi( initscreen/(const byte*) SCREEN#0 initscreen::@1/(byte*) initscreen::screen#1 ) [ initscreen::screen#2 ]
|
||||
[93] *((byte*) initscreen::screen#2) ← (const byte) FILL#0 [ initscreen::screen#2 ]
|
||||
[94] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ]
|
||||
[95] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ]
|
||||
[95] if((byte*) initscreen::screen#1<(const byte*) SCREEN#0+(word) 1000) goto initscreen::@1 [ initscreen::screen#1 ]
|
||||
to:initscreen::@return
|
||||
initscreen::@return: scope:[initscreen] from initscreen::@1
|
||||
[96] return [ ]
|
||||
@ -201,9 +201,9 @@ addpoint: scope:[addpoint] from main main::@3 main::@4 main::@5 main::@6 main::
|
||||
[97] (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) [ addpoint::x#6 numpoints#19 addpoint::y#6 addpoint::c#6 ]
|
||||
[97] (byte) numpoints#19 ← phi( main/(byte) 0 main::@3/(byte) numpoints#1 main::@4/(byte) numpoints#1 main::@5/(byte) numpoints#1 main::@6/(byte) numpoints#1 main::@7/(byte) numpoints#1 ) [ addpoint::x#6 numpoints#19 addpoint::y#6 addpoint::c#6 ]
|
||||
[97] (byte) addpoint::x#6 ← phi( main/(byte) 5 main::@3/(byte) 15 main::@4/(byte) 6 main::@5/(byte) 34 main::@6/(byte) 21 main::@7/(byte) 31 ) [ addpoint::x#6 numpoints#19 addpoint::y#6 addpoint::c#6 ]
|
||||
[98] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ]
|
||||
[99] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ]
|
||||
[100] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ]
|
||||
[98] *((const byte[256]) XPOS#0 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ]
|
||||
[99] *((const byte[256]) YPOS#0 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ]
|
||||
[100] *((const byte[256]) COLS#0 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ]
|
||||
[101] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ numpoints#1 ]
|
||||
to:addpoint::@return
|
||||
addpoint::@return: scope:[addpoint] from addpoint
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,17 @@
|
||||
(label) @begin
|
||||
(label) @end
|
||||
(byte*) COLORS
|
||||
(const byte*) COLORS#0 = (word) 55296
|
||||
(byte[256]) COLS
|
||||
(const byte[256]) COLS#0 = (word) 4608
|
||||
(byte) FILL
|
||||
(const byte) FILL#0 = (byte) 230
|
||||
(byte*) SCREEN
|
||||
(const byte*) SCREEN#0 = (word) 1024
|
||||
(byte[256]) XPOS
|
||||
(const byte[256]) XPOS#0 = (word) 4096
|
||||
(byte[256]) YPOS
|
||||
(const byte[256]) YPOS#0 = (word) 4352
|
||||
(void()) addpoint((byte) addpoint::x , (byte) addpoint::y , (byte) addpoint::c)
|
||||
(label) addpoint::@return
|
||||
(byte) addpoint::c
|
||||
|
@ -666,6 +666,14 @@ sum2::@return: scope:[sum2] from sum2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Not aliassing across scopes: sum::a#0 main::i#2
|
||||
Not aliassing across scopes: sum::b#0 main::$0
|
||||
Not aliassing across scopes: sum::c#0 main::$1
|
||||
Not aliassing across scopes: main::$2 sum::return#0
|
||||
Not aliassing across scopes: sum2::a#0 main::i#2
|
||||
Not aliassing across scopes: sum2::b#0 main::$3
|
||||
Not aliassing across scopes: sum2::c#0 main::$4
|
||||
Not aliassing across scopes: main::$5 sum2::return#0
|
||||
Self Phi Eliminated (byte*) SCREEN#1
|
||||
Self Phi Eliminated (byte*) SCREEN2#1
|
||||
Succesful SSA optimization Pass2SelfPhiElimination
|
||||
@ -782,9 +790,9 @@ sum2::@return: scope:[sum2] from sum2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Constant (const byte*) SCREEN#0
|
||||
Constant (const byte*) SCREEN2#0
|
||||
Constant (const byte) main::i#0
|
||||
Constant (const byte*) SCREEN#0 = 1024
|
||||
Constant (const byte*) SCREEN2#0 = 1024+40
|
||||
Constant (const byte) main::i#0 = 0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -838,17 +846,9 @@ sum2::@return: scope:[sum2] from sum2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Not aliassing across scopes: sum::a#0 main::i#2
|
||||
Not aliassing across scopes: sum::b#0 main::$0
|
||||
Not aliassing across scopes: sum::c#0 main::$1
|
||||
Not aliassing across scopes: main::$2 sum::return#0
|
||||
Not aliassing across scopes: sum2::a#0 main::i#2
|
||||
Not aliassing across scopes: sum2::b#0 main::$3
|
||||
Not aliassing across scopes: sum2::c#0 main::$4
|
||||
Not aliassing across scopes: main::$5 sum2::return#0
|
||||
Redundant Phi (byte*) SCREEN#1 (const byte*) SCREEN#0
|
||||
Redundant Phi (byte*) SCREEN2#1 (const byte*) SCREEN2#0
|
||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||
Constant (const byte*) SCREEN#1 = SCREEN#0
|
||||
Constant (const byte*) SCREEN2#1 = SCREEN2#0
|
||||
Succesful SSA optimization Pass2ConstantIdentification
|
||||
CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
call main param-assignment
|
||||
@ -866,7 +866,7 @@ main::@1: scope:[main] from main main::@4
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
(byte~) main::$2 ← (byte) sum::return#0
|
||||
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$2
|
||||
*((const byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$2
|
||||
(byte~) main::$3 ← (byte) main::i#2 + (byte) 1
|
||||
(byte~) main::$4 ← (byte) main::i#2 + (byte) 2
|
||||
(byte) sum2::a#0 ← (byte) main::i#2
|
||||
@ -876,7 +876,7 @@ main::@3: scope:[main] from main::@1
|
||||
to:main::@4
|
||||
main::@4: scope:[main] from main::@3
|
||||
(byte~) main::$5 ← (byte) sum2::return#0
|
||||
*((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$5
|
||||
*((const byte*) SCREEN2#1 + (byte) main::i#2) ← (byte~) main::$5
|
||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||
if((byte) main::i#1!=(byte) 11) goto main::@1
|
||||
to:main::@return
|
||||
@ -899,6 +899,12 @@ sum2::@return: scope:[sum2] from sum2
|
||||
to:@return
|
||||
@end: scope:[] from @begin
|
||||
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Not aliassing across scopes: sum::a#0 main::i#2
|
||||
Not aliassing across scopes: sum::b#0 main::$0
|
||||
Not aliassing across scopes: sum::c#0 main::$1
|
||||
@ -907,6 +913,14 @@ Not aliassing across scopes: sum2::a#0 main::i#2
|
||||
Not aliassing across scopes: sum2::b#0 main::$3
|
||||
Not aliassing across scopes: sum2::c#0 main::$4
|
||||
Not aliassing across scopes: main::$5 sum2::return#0
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
|
||||
Constant inlined SCREEN#1 = (const byte*) SCREEN#0
|
||||
Constant inlined SCREEN2#1 = (const byte*) SCREEN2#0
|
||||
Constant inlined main::i#0 = (byte) 0
|
||||
Succesful SSA optimization Pass2ConstantInlining
|
||||
CONTROL FLOW GRAPH
|
||||
|
Loading…
Reference in New Issue
Block a user