mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-11-26 12:49:21 +00:00
Now identifying USE's that are also DEFINE's as unused.
This commit is contained in:
parent
0beeab9be2
commit
d0bc5af94b
@ -256,8 +256,31 @@ public class VariableReferenceInfos {
|
||||
*/
|
||||
public boolean isUnused(SymbolVariableRef variableRef) {
|
||||
Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(variableRef);
|
||||
if(refs == null) return true;
|
||||
return refs.stream().noneMatch(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.USE.equals(referenceToSymbolVar.getReferenceType()));
|
||||
if(refs == null)
|
||||
return true;
|
||||
final boolean noUses = refs.stream().noneMatch(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.USE.equals(referenceToSymbolVar.getReferenceType()));
|
||||
if(noUses)
|
||||
return true;
|
||||
|
||||
// Some USEs exits - examine if the variable is DEFINEd in the same statement
|
||||
for(ReferenceToSymbolVar useRef : refs) {
|
||||
if(ReferenceToSymbolVar.ReferenceType.USE.equals(useRef.getReferenceType())) {
|
||||
// Found a USE - examine if it is also a DEFINE
|
||||
boolean unused = false;
|
||||
if(useRef instanceof ReferenceInStatement) {
|
||||
for(ReferenceToSymbolVar defRef : refs) {
|
||||
if(defRef instanceof ReferenceInStatement && ReferenceToSymbolVar.ReferenceType.DEFINE.equals(defRef.getReferenceType())) {
|
||||
if(((ReferenceInStatement) defRef).getStatementIdx().equals(((ReferenceInStatement) useRef).getStatementIdx()))
|
||||
unused = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!unused)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// All USE-references were inside DEFINE-statements - effectively the var is unused!
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -279,6 +302,7 @@ public class VariableReferenceInfos {
|
||||
|
||||
/**
|
||||
* Get the index of the statement defining a variable
|
||||
*
|
||||
* @param variableRef The variable to look for
|
||||
* @return Index of the defining statement
|
||||
*/
|
||||
@ -291,14 +315,13 @@ public class VariableReferenceInfos {
|
||||
.filter(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.DEFINE.equals(referenceToSymbolVar.getReferenceType()))
|
||||
.findFirst();
|
||||
if(refDefine.isPresent()) {
|
||||
return ((ReferenceInStatement)refDefine.get()).getStatementIdx();
|
||||
return ((ReferenceInStatement) refDefine.get()).getStatementIdx();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get all statements referencing a variable
|
||||
*
|
||||
|
@ -4,8 +4,10 @@ import dk.camelot64.kickc.model.ControlFlowBlock;
|
||||
import dk.camelot64.kickc.model.Program;
|
||||
import dk.camelot64.kickc.model.VariableReferenceInfos;
|
||||
import dk.camelot64.kickc.model.statements.*;
|
||||
import dk.camelot64.kickc.model.symbols.*;
|
||||
import dk.camelot64.kickc.model.types.SymbolTypeStruct;
|
||||
import dk.camelot64.kickc.model.symbols.EnumDefinition;
|
||||
import dk.camelot64.kickc.model.symbols.Procedure;
|
||||
import dk.camelot64.kickc.model.symbols.StructDefinition;
|
||||
import dk.camelot64.kickc.model.symbols.Variable;
|
||||
import dk.camelot64.kickc.model.values.LValue;
|
||||
import dk.camelot64.kickc.model.values.StructUnwoundPlaceholder;
|
||||
import dk.camelot64.kickc.model.values.VariableRef;
|
||||
@ -36,29 +38,12 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
|
||||
while(stmtIt.hasNext()) {
|
||||
Statement statement = stmtIt.next();
|
||||
if(statement instanceof StatementAssignment) {
|
||||
StatementAssignment assignment = (StatementAssignment) statement;
|
||||
LValue lValue = assignment.getlValue();
|
||||
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
|
||||
LValue lValue = ((StatementAssignment) statement).getlValue();
|
||||
if(lValue instanceof VariableRef) {
|
||||
Variable variable = getScope().getVariable((VariableRef) lValue);
|
||||
boolean eliminate = false;
|
||||
if(variable == null) {
|
||||
// Already deleted
|
||||
eliminate = true;
|
||||
} else if(!variable.isExport()) {
|
||||
// Not volatile
|
||||
eliminate = true;
|
||||
} else if(variable.isStruct()) {
|
||||
if(assignment.getOperator()==null && assignment.getrValue2() instanceof StructUnwoundPlaceholder) {
|
||||
eliminate = true;
|
||||
}
|
||||
}
|
||||
if(eliminate) {
|
||||
if(!pass2 && isReturnValue(variable)) {
|
||||
// Do not eliminate return variables in pass 1
|
||||
continue;
|
||||
}
|
||||
if(eliminate(variable, referenceInfos, statement)) {
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused variable " + lValue.toString(getProgram()) + " and assignment " + assignment.toString(getProgram(), false));
|
||||
getLog().append("Eliminating unused variable " + lValue.toString(getProgram()) + " and assignment " + statement.toString(getProgram(), false));
|
||||
}
|
||||
stmtIt.remove();
|
||||
if(variable != null) {
|
||||
@ -68,50 +53,47 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
|
||||
}
|
||||
}
|
||||
} else if(statement instanceof StatementCall) {
|
||||
StatementCall call = (StatementCall) statement;
|
||||
LValue lValue = call.getlValue();
|
||||
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
|
||||
LValue lValue = ((StatementCall) statement).getlValue();
|
||||
if(lValue instanceof VariableRef) {
|
||||
Variable variable = getScope().getVariable((VariableRef) lValue);
|
||||
if(!variable.isVolatile()) {
|
||||
if(eliminate(variable, referenceInfos, statement)) {
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
|
||||
}
|
||||
if(variable != null) {
|
||||
variable.getScope().remove(variable);
|
||||
}
|
||||
call.setlValue(null);
|
||||
((StatementCall) statement).setlValue(null);
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
} else if(statement instanceof StatementCallFinalize) {
|
||||
StatementCallFinalize call = (StatementCallFinalize) statement;
|
||||
LValue lValue = call.getlValue();
|
||||
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
|
||||
LValue lValue = ((StatementCallFinalize) statement).getlValue();
|
||||
if(lValue instanceof VariableRef) {
|
||||
Variable variable = getScope().getVariable((VariableRef) lValue);
|
||||
if(!variable.isVolatile()) {
|
||||
if(eliminate(variable, referenceInfos, statement)) {
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
|
||||
}
|
||||
if(variable != null) {
|
||||
variable.getScope().remove(variable);
|
||||
}
|
||||
call.setlValue(null);
|
||||
((StatementCallFinalize) statement).setlValue(null);
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
} else if(statement instanceof StatementCallPointer) {
|
||||
StatementCallPointer call = (StatementCallPointer) statement;
|
||||
LValue lValue = call.getlValue();
|
||||
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
|
||||
LValue lValue = ((StatementCallPointer) statement).getlValue();
|
||||
if(lValue instanceof VariableRef) {
|
||||
Variable variable = getScope().getVariable((VariableRef) lValue);
|
||||
if(!variable.isVolatile()) {
|
||||
if(eliminate(variable, referenceInfos, statement)) {
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
|
||||
}
|
||||
if(variable != null) {
|
||||
variable.getScope().remove(variable);
|
||||
}
|
||||
call.setlValue(null);
|
||||
((StatementCallPointer) statement).setlValue(null);
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
@ -121,18 +103,16 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
|
||||
while(phiVarIt.hasNext()) {
|
||||
StatementPhiBlock.PhiVariable phiVariable = phiVarIt.next();
|
||||
VariableRef variableRef = phiVariable.getVariable();
|
||||
if(referenceInfos.isUnused(variableRef)) {
|
||||
Variable variable = getScope().getVariable(variableRef);
|
||||
if(!variable.isVolatile()) {
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
|
||||
}
|
||||
if(variable != null) {
|
||||
variable.getScope().remove(variable);
|
||||
}
|
||||
phiVarIt.remove();
|
||||
modified = true;
|
||||
Variable variable = getScope().getVariable(variableRef);
|
||||
if(eliminate(variable, referenceInfos, statement)) {
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
|
||||
}
|
||||
if(variable != null) {
|
||||
variable.getScope().remove(variable);
|
||||
}
|
||||
phiVarIt.remove();
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -140,28 +120,20 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
|
||||
}
|
||||
|
||||
for(Variable variable : getScope().getAllVariables(true)) {
|
||||
if(referenceInfos.isUnused(variable.getRef())) {
|
||||
if(!variable.isExport() && !variable.isKindPhiMaster()) {
|
||||
getLog().append("Eliminating unused variable with no statement " + variable.getRef().toString(getProgram()));
|
||||
variable.getScope().remove(variable);
|
||||
}
|
||||
if(eliminate(variable, referenceInfos, null) && !variable.isKindPhiMaster()) {
|
||||
getLog().append("Eliminating unused variable with no statement " + variable.getRef().toString(getProgram()));
|
||||
variable.getScope().remove(variable);
|
||||
}
|
||||
}
|
||||
|
||||
Collection<Variable> allConstants = getScope().getAllConstants(true);
|
||||
for(Variable constant : allConstants) {
|
||||
if(!(constant.getScope() instanceof EnumDefinition) && !(constant.getScope() instanceof StructDefinition)) {
|
||||
if(referenceInfos.isUnused(constant.getRef())) {
|
||||
if(constant.isExport()) {
|
||||
// Do not eliminate constants declared as export
|
||||
continue;
|
||||
}
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused constant " + constant.toString(getProgram()));
|
||||
}
|
||||
constant.getScope().remove(constant);
|
||||
modified = true;
|
||||
if(eliminate(constant, referenceInfos, null)) {
|
||||
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
|
||||
getLog().append("Eliminating unused constant " + constant.toString(getProgram()));
|
||||
}
|
||||
constant.getScope().remove(constant);
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -170,6 +142,40 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
|
||||
return modified;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the variable an unused variable that should be eliminated
|
||||
*
|
||||
* @param variable The variable
|
||||
* @param referenceInfos The reference info
|
||||
* @param statement The statement
|
||||
* @return true if the variable & statement should be eliminated
|
||||
*/
|
||||
private boolean eliminate(Variable variable, VariableReferenceInfos referenceInfos, Statement statement) {
|
||||
if(variable == null)
|
||||
// Eliminate if already deleted
|
||||
return true;
|
||||
if(variable.getScope() instanceof EnumDefinition || variable.getScope() instanceof StructDefinition)
|
||||
// Do not eliminate inside enums or structs
|
||||
return false;
|
||||
if(!pass2 && isReturnValue(variable)) {
|
||||
// Do not eliminate return variables in pass 1
|
||||
return false;
|
||||
}
|
||||
final boolean unused = referenceInfos.isUnused(variable.getRef());
|
||||
if(!unused)
|
||||
// Do not eliminate is not unused
|
||||
return false;
|
||||
if(!variable.isExport())
|
||||
// Eliminate if unused and not exported
|
||||
return true;
|
||||
if(variable.isStruct() && statement instanceof StatementAssignment) {
|
||||
StatementAssignment assignment = (StatementAssignment) statement;
|
||||
// Eliminate is a simple assignment of a struct-unwound-placeholder
|
||||
return assignment.getOperator() == null && assignment.getrValue2() instanceof StructUnwoundPlaceholder;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if a variable is the return value for a procedure
|
||||
*
|
||||
|
@ -3121,6 +3121,7 @@ Simplifying expression containing zero renderBobCleanup::screen#0 in [294] *((by
|
||||
Simplifying expression containing zero PROTO_BOB in [411] *((const byte*) PROTO_BOB + (byte) 0) ← (byte) 0
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#24
|
||||
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#11
|
||||
Eliminating unused variable (byte) charsetFindOrAddGlyph::return#0 and assignment [159] (byte) charsetFindOrAddGlyph::return#0 ← (byte) charsetFindOrAddGlyph::glyph_id#11
|
||||
Eliminating unused constant (const void*) memset::return#2
|
||||
Eliminating unused constant (const byte) bob_charset_next_id#27
|
||||
@ -3151,8 +3152,6 @@ Finalized unsigned number type (byte) $20
|
||||
Finalized unsigned number type (byte) 1
|
||||
Finalized unsigned number type (byte) 1
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Identical Phi Values (byte**) renderBobCleanupNext#11 (byte**) renderBobCleanupNext#13
|
||||
Successful SSA optimization Pass2IdenticalPhiElimination
|
||||
Constant right-side identified [0] (byte*) memset::end#0 ← (const byte*) memset::$2 + (const word) memset::num#0
|
||||
Constant right-side identified [49] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0
|
||||
Constant right-side identified [53] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff
|
||||
|
@ -3329,6 +3329,7 @@ Simplifying expression containing zero renderBobCleanup::screen#0 in [361] *((by
|
||||
Simplifying expression containing zero PROTO_BOB in [476] *((const byte*) PROTO_BOB + (byte) 0) ← (byte) 0
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#24
|
||||
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#11
|
||||
Eliminating unused variable (byte) bobCharsetFindOrAddGlyph::return#0 and assignment [199] (byte) bobCharsetFindOrAddGlyph::return#0 ← (byte) bobCharsetFindOrAddGlyph::glyph_id#11
|
||||
Eliminating unused constant (const void*) memset::return#2
|
||||
Eliminating unused constant (const byte) bob_charset_next_id#27
|
||||
@ -3358,8 +3359,6 @@ Finalized unsigned number type (byte) $20
|
||||
Finalized unsigned number type (byte) 1
|
||||
Finalized unsigned number type (byte) 1
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Identical Phi Values (byte**) renderBobCleanupNext#11 (byte**) renderBobCleanupNext#13
|
||||
Successful SSA optimization Pass2IdenticalPhiElimination
|
||||
Constant right-side identified [0] (byte*) memset::end#0 ← (const byte*) memset::$2 + (const word) memset::num#0
|
||||
Constant right-side identified [82] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0
|
||||
Constant right-side identified [86] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff
|
||||
|
@ -5,16 +5,13 @@
|
||||
.pc = $80d "Program"
|
||||
.label DC00 = $dc00
|
||||
main: {
|
||||
ldy #0
|
||||
__b1:
|
||||
iny
|
||||
__b2:
|
||||
ldx DC00
|
||||
txa
|
||||
and #$1f
|
||||
cpx #0
|
||||
bne __b1
|
||||
cmp #$1f
|
||||
beq __b2
|
||||
beq __b1
|
||||
jmp __b1
|
||||
}
|
||||
|
@ -13,14 +13,13 @@ main: scope:[main] from @1
|
||||
[4] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2 main::@3
|
||||
[5] (byte) rpc#4 ← phi( main/(byte) 0 main::@2/(byte) rpc#1 main::@3/(byte) rpc#1 )
|
||||
[6] (byte) rpc#1 ← ++ (byte) rpc#4
|
||||
[5] (byte) key#1 ← *((const byte*) DC00)
|
||||
[6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
|
||||
[7] if((byte) key#1!=(byte) 0) goto main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
[8] if((byte~) main::$1==(byte) $1f) goto main::@1
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1 main::@3
|
||||
[7] (byte) key#1 ← *((const byte*) DC00)
|
||||
[8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
|
||||
[9] if((byte) key#1!=(byte) 0) goto main::@1
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@2
|
||||
[10] if((byte~) main::$1==(byte) $1f) goto main::@2
|
||||
[9] phi()
|
||||
to:main::@1
|
||||
|
@ -1,21 +1,15 @@
|
||||
Culled Empty Block (label) main::@1
|
||||
Culled Empty Block (label) main::@4
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
@begin: scope:[] from
|
||||
(byte) rpc#0 ← (byte) 0
|
||||
(byte) key#0 ← (byte) 0
|
||||
to:@1
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from @1
|
||||
(byte) rpc#7 ← phi( @1/(byte) rpc#9 )
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@3
|
||||
(byte) rpc#4 ← phi( main/(byte) rpc#7 main::@3/(byte) rpc#8 )
|
||||
(byte) rpc#1 ← ++ (byte) rpc#4
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1 main::@2
|
||||
(byte) rpc#10 ← phi( main::@1/(byte) rpc#1 main::@2/(byte) rpc#10 )
|
||||
main::@2: scope:[main] from main main::@2 main::@3
|
||||
(byte) key#1 ← *((const byte*) DC00)
|
||||
(bool~) main::$0 ← (byte) key#1 == (number) 0
|
||||
(number~) main::$1 ← (byte) key#1 & (number) $1f
|
||||
@ -25,25 +19,19 @@ main::@2: scope:[main] from main::@1 main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@2
|
||||
(byte) key#6 ← phi( main::@2/(byte) key#1 )
|
||||
(byte) rpc#8 ← phi( main::@2/(byte) rpc#10 )
|
||||
if(true) goto main::@1
|
||||
if(true) goto main::@2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@3
|
||||
(byte) key#4 ← phi( main::@3/(byte) key#6 )
|
||||
(byte) rpc#5 ← phi( main::@3/(byte) rpc#8 )
|
||||
(byte) rpc#2 ← (byte) rpc#5
|
||||
(byte) key#2 ← (byte) key#4
|
||||
return
|
||||
to:@return
|
||||
@1: scope:[] from @begin
|
||||
(byte) key#7 ← phi( @begin/(byte) key#0 )
|
||||
(byte) rpc#9 ← phi( @begin/(byte) rpc#0 )
|
||||
call main
|
||||
to:@2
|
||||
@2: scope:[] from @1
|
||||
(byte) key#5 ← phi( @1/(byte) key#2 )
|
||||
(byte) rpc#6 ← phi( @1/(byte) rpc#2 )
|
||||
(byte) rpc#3 ← (byte) rpc#6
|
||||
(byte) key#3 ← (byte) key#5
|
||||
to:@end
|
||||
@end: scope:[] from @2
|
||||
@ -68,22 +56,9 @@ SYMBOL TABLE SSA
|
||||
(number~) main::$1
|
||||
(bool~) main::$2
|
||||
(bool~) main::$3
|
||||
(label) main::@1
|
||||
(label) main::@2
|
||||
(label) main::@3
|
||||
(label) main::@return
|
||||
(byte) rpc
|
||||
(byte) rpc#0
|
||||
(byte) rpc#1
|
||||
(byte) rpc#10
|
||||
(byte) rpc#2
|
||||
(byte) rpc#3
|
||||
(byte) rpc#4
|
||||
(byte) rpc#5
|
||||
(byte) rpc#6
|
||||
(byte) rpc#7
|
||||
(byte) rpc#8
|
||||
(byte) rpc#9
|
||||
|
||||
Adding number conversion cast (unumber) 0 in (bool~) main::$0 ← (byte) key#1 == (number) 0
|
||||
Adding number conversion cast (unumber) $1f in (number~) main::$1 ← (byte) key#1 & (number) $1f
|
||||
@ -100,55 +75,47 @@ Finalized unsigned number type (byte) $1f
|
||||
Finalized unsigned number type (byte) $1f
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Inferred type updated to byte in (unumber~) main::$1 ← (byte) key#1 & (byte) $1f
|
||||
Alias (byte) rpc#10 = (byte) rpc#8 (byte) rpc#5 (byte) rpc#2
|
||||
Alias (byte) key#1 = (byte) key#6 (byte) key#4 (byte) key#2
|
||||
Alias (byte) rpc#0 = (byte) rpc#9
|
||||
Alias (byte) key#0 = (byte) key#7
|
||||
Alias (byte) rpc#3 = (byte) rpc#6
|
||||
Alias (byte) key#3 = (byte) key#5
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Identical Phi Values (byte) rpc#7 (byte) rpc#0
|
||||
Identical Phi Values (byte) rpc#10 (byte) rpc#1
|
||||
Identical Phi Values (byte) rpc#3 (byte) rpc#10
|
||||
Identical Phi Values (byte) key#3 (byte) key#1
|
||||
Successful SSA optimization Pass2IdenticalPhiElimination
|
||||
Rewriting && if()-condition to two if()s [10] (bool~) main::$3 ← (bool~) main::$0 && (bool~) main::$2
|
||||
Rewriting && if()-condition to two if()s [5] (bool~) main::$3 ← (bool~) main::$0 && (bool~) main::$2
|
||||
Successful SSA optimization Pass2ConditionalAndOrRewriting
|
||||
Constant (const byte) rpc#0 = 0
|
||||
Constant (const byte) key#0 = 0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
if() condition always true - replacing block destination [13] if(true) goto main::@1
|
||||
if() condition always true - replacing block destination [8] if(true) goto main::@2
|
||||
Successful SSA optimization Pass2ConstantIfs
|
||||
Eliminating unused constant (const byte) key#0
|
||||
Successful SSA optimization PassNEliminateUnusedVars
|
||||
Removing unused block main::@return
|
||||
Successful SSA optimization Pass2EliminateUnusedBlocks
|
||||
Simple Condition (bool~) main::$0 [6] if((byte) key#1==(byte) 0) goto main::@5
|
||||
Simple Condition (bool~) main::$2 [8] if((byte~) main::$1==(byte) $1f) goto main::@2
|
||||
Simple Condition (bool~) main::$0 [4] if((byte) key#1==(byte) 0) goto main::@5
|
||||
Simple Condition (bool~) main::$2 [6] if((byte~) main::$1==(byte) $1f) goto main::@2
|
||||
Successful SSA optimization Pass2ConditionalJumpSimplification
|
||||
Negating conditional jump and destination [6] if((byte) key#1!=(byte) 0) goto main::@3
|
||||
Negating conditional jump and destination [4] if((byte) key#1!=(byte) 0) goto main::@3
|
||||
Successful SSA optimization Pass2ConditionalJumpSequenceImprovement
|
||||
Inlining constant with var siblings (const byte) rpc#0
|
||||
Constant inlined rpc#0 = (byte) 0
|
||||
Successful SSA optimization Pass2ConstantInlining
|
||||
Adding NOP phi() at start of @begin
|
||||
Adding NOP phi() at start of @1
|
||||
Adding NOP phi() at start of @2
|
||||
Adding NOP phi() at start of @end
|
||||
Adding NOP phi() at start of main
|
||||
Adding NOP phi() at start of main::@3
|
||||
CALL GRAPH
|
||||
Calls in [] to main:2
|
||||
|
||||
Created 1 initial phi equivalence classes
|
||||
Coalesced [12] rpc#11 ← rpc#1
|
||||
Coalesced down to 1 phi equivalence classes
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
Culled Empty Block (label) @2
|
||||
Culled Empty Block (label) main::@3
|
||||
Renumbering block main::@2 to main::@1
|
||||
Renumbering block main::@3 to main::@2
|
||||
Renumbering block main::@5 to main::@3
|
||||
Adding NOP phi() at start of @begin
|
||||
Adding NOP phi() at start of @1
|
||||
Adding NOP phi() at start of @end
|
||||
Adding NOP phi() at start of main
|
||||
Adding NOP phi() at start of main::@2
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
@begin: scope:[] from
|
||||
@ -166,16 +133,15 @@ main: scope:[main] from @1
|
||||
[4] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2 main::@3
|
||||
[5] (byte) rpc#4 ← phi( main/(byte) 0 main::@2/(byte) rpc#1 main::@3/(byte) rpc#1 )
|
||||
[6] (byte) rpc#1 ← ++ (byte) rpc#4
|
||||
[5] (byte) key#1 ← *((const byte*) DC00)
|
||||
[6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
|
||||
[7] if((byte) key#1!=(byte) 0) goto main::@2
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@1
|
||||
[8] if((byte~) main::$1==(byte) $1f) goto main::@1
|
||||
to:main::@2
|
||||
main::@2: scope:[main] from main::@1 main::@3
|
||||
[7] (byte) key#1 ← *((const byte*) DC00)
|
||||
[8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
|
||||
[9] if((byte) key#1!=(byte) 0) goto main::@1
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@2
|
||||
[10] if((byte~) main::$1==(byte) $1f) goto main::@2
|
||||
[9] phi()
|
||||
to:main::@1
|
||||
|
||||
|
||||
@ -184,21 +150,15 @@ VARIABLE REGISTER WEIGHTS
|
||||
(byte) key#1 151.5
|
||||
(void()) main()
|
||||
(byte~) main::$1 101.0
|
||||
(byte) rpc
|
||||
(byte) rpc#1 42.6
|
||||
(byte) rpc#4 213.0
|
||||
|
||||
Initial phi equivalence classes
|
||||
[ rpc#4 rpc#1 ]
|
||||
Added variable key#1 to live range equivalence class [ key#1 ]
|
||||
Added variable main::$1 to live range equivalence class [ main::$1 ]
|
||||
Complete equivalence classes
|
||||
[ rpc#4 rpc#1 ]
|
||||
[ key#1 ]
|
||||
[ main::$1 ]
|
||||
Allocated zp[1]:2 [ rpc#4 rpc#1 ]
|
||||
Allocated zp[1]:3 [ key#1 ]
|
||||
Allocated zp[1]:4 [ main::$1 ]
|
||||
Allocated zp[1]:2 [ key#1 ]
|
||||
Allocated zp[1]:3 [ main::$1 ]
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
@ -211,8 +171,7 @@ Target platform is c64basic / MOS6502X
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label DC00 = $dc00
|
||||
.label rpc = 2
|
||||
.label key = 3
|
||||
.label key = 2
|
||||
// @begin
|
||||
__bbegin:
|
||||
// [1] phi from @begin to @1 [phi:@begin->@1]
|
||||
@ -231,58 +190,48 @@ __bend_from___b1:
|
||||
__bend:
|
||||
// main
|
||||
main: {
|
||||
.label __1 = 4
|
||||
// [5] phi from main to main::@1 [phi:main->main::@1]
|
||||
__b1_from_main:
|
||||
// [5] phi (byte) rpc#4 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z rpc
|
||||
jmp __b1
|
||||
// [5] phi from main::@2 main::@3 to main::@1 [phi:main::@2/main::@3->main::@1]
|
||||
__b1_from___b2:
|
||||
__b1_from___b3:
|
||||
// [5] phi (byte) rpc#4 = (byte) rpc#1 [phi:main::@2/main::@3->main::@1#0] -- register_copy
|
||||
.label __1 = 3
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuz1=_inc_vbuz1
|
||||
inc.z rpc
|
||||
jmp __b2
|
||||
// main::@2
|
||||
__b2:
|
||||
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuz1=_deref_pbuc1
|
||||
// [5] (byte) key#1 ← *((const byte*) DC00) -- vbuz1=_deref_pbuc1
|
||||
lda DC00
|
||||
sta.z key
|
||||
// [8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuz1=vbuz2_band_vbuc1
|
||||
// [6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuz1=vbuz2_band_vbuc1
|
||||
lda #$1f
|
||||
and.z key
|
||||
sta.z __1
|
||||
// [9] if((byte) key#1!=(byte) 0) goto main::@1 -- vbuz1_neq_0_then_la1
|
||||
// [7] if((byte) key#1!=(byte) 0) goto main::@2 -- vbuz1_neq_0_then_la1
|
||||
lda.z key
|
||||
cmp #0
|
||||
bne __b1_from___b2
|
||||
bne __b2_from___b1
|
||||
jmp __b3
|
||||
// main::@3
|
||||
__b3:
|
||||
// [10] if((byte~) main::$1==(byte) $1f) goto main::@2 -- vbuz1_eq_vbuc1_then_la1
|
||||
// [8] if((byte~) main::$1==(byte) $1f) goto main::@1 -- vbuz1_eq_vbuc1_then_la1
|
||||
lda #$1f
|
||||
cmp.z __1
|
||||
beq __b2
|
||||
jmp __b1_from___b3
|
||||
beq __b1
|
||||
// [9] phi from main::@1 main::@3 to main::@2 [phi:main::@1/main::@3->main::@2]
|
||||
__b2_from___b1:
|
||||
__b2_from___b3:
|
||||
jmp __b2
|
||||
// main::@2
|
||||
__b2:
|
||||
jmp __b1
|
||||
}
|
||||
// File Data
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Potential registers zp[1]:2 [ rpc#4 rpc#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:3 [ key#1 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:4 [ main::$1 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:2 [ key#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:3 [ main::$1 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [] 255.6: zp[1]:2 [ rpc#4 rpc#1 ] 151.5: zp[1]:3 [ key#1 ]
|
||||
Uplift Scope [main] 101: zp[1]:4 [ main::$1 ]
|
||||
Uplift Scope [] 151.5: zp[1]:2 [ key#1 ]
|
||||
Uplift Scope [main] 101: zp[1]:3 [ main::$1 ]
|
||||
|
||||
Uplifting [] best 2842 combination reg byte y [ rpc#4 rpc#1 ] reg byte x [ key#1 ]
|
||||
Uplifting [main] best 2442 combination reg byte a [ main::$1 ]
|
||||
Uplifting [] best 2502 combination reg byte x [ key#1 ]
|
||||
Uplifting [main] best 2102 combination reg byte a [ main::$1 ]
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
@ -312,38 +261,30 @@ __bend_from___b1:
|
||||
__bend:
|
||||
// main
|
||||
main: {
|
||||
// [5] phi from main to main::@1 [phi:main->main::@1]
|
||||
__b1_from_main:
|
||||
// [5] phi (byte) rpc#4 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
|
||||
ldy #0
|
||||
jmp __b1
|
||||
// [5] phi from main::@2 main::@3 to main::@1 [phi:main::@2/main::@3->main::@1]
|
||||
__b1_from___b2:
|
||||
__b1_from___b3:
|
||||
// [5] phi (byte) rpc#4 = (byte) rpc#1 [phi:main::@2/main::@3->main::@1#0] -- register_copy
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuyy=_inc_vbuyy
|
||||
iny
|
||||
jmp __b2
|
||||
// main::@2
|
||||
__b2:
|
||||
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
|
||||
// [5] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
|
||||
ldx DC00
|
||||
// [8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
|
||||
// [6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
|
||||
txa
|
||||
and #$1f
|
||||
// [9] if((byte) key#1!=(byte) 0) goto main::@1 -- vbuxx_neq_0_then_la1
|
||||
// [7] if((byte) key#1!=(byte) 0) goto main::@2 -- vbuxx_neq_0_then_la1
|
||||
cpx #0
|
||||
bne __b1_from___b2
|
||||
bne __b2_from___b1
|
||||
jmp __b3
|
||||
// main::@3
|
||||
__b3:
|
||||
// [10] if((byte~) main::$1==(byte) $1f) goto main::@2 -- vbuaa_eq_vbuc1_then_la1
|
||||
// [8] if((byte~) main::$1==(byte) $1f) goto main::@1 -- vbuaa_eq_vbuc1_then_la1
|
||||
cmp #$1f
|
||||
beq __b2
|
||||
jmp __b1_from___b3
|
||||
beq __b1
|
||||
// [9] phi from main::@1 main::@3 to main::@2 [phi:main::@1/main::@3->main::@2]
|
||||
__b2_from___b1:
|
||||
__b2_from___b3:
|
||||
jmp __b2
|
||||
// main::@2
|
||||
__b2:
|
||||
jmp __b1
|
||||
}
|
||||
// File Data
|
||||
|
||||
@ -351,29 +292,28 @@ ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __bend
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __b2
|
||||
Removing instruction jmp __b3
|
||||
Removing instruction jmp __b2
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Replacing label __bbegin with __b1
|
||||
Replacing label __b1_from___b2 with __b1
|
||||
Replacing label __b1_from___b3 with __b1
|
||||
Replacing label __b2_from___b1 with __b2
|
||||
Removing instruction __bbegin:
|
||||
Removing instruction __b1_from___bbegin:
|
||||
Removing instruction main_from___b1:
|
||||
Removing instruction __bend_from___b1:
|
||||
Removing instruction __b1_from___b2:
|
||||
Removing instruction __b1_from___b3:
|
||||
Removing instruction __b2_from___b1:
|
||||
Removing instruction __b2_from___b3:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
Removing instruction __bend:
|
||||
Removing instruction __b1_from_main:
|
||||
Removing instruction __b3:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
Updating BasicUpstart to call main directly
|
||||
Removing instruction jsr main
|
||||
Succesful ASM optimization Pass5SkipBegin
|
||||
Removing instruction jmp __b1
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Skipping double jump to __b1 in bne __b2
|
||||
Succesful ASM optimization Pass5DoubleJumpElimination
|
||||
Removing instruction __b1:
|
||||
Removing instruction __b2:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
@ -388,17 +328,13 @@ FINAL SYMBOL TABLE
|
||||
(label) main::@1
|
||||
(label) main::@2
|
||||
(label) main::@3
|
||||
(byte) rpc
|
||||
(byte) rpc#1 reg byte y 42.6
|
||||
(byte) rpc#4 reg byte y 213.0
|
||||
|
||||
reg byte y [ rpc#4 rpc#1 ]
|
||||
reg byte x [ key#1 ]
|
||||
reg byte a [ main::$1 ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 2040
|
||||
Score: 1730
|
||||
|
||||
// File Comments
|
||||
// Duplicate Loop Problem from Richard-William Loerakker
|
||||
@ -418,33 +354,25 @@ Score: 2040
|
||||
// @end
|
||||
// main
|
||||
main: {
|
||||
// [5] phi from main to main::@1 [phi:main->main::@1]
|
||||
// [5] phi (byte) rpc#4 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
|
||||
ldy #0
|
||||
// [5] phi from main::@2 main::@3 to main::@1 [phi:main::@2/main::@3->main::@1]
|
||||
// [5] phi (byte) rpc#4 = (byte) rpc#1 [phi:main::@2/main::@3->main::@1#0] -- register_copy
|
||||
// main::@1
|
||||
__b1:
|
||||
// rpc++;
|
||||
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuyy=_inc_vbuyy
|
||||
iny
|
||||
// main::@2
|
||||
__b2:
|
||||
// key = *DC00
|
||||
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
|
||||
// [5] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
|
||||
ldx DC00
|
||||
// key & %00011111
|
||||
// [8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
|
||||
// [6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
|
||||
txa
|
||||
and #$1f
|
||||
// while(key == 0 && ((key & %00011111) == %00011111))
|
||||
// [9] if((byte) key#1!=(byte) 0) goto main::@1 -- vbuxx_neq_0_then_la1
|
||||
// [7] if((byte) key#1!=(byte) 0) goto main::@2 -- vbuxx_neq_0_then_la1
|
||||
cpx #0
|
||||
bne __b1
|
||||
// main::@3
|
||||
// [10] if((byte~) main::$1==(byte) $1f) goto main::@2 -- vbuaa_eq_vbuc1_then_la1
|
||||
// [8] if((byte~) main::$1==(byte) $1f) goto main::@1 -- vbuaa_eq_vbuc1_then_la1
|
||||
cmp #$1f
|
||||
beq __b2
|
||||
beq __b1
|
||||
// [9] phi from main::@1 main::@3 to main::@2 [phi:main::@1/main::@3->main::@2]
|
||||
// main::@2
|
||||
jmp __b1
|
||||
}
|
||||
// File Data
|
||||
|
@ -9,10 +9,6 @@
|
||||
(label) main::@1
|
||||
(label) main::@2
|
||||
(label) main::@3
|
||||
(byte) rpc
|
||||
(byte) rpc#1 reg byte y 42.6
|
||||
(byte) rpc#4 reg byte y 213.0
|
||||
|
||||
reg byte y [ rpc#4 rpc#1 ]
|
||||
reg byte x [ key#1 ]
|
||||
reg byte a [ main::$1 ]
|
||||
|
@ -3,14 +3,12 @@
|
||||
.pc = $80d "Program"
|
||||
.label SCREEN = $400
|
||||
main: {
|
||||
ldy #0
|
||||
ldx #'a'
|
||||
ldx #0
|
||||
__b1:
|
||||
lda #'a'
|
||||
sta SCREEN
|
||||
inx
|
||||
iny
|
||||
cpy #4
|
||||
cpx #4
|
||||
bne __b1
|
||||
rts
|
||||
}
|
||||
|
@ -14,12 +14,10 @@ main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
[5] (byte) main::a#2 ← phi( main/(byte) 'a' main::@1/(byte) main::a#1 )
|
||||
asm { lda#'a' staSCREEN }
|
||||
[7] (byte) main::a#1 ← ++ (byte) main::a#2
|
||||
[8] (byte) main::i#1 ← ++ (byte) main::i#2
|
||||
[9] if((byte) main::i#1!=(byte) 4) goto main::@1
|
||||
[7] (byte) main::i#1 ← ++ (byte) main::i#2
|
||||
[8] if((byte) main::i#1!=(byte) 4) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[10] return
|
||||
[9] return
|
||||
to:@return
|
||||
|
@ -7,14 +7,11 @@ CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from @1
|
||||
(byte) main::a#0 ← (byte) 'a'
|
||||
(byte) main::i#0 ← (byte) 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||
(byte) main::a#2 ← phi( main/(byte) main::a#0 main::@1/(byte) main::a#1 )
|
||||
asm { lda#'a' staSCREEN }
|
||||
(byte) main::a#1 ← ++ (byte) main::a#2
|
||||
(byte) main::i#1 ← (byte) main::i#2 + rangenext(0,3)
|
||||
(bool~) main::$0 ← (byte) main::i#1 != rangelast(0,3)
|
||||
if((bool~) main::$0) goto main::@1
|
||||
@ -39,10 +36,6 @@ SYMBOL TABLE SSA
|
||||
(bool~) main::$0
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
(byte) main::a
|
||||
(byte) main::a#0
|
||||
(byte) main::a#1
|
||||
(byte) main::a#2
|
||||
(byte) main::i
|
||||
(byte) main::i#0
|
||||
(byte) main::i#1
|
||||
@ -50,22 +43,19 @@ SYMBOL TABLE SSA
|
||||
|
||||
Simplifying constant pointer cast (byte*) 1024
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Simple Condition (bool~) main::$0 [7] if((byte) main::i#1!=rangelast(0,3)) goto main::@1
|
||||
Simple Condition (bool~) main::$0 [5] if((byte) main::i#1!=rangelast(0,3)) goto main::@1
|
||||
Successful SSA optimization Pass2ConditionalJumpSimplification
|
||||
Constant (const byte) main::a#0 = 'a'
|
||||
Constant (const byte) main::i#0 = 0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Resolved ranged next value [5] main::i#1 ← ++ main::i#2 to ++
|
||||
Resolved ranged comparison value [7] if(main::i#1!=rangelast(0,3)) goto main::@1 to (number) 4
|
||||
Resolved ranged next value [3] main::i#1 ← ++ main::i#2 to ++
|
||||
Resolved ranged comparison value [5] if(main::i#1!=rangelast(0,3)) goto main::@1 to (number) 4
|
||||
Adding number conversion cast (unumber) 4 in if((byte) main::i#1!=(number) 4) goto main::@1
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant integer cast 4
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (byte) 4
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Inlining constant with var siblings (const byte) main::a#0
|
||||
Inlining constant with var siblings (const byte) main::i#0
|
||||
Constant inlined main::a#0 = (byte) 'a'
|
||||
Constant inlined main::i#0 = (byte) 0
|
||||
Successful SSA optimization Pass2ConstantInlining
|
||||
Added new block during phi lifting main::@3(between main::@1 and main::@1)
|
||||
@ -77,10 +67,9 @@ Adding NOP phi() at start of main
|
||||
CALL GRAPH
|
||||
Calls in [] to main:2
|
||||
|
||||
Created 2 initial phi equivalence classes
|
||||
Coalesced [12] main::a#3 ← main::a#1
|
||||
Coalesced [13] main::i#3 ← main::i#1
|
||||
Coalesced down to 2 phi equivalence classes
|
||||
Created 1 initial phi equivalence classes
|
||||
Coalesced [11] main::i#3 ← main::i#1
|
||||
Coalesced down to 1 phi equivalence classes
|
||||
Culled Empty Block (label) @2
|
||||
Culled Empty Block (label) main::@3
|
||||
Adding NOP phi() at start of @begin
|
||||
@ -105,34 +94,26 @@ main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
|
||||
[5] (byte) main::a#2 ← phi( main/(byte) 'a' main::@1/(byte) main::a#1 )
|
||||
asm { lda#'a' staSCREEN }
|
||||
[7] (byte) main::a#1 ← ++ (byte) main::a#2
|
||||
[8] (byte) main::i#1 ← ++ (byte) main::i#2
|
||||
[9] if((byte) main::i#1!=(byte) 4) goto main::@1
|
||||
[7] (byte) main::i#1 ← ++ (byte) main::i#2
|
||||
[8] if((byte) main::i#1!=(byte) 4) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[10] return
|
||||
[9] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) main()
|
||||
(byte) main::a
|
||||
(byte) main::a#1 7.333333333333333
|
||||
(byte) main::a#2 11.0
|
||||
(byte) main::i
|
||||
(byte) main::i#1 16.5
|
||||
(byte) main::i#2 7.333333333333333
|
||||
(byte) main::i#2 11.0
|
||||
|
||||
Initial phi equivalence classes
|
||||
[ main::a#2 main::a#1 ]
|
||||
[ main::i#2 main::i#1 ]
|
||||
Complete equivalence classes
|
||||
[ main::a#2 main::a#1 ]
|
||||
[ main::i#2 main::i#1 ]
|
||||
Allocated zp[1]:2 [ main::a#2 main::a#1 ]
|
||||
Allocated zp[1]:3 [ main::i#2 main::i#1 ]
|
||||
Allocated zp[1]:2 [ main::i#2 main::i#1 ]
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
@ -161,57 +142,48 @@ __bend_from___b1:
|
||||
__bend:
|
||||
// main
|
||||
main: {
|
||||
.label a = 2
|
||||
.label i = 3
|
||||
.label i = 2
|
||||
// [5] phi from main to main::@1 [phi:main->main::@1]
|
||||
__b1_from_main:
|
||||
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z i
|
||||
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuz1=vbuc1
|
||||
lda #'a'
|
||||
sta.z a
|
||||
jmp __b1
|
||||
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||
__b1_from___b1:
|
||||
// [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||
// [5] phi (byte) main::a#2 = (byte) main::a#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// asm { lda#'a' staSCREEN }
|
||||
lda #'a'
|
||||
sta SCREEN
|
||||
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z a
|
||||
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
|
||||
// [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z i
|
||||
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
|
||||
// [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
|
||||
lda #4
|
||||
cmp.z i
|
||||
bne __b1_from___b1
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [10] return
|
||||
// [9] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement asm { lda#'a' staSCREEN } always clobbers reg byte a
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::a#2 main::a#1 ]
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::i#2 main::i#1 ]
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ]
|
||||
Statement asm { lda#'a' staSCREEN } always clobbers reg byte a
|
||||
Potential registers zp[1]:2 [ main::a#2 main::a#1 ] : zp[1]:2 , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:3 [ main::i#2 main::i#1 ] : zp[1]:3 , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte x , reg byte y ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main] 23.83: zp[1]:3 [ main::i#2 main::i#1 ] 18.33: zp[1]:2 [ main::a#2 main::a#1 ]
|
||||
Uplift Scope [main] 27.5: zp[1]:2 [ main::i#2 main::i#1 ]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [main] best 293 combination reg byte y [ main::i#2 main::i#1 ] reg byte x [ main::a#2 main::a#1 ]
|
||||
Uplifting [] best 293 combination
|
||||
Uplifting [main] best 253 combination reg byte x [ main::i#2 main::i#1 ]
|
||||
Uplifting [] best 253 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
@ -241,32 +213,27 @@ __bend:
|
||||
main: {
|
||||
// [5] phi from main to main::@1 [phi:main->main::@1]
|
||||
__b1_from_main:
|
||||
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
|
||||
ldy #0
|
||||
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuxx=vbuc1
|
||||
ldx #'a'
|
||||
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
|
||||
ldx #0
|
||||
jmp __b1
|
||||
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||
__b1_from___b1:
|
||||
// [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||
// [5] phi (byte) main::a#2 = (byte) main::a#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// asm { lda#'a' staSCREEN }
|
||||
lda #'a'
|
||||
sta SCREEN
|
||||
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuxx=_inc_vbuxx
|
||||
// [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
|
||||
inx
|
||||
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuyy=_inc_vbuyy
|
||||
iny
|
||||
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuyy_neq_vbuc1_then_la1
|
||||
cpy #4
|
||||
// [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
|
||||
cpx #4
|
||||
bne __b1_from___b1
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [10] return
|
||||
// [9] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
@ -305,19 +272,15 @@ FINAL SYMBOL TABLE
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
(byte) main::a
|
||||
(byte) main::a#1 reg byte x 7.333333333333333
|
||||
(byte) main::a#2 reg byte x 11.0
|
||||
(byte) main::i
|
||||
(byte) main::i#1 reg byte y 16.5
|
||||
(byte) main::i#2 reg byte y 7.333333333333333
|
||||
(byte) main::i#1 reg byte x 16.5
|
||||
(byte) main::i#2 reg byte x 11.0
|
||||
|
||||
reg byte x [ main::a#2 main::a#1 ]
|
||||
reg byte y [ main::i#2 main::i#1 ]
|
||||
reg byte x [ main::i#2 main::i#1 ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 191
|
||||
Score: 151
|
||||
|
||||
// File Comments
|
||||
// Upstart
|
||||
@ -336,31 +299,25 @@ Score: 191
|
||||
// main
|
||||
main: {
|
||||
// [5] phi from main to main::@1 [phi:main->main::@1]
|
||||
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
|
||||
ldy #0
|
||||
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuxx=vbuc1
|
||||
ldx #'a'
|
||||
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
|
||||
ldx #0
|
||||
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||
// [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||
// [5] phi (byte) main::a#2 = (byte) main::a#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||
// main::@1
|
||||
__b1:
|
||||
// asm
|
||||
// asm { lda#'a' staSCREEN }
|
||||
lda #'a'
|
||||
sta SCREEN
|
||||
// a++;
|
||||
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuxx=_inc_vbuxx
|
||||
inx
|
||||
// for( byte i:0..3)
|
||||
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuyy=_inc_vbuyy
|
||||
iny
|
||||
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuyy_neq_vbuc1_then_la1
|
||||
cpy #4
|
||||
// [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
|
||||
inx
|
||||
// [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
|
||||
cpx #4
|
||||
bne __b1
|
||||
// main::@return
|
||||
// }
|
||||
// [10] return
|
||||
// [9] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
@ -5,12 +5,8 @@
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
(byte) main::a
|
||||
(byte) main::a#1 reg byte x 7.333333333333333
|
||||
(byte) main::a#2 reg byte x 11.0
|
||||
(byte) main::i
|
||||
(byte) main::i#1 reg byte y 16.5
|
||||
(byte) main::i#2 reg byte y 7.333333333333333
|
||||
(byte) main::i#1 reg byte x 16.5
|
||||
(byte) main::i#2 reg byte x 11.0
|
||||
|
||||
reg byte x [ main::a#2 main::a#1 ]
|
||||
reg byte y [ main::i#2 main::i#1 ]
|
||||
reg byte x [ main::i#2 main::i#1 ]
|
||||
|
@ -2,14 +2,12 @@
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
.label ba = 2
|
||||
.label be = 6
|
||||
.label bb = 3
|
||||
.label bb_1 = 4
|
||||
.label bc = 5
|
||||
main: {
|
||||
lda #0
|
||||
sta.z ba
|
||||
sta.z be
|
||||
tay
|
||||
tax
|
||||
sta.z bb
|
||||
@ -254,46 +252,14 @@ fb: {
|
||||
}
|
||||
fc: {
|
||||
cmp #0
|
||||
bne __b1
|
||||
inc.z be
|
||||
__b1:
|
||||
cmp #1
|
||||
bne __b2
|
||||
inc.z be
|
||||
__b2:
|
||||
cmp #2
|
||||
bne __b3
|
||||
inc.z be
|
||||
__b3:
|
||||
cmp #3
|
||||
bne __b4
|
||||
inc.z be
|
||||
__b4:
|
||||
cmp #4
|
||||
bne __b5
|
||||
inc.z be
|
||||
__b5:
|
||||
cmp #5
|
||||
bne __b6
|
||||
inc.z be
|
||||
__b6:
|
||||
cmp #6
|
||||
bne __b7
|
||||
inc.z be
|
||||
__b7:
|
||||
cmp #7
|
||||
bne __b8
|
||||
inc.z be
|
||||
__b8:
|
||||
cmp #8
|
||||
bne __b9
|
||||
inc.z be
|
||||
__b9:
|
||||
cmp #9
|
||||
bne __b19
|
||||
lda #0
|
||||
sta.z be
|
||||
rts
|
||||
__b19:
|
||||
rts
|
||||
}
|
||||
|
@ -14,7 +14,6 @@ main: scope:[main] from @1
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@3
|
||||
[5] (byte) ba#17 ← phi( main/(byte) 0 main::@3/(byte) ba#1 )
|
||||
[5] (byte) be#2 ← phi( main/(byte) 0 main::@3/(byte) be#13 )
|
||||
[5] (byte) bd#2 ← phi( main/(byte) 0 main::@3/(byte) bd#13 )
|
||||
[5] (byte) bc#2 ← phi( main/(byte) 0 main::@3/(byte) bc#13 )
|
||||
[5] (byte) bb#16 ← phi( main/(byte) 0 main::@3/(byte) bb#13 )
|
||||
@ -37,7 +36,6 @@ f0::@10: scope:[f0] from f0
|
||||
[12] call fa
|
||||
to:f0::@1
|
||||
f0::@1: scope:[f0] from f0 f0::@10
|
||||
[13] (byte) be#142 ← phi( f0/(byte) be#2 f0::@10/(byte) be#24 )
|
||||
[13] (byte) bd#129 ← phi( f0/(byte) bd#2 f0::@10/(byte) bd#24 )
|
||||
[13] (byte) bc#63 ← phi( f0/(byte) bc#2 f0::@10/(byte) bc#24 )
|
||||
[13] (byte) bb#18 ← phi( f0/(byte) bb#16 f0::@10/(byte) bb#3 )
|
||||
@ -49,7 +47,6 @@ f0::@11: scope:[f0] from f0::@1
|
||||
[17] call fa
|
||||
to:f0::@2
|
||||
f0::@2: scope:[f0] from f0::@1 f0::@11
|
||||
[18] (byte) be#143 ← phi( f0::@1/(byte) be#142 f0::@11/(byte) be#24 )
|
||||
[18] (byte) bd#130 ← phi( f0::@1/(byte) bd#129 f0::@11/(byte) bd#24 )
|
||||
[18] (byte) bc#64 ← phi( f0::@1/(byte) bc#63 f0::@11/(byte) bc#24 )
|
||||
[18] (byte) bb#19 ← phi( f0::@1/(byte) bb#18 f0::@11/(byte) bb#4 )
|
||||
@ -61,7 +58,6 @@ f0::@12: scope:[f0] from f0::@2
|
||||
[22] call fa
|
||||
to:f0::@3
|
||||
f0::@3: scope:[f0] from f0::@12 f0::@2
|
||||
[23] (byte) be#144 ← phi( f0::@2/(byte) be#143 f0::@12/(byte) be#24 )
|
||||
[23] (byte) bd#131 ← phi( f0::@2/(byte) bd#130 f0::@12/(byte) bd#24 )
|
||||
[23] (byte) bc#65 ← phi( f0::@2/(byte) bc#64 f0::@12/(byte) bc#24 )
|
||||
[23] (byte) bb#20 ← phi( f0::@2/(byte) bb#19 f0::@12/(byte) bb#5 )
|
||||
@ -73,7 +69,6 @@ f0::@13: scope:[f0] from f0::@3
|
||||
[27] call fa
|
||||
to:f0::@4
|
||||
f0::@4: scope:[f0] from f0::@13 f0::@3
|
||||
[28] (byte) be#100 ← phi( f0::@13/(byte) be#24 f0::@3/(byte) be#144 )
|
||||
[28] (byte) bd#132 ← phi( f0::@13/(byte) bd#24 f0::@3/(byte) bd#131 )
|
||||
[28] (byte) bc#66 ← phi( f0::@13/(byte) bc#24 f0::@3/(byte) bc#65 )
|
||||
[28] (byte) bb#21 ← phi( f0::@13/(byte) bb#6 f0::@3/(byte) bb#20 )
|
||||
@ -85,7 +80,6 @@ f0::@14: scope:[f0] from f0::@4
|
||||
[32] call fa
|
||||
to:f0::@5
|
||||
f0::@5: scope:[f0] from f0::@14 f0::@4
|
||||
[33] (byte) be#101 ← phi( f0::@14/(byte) be#24 f0::@4/(byte) be#100 )
|
||||
[33] (byte) bd#133 ← phi( f0::@14/(byte) bd#24 f0::@4/(byte) bd#132 )
|
||||
[33] (byte) bc#100 ← phi( f0::@14/(byte) bc#24 f0::@4/(byte) bc#66 )
|
||||
[33] (byte) bb#22 ← phi( f0::@14/(byte) bb#66 f0::@4/(byte) bb#21 )
|
||||
@ -97,7 +91,6 @@ f0::@15: scope:[f0] from f0::@5
|
||||
[37] call fa
|
||||
to:f0::@6
|
||||
f0::@6: scope:[f0] from f0::@15 f0::@5
|
||||
[38] (byte) be#102 ← phi( f0::@15/(byte) be#24 f0::@5/(byte) be#101 )
|
||||
[38] (byte) bd#134 ← phi( f0::@15/(byte) bd#24 f0::@5/(byte) bd#133 )
|
||||
[38] (byte) bc#101 ← phi( f0::@15/(byte) bc#24 f0::@5/(byte) bc#100 )
|
||||
[38] (byte) bb#23 ← phi( f0::@15/(byte) bb#67 f0::@5/(byte) bb#22 )
|
||||
@ -109,7 +102,6 @@ f0::@16: scope:[f0] from f0::@6
|
||||
[42] call fa
|
||||
to:f0::@7
|
||||
f0::@7: scope:[f0] from f0::@16 f0::@6
|
||||
[43] (byte) be#103 ← phi( f0::@16/(byte) be#24 f0::@6/(byte) be#102 )
|
||||
[43] (byte) bd#135 ← phi( f0::@16/(byte) bd#24 f0::@6/(byte) bd#134 )
|
||||
[43] (byte) bc#102 ← phi( f0::@16/(byte) bc#24 f0::@6/(byte) bc#101 )
|
||||
[43] (byte) bb#24 ← phi( f0::@16/(byte) bb#68 f0::@6/(byte) bb#23 )
|
||||
@ -121,7 +113,6 @@ f0::@17: scope:[f0] from f0::@7
|
||||
[47] call fa
|
||||
to:f0::@8
|
||||
f0::@8: scope:[f0] from f0::@17 f0::@7
|
||||
[48] (byte) be#104 ← phi( f0::@17/(byte) be#24 f0::@7/(byte) be#103 )
|
||||
[48] (byte) bd#136 ← phi( f0::@17/(byte) bd#24 f0::@7/(byte) bd#135 )
|
||||
[48] (byte) bc#103 ← phi( f0::@17/(byte) bc#24 f0::@7/(byte) bc#102 )
|
||||
[48] (byte) bb#25 ← phi( f0::@17/(byte) bb#10 f0::@7/(byte) bb#24 )
|
||||
@ -133,7 +124,6 @@ f0::@18: scope:[f0] from f0::@8
|
||||
[52] call fa
|
||||
to:f0::@9
|
||||
f0::@9: scope:[f0] from f0::@18 f0::@8
|
||||
[53] (byte) be#105 ← phi( f0::@18/(byte) be#24 f0::@8/(byte) be#104 )
|
||||
[53] (byte) bd#93 ← phi( f0::@18/(byte) bd#24 f0::@8/(byte) bd#136 )
|
||||
[53] (byte) bc#71 ← phi( f0::@18/(byte) bc#24 f0::@8/(byte) bc#103 )
|
||||
[53] (byte) bb#50 ← phi( f0::@18/(byte) bb#11 f0::@8/(byte) bb#25 )
|
||||
@ -144,7 +134,6 @@ f0::@19: scope:[f0] from f0::@9
|
||||
[56] call fa
|
||||
to:f0::@return
|
||||
f0::@return: scope:[f0] from f0::@19 f0::@9
|
||||
[57] (byte) be#13 ← phi( f0::@19/(byte) be#24 f0::@9/(byte) be#105 )
|
||||
[57] (byte) bd#13 ← phi( f0::@19/(byte) bd#24 f0::@9/(byte) bd#93 )
|
||||
[57] (byte) bc#13 ← phi( f0::@19/(byte) bc#24 f0::@9/(byte) bc#71 )
|
||||
[57] (byte) bb#13 ← phi( f0::@19/(byte) 0 f0::@9/(byte) bb#50 )
|
||||
@ -153,7 +142,6 @@ f0::@return: scope:[f0] from f0::@19 f0::@9
|
||||
|
||||
(void()) fa()
|
||||
fa: scope:[fa] from f0::@10 f0::@11 f0::@12 f0::@13 f0::@14 f0::@15 f0::@16 f0::@17 f0::@18 f0::@19
|
||||
[59] (byte) be#107 ← phi( f0::@10/(byte) be#2 f0::@11/(byte) be#142 f0::@12/(byte) be#143 f0::@13/(byte) be#144 f0::@14/(byte) be#100 f0::@15/(byte) be#101 f0::@16/(byte) be#102 f0::@17/(byte) be#103 f0::@18/(byte) be#104 f0::@19/(byte) be#105 )
|
||||
[59] (byte) bd#137 ← phi( f0::@10/(byte) bd#2 f0::@11/(byte) bd#129 f0::@12/(byte) bd#130 f0::@13/(byte) bd#131 f0::@14/(byte) bd#132 f0::@15/(byte) bd#133 f0::@16/(byte) bd#134 f0::@17/(byte) bd#135 f0::@18/(byte) bd#136 f0::@19/(byte) bd#93 )
|
||||
[59] (byte) bc#39 ← phi( f0::@10/(byte) bc#2 f0::@11/(byte) bc#63 f0::@12/(byte) bc#64 f0::@13/(byte) bc#65 f0::@14/(byte) bc#66 f0::@15/(byte) bc#100 f0::@16/(byte) bc#101 f0::@17/(byte) bc#102 f0::@18/(byte) bc#103 f0::@19/(byte) bc#71 )
|
||||
[59] (byte) bb#27 ← phi( f0::@10/(byte) bb#100 f0::@11/(byte) bb#101 f0::@12/(byte) bb#102 f0::@13/(byte) bb#103 f0::@14/(byte) bb#104 f0::@15/(byte) bb#105 f0::@16/(byte) bb#106 f0::@17/(byte) bb#107 f0::@18/(byte) bb#108 f0::@19/(byte) 0 )
|
||||
@ -165,7 +153,6 @@ fa::@10: scope:[fa] from fa
|
||||
[63] call fb
|
||||
to:fa::@1
|
||||
fa::@1: scope:[fa] from fa fa::@10
|
||||
[64] (byte) be#108 ← phi( fa/(byte) be#107 fa::@10/(byte) be#35 )
|
||||
[64] (byte) bd#138 ← phi( fa/(byte) bd#137 fa::@10/(byte) bd#35 )
|
||||
[64] (byte) bc#40 ← phi( fa/(byte) bc#39 fa::@10/(byte) bc#104 )
|
||||
[65] if((byte) bb#27!=(byte) 1) goto fa::@2
|
||||
@ -176,7 +163,6 @@ fa::@11: scope:[fa] from fa::@1
|
||||
[68] call fb
|
||||
to:fa::@2
|
||||
fa::@2: scope:[fa] from fa::@1 fa::@11
|
||||
[69] (byte) be#109 ← phi( fa::@1/(byte) be#108 fa::@11/(byte) be#35 )
|
||||
[69] (byte) bd#139 ← phi( fa::@1/(byte) bd#138 fa::@11/(byte) bd#35 )
|
||||
[69] (byte) bc#41 ← phi( fa::@1/(byte) bc#40 fa::@11/(byte) bc#105 )
|
||||
[70] if((byte) bb#27!=(byte) 2) goto fa::@3
|
||||
@ -187,7 +173,6 @@ fa::@12: scope:[fa] from fa::@2
|
||||
[73] call fb
|
||||
to:fa::@3
|
||||
fa::@3: scope:[fa] from fa::@12 fa::@2
|
||||
[74] (byte) be#110 ← phi( fa::@2/(byte) be#109 fa::@12/(byte) be#35 )
|
||||
[74] (byte) bd#140 ← phi( fa::@2/(byte) bd#139 fa::@12/(byte) bd#35 )
|
||||
[74] (byte) bc#42 ← phi( fa::@2/(byte) bc#41 fa::@12/(byte) bc#106 )
|
||||
[75] if((byte) bb#27!=(byte) 3) goto fa::@4
|
||||
@ -198,7 +183,6 @@ fa::@13: scope:[fa] from fa::@3
|
||||
[78] call fb
|
||||
to:fa::@4
|
||||
fa::@4: scope:[fa] from fa::@13 fa::@3
|
||||
[79] (byte) be#111 ← phi( fa::@13/(byte) be#35 fa::@3/(byte) be#110 )
|
||||
[79] (byte) bd#141 ← phi( fa::@13/(byte) bd#35 fa::@3/(byte) bd#140 )
|
||||
[79] (byte) bc#43 ← phi( fa::@13/(byte) bc#107 fa::@3/(byte) bc#42 )
|
||||
[80] if((byte) bb#27!=(byte) 4) goto fa::@5
|
||||
@ -209,7 +193,6 @@ fa::@14: scope:[fa] from fa::@4
|
||||
[83] call fb
|
||||
to:fa::@5
|
||||
fa::@5: scope:[fa] from fa::@14 fa::@4
|
||||
[84] (byte) be#112 ← phi( fa::@14/(byte) be#35 fa::@4/(byte) be#111 )
|
||||
[84] (byte) bd#100 ← phi( fa::@14/(byte) bd#35 fa::@4/(byte) bd#141 )
|
||||
[84] (byte) bc#44 ← phi( fa::@14/(byte) bc#108 fa::@4/(byte) bc#43 )
|
||||
[85] if((byte) bb#27!=(byte) 5) goto fa::@6
|
||||
@ -220,7 +203,6 @@ fa::@15: scope:[fa] from fa::@5
|
||||
[88] call fb
|
||||
to:fa::@6
|
||||
fa::@6: scope:[fa] from fa::@15 fa::@5
|
||||
[89] (byte) be#113 ← phi( fa::@15/(byte) be#35 fa::@5/(byte) be#112 )
|
||||
[89] (byte) bd#101 ← phi( fa::@15/(byte) bd#35 fa::@5/(byte) bd#100 )
|
||||
[89] (byte) bc#45 ← phi( fa::@15/(byte) bc#109 fa::@5/(byte) bc#44 )
|
||||
[90] if((byte) bb#27!=(byte) 6) goto fa::@7
|
||||
@ -231,7 +213,6 @@ fa::@16: scope:[fa] from fa::@6
|
||||
[93] call fb
|
||||
to:fa::@7
|
||||
fa::@7: scope:[fa] from fa::@16 fa::@6
|
||||
[94] (byte) be#114 ← phi( fa::@16/(byte) be#35 fa::@6/(byte) be#113 )
|
||||
[94] (byte) bd#102 ← phi( fa::@16/(byte) bd#35 fa::@6/(byte) bd#101 )
|
||||
[94] (byte) bc#46 ← phi( fa::@16/(byte) bc#110 fa::@6/(byte) bc#45 )
|
||||
[95] if((byte) bb#27!=(byte) 7) goto fa::@8
|
||||
@ -242,7 +223,6 @@ fa::@17: scope:[fa] from fa::@7
|
||||
[98] call fb
|
||||
to:fa::@8
|
||||
fa::@8: scope:[fa] from fa::@17 fa::@7
|
||||
[99] (byte) be#115 ← phi( fa::@17/(byte) be#35 fa::@7/(byte) be#114 )
|
||||
[99] (byte) bd#103 ← phi( fa::@17/(byte) bd#35 fa::@7/(byte) bd#102 )
|
||||
[99] (byte) bc#47 ← phi( fa::@17/(byte) bc#111 fa::@7/(byte) bc#46 )
|
||||
[100] if((byte) bb#27!=(byte) 8) goto fa::@9
|
||||
@ -253,7 +233,6 @@ fa::@18: scope:[fa] from fa::@8
|
||||
[103] call fb
|
||||
to:fa::@9
|
||||
fa::@9: scope:[fa] from fa::@18 fa::@8
|
||||
[104] (byte) be#116 ← phi( fa::@18/(byte) be#35 fa::@8/(byte) be#115 )
|
||||
[104] (byte) bd#104 ← phi( fa::@18/(byte) bd#35 fa::@8/(byte) bd#103 )
|
||||
[104] (byte) bc#83 ← phi( fa::@18/(byte) bc#112 fa::@8/(byte) bc#47 )
|
||||
[105] if((byte) bb#27!=(byte) 9) goto fa::@return
|
||||
@ -263,7 +242,6 @@ fa::@19: scope:[fa] from fa::@9
|
||||
[107] call fb
|
||||
to:fa::@return
|
||||
fa::@return: scope:[fa] from fa::@19 fa::@9
|
||||
[108] (byte) be#24 ← phi( fa::@19/(byte) be#35 fa::@9/(byte) be#116 )
|
||||
[108] (byte) bd#24 ← phi( fa::@19/(byte) bd#35 fa::@9/(byte) bd#104 )
|
||||
[108] (byte) bc#24 ← phi( fa::@19/(byte) 0 fa::@9/(byte) bc#83 )
|
||||
[109] return
|
||||
@ -271,7 +249,6 @@ fa::@return: scope:[fa] from fa::@19 fa::@9
|
||||
|
||||
(void()) fb()
|
||||
fb: scope:[fb] from fa::@10 fa::@11 fa::@12 fa::@13 fa::@14 fa::@15 fa::@16 fa::@17 fa::@18 fa::@19
|
||||
[110] (byte) be#118 ← phi( fa::@10/(byte) be#107 fa::@11/(byte) be#108 fa::@12/(byte) be#109 fa::@13/(byte) be#110 fa::@14/(byte) be#111 fa::@15/(byte) be#112 fa::@16/(byte) be#113 fa::@17/(byte) be#114 fa::@18/(byte) be#115 fa::@19/(byte) be#116 )
|
||||
[110] (byte) bd#106 ← phi( fa::@10/(byte) bd#137 fa::@11/(byte) bd#138 fa::@12/(byte) bd#139 fa::@13/(byte) bd#140 fa::@14/(byte) bd#141 fa::@15/(byte) bd#100 fa::@16/(byte) bd#101 fa::@17/(byte) bd#102 fa::@18/(byte) bd#103 fa::@19/(byte) bd#104 )
|
||||
[110] (byte) bc#113 ← phi( fa::@10/(byte) bc#172 fa::@11/(byte) bc#173 fa::@12/(byte) bc#174 fa::@13/(byte) bc#175 fa::@14/(byte) bc#176 fa::@15/(byte) bc#177 fa::@16/(byte) bc#178 fa::@17/(byte) bc#179 fa::@18/(byte) bc#180 fa::@19/(byte) 0 )
|
||||
[111] if((byte) bc#113!=(byte) 0) goto fb::@1
|
||||
@ -282,7 +259,6 @@ fb::@10: scope:[fb] from fb
|
||||
[114] call fc
|
||||
to:fb::@1
|
||||
fb::@1: scope:[fb] from fb fb::@10
|
||||
[115] (byte) be#119 ← phi( fb/(byte) be#118 fb::@10/(byte) be#46 )
|
||||
[115] (byte) bd#107 ← phi( fb/(byte) bd#106 fb::@10/(byte) bd#146 )
|
||||
[116] if((byte) bc#113!=(byte) 1) goto fb::@2
|
||||
to:fb::@11
|
||||
@ -292,7 +268,6 @@ fb::@11: scope:[fb] from fb::@1
|
||||
[119] call fc
|
||||
to:fb::@2
|
||||
fb::@2: scope:[fb] from fb::@1 fb::@11
|
||||
[120] (byte) be#120 ← phi( fb::@1/(byte) be#119 fb::@11/(byte) be#46 )
|
||||
[120] (byte) bd#108 ← phi( fb::@1/(byte) bd#107 fb::@11/(byte) bd#147 )
|
||||
[121] if((byte) bc#113!=(byte) 2) goto fb::@3
|
||||
to:fb::@12
|
||||
@ -302,7 +277,6 @@ fb::@12: scope:[fb] from fb::@2
|
||||
[124] call fc
|
||||
to:fb::@3
|
||||
fb::@3: scope:[fb] from fb::@12 fb::@2
|
||||
[125] (byte) be#121 ← phi( fb::@2/(byte) be#120 fb::@12/(byte) be#46 )
|
||||
[125] (byte) bd#109 ← phi( fb::@2/(byte) bd#108 fb::@12/(byte) bd#148 )
|
||||
[126] if((byte) bc#113!=(byte) 3) goto fb::@4
|
||||
to:fb::@13
|
||||
@ -312,7 +286,6 @@ fb::@13: scope:[fb] from fb::@3
|
||||
[129] call fc
|
||||
to:fb::@4
|
||||
fb::@4: scope:[fb] from fb::@13 fb::@3
|
||||
[130] (byte) be#122 ← phi( fb::@13/(byte) be#46 fb::@3/(byte) be#121 )
|
||||
[130] (byte) bd#110 ← phi( fb::@13/(byte) bd#149 fb::@3/(byte) bd#109 )
|
||||
[131] if((byte) bc#113!=(byte) 4) goto fb::@5
|
||||
to:fb::@14
|
||||
@ -322,7 +295,6 @@ fb::@14: scope:[fb] from fb::@4
|
||||
[134] call fc
|
||||
to:fb::@5
|
||||
fb::@5: scope:[fb] from fb::@14 fb::@4
|
||||
[135] (byte) be#123 ← phi( fb::@14/(byte) be#46 fb::@4/(byte) be#122 )
|
||||
[135] (byte) bd#111 ← phi( fb::@14/(byte) bd#150 fb::@4/(byte) bd#110 )
|
||||
[136] if((byte) bc#113!=(byte) 5) goto fb::@6
|
||||
to:fb::@15
|
||||
@ -332,7 +304,6 @@ fb::@15: scope:[fb] from fb::@5
|
||||
[139] call fc
|
||||
to:fb::@6
|
||||
fb::@6: scope:[fb] from fb::@15 fb::@5
|
||||
[140] (byte) be#124 ← phi( fb::@15/(byte) be#46 fb::@5/(byte) be#123 )
|
||||
[140] (byte) bd#112 ← phi( fb::@15/(byte) bd#151 fb::@5/(byte) bd#111 )
|
||||
[141] if((byte) bc#113!=(byte) 6) goto fb::@7
|
||||
to:fb::@16
|
||||
@ -342,7 +313,6 @@ fb::@16: scope:[fb] from fb::@6
|
||||
[144] call fc
|
||||
to:fb::@7
|
||||
fb::@7: scope:[fb] from fb::@16 fb::@6
|
||||
[145] (byte) be#125 ← phi( fb::@16/(byte) be#46 fb::@6/(byte) be#124 )
|
||||
[145] (byte) bd#113 ← phi( fb::@16/(byte) bd#152 fb::@6/(byte) bd#112 )
|
||||
[146] if((byte) bc#113!=(byte) 7) goto fb::@8
|
||||
to:fb::@17
|
||||
@ -352,7 +322,6 @@ fb::@17: scope:[fb] from fb::@7
|
||||
[149] call fc
|
||||
to:fb::@8
|
||||
fb::@8: scope:[fb] from fb::@17 fb::@7
|
||||
[150] (byte) be#126 ← phi( fb::@17/(byte) be#46 fb::@7/(byte) be#125 )
|
||||
[150] (byte) bd#114 ← phi( fb::@17/(byte) bd#153 fb::@7/(byte) bd#113 )
|
||||
[151] if((byte) bc#113!=(byte) 8) goto fb::@9
|
||||
to:fb::@18
|
||||
@ -362,7 +331,6 @@ fb::@18: scope:[fb] from fb::@8
|
||||
[154] call fc
|
||||
to:fb::@9
|
||||
fb::@9: scope:[fb] from fb::@18 fb::@8
|
||||
[155] (byte) be#127 ← phi( fb::@18/(byte) be#46 fb::@8/(byte) be#126 )
|
||||
[155] (byte) bd#116 ← phi( fb::@18/(byte) bd#154 fb::@8/(byte) bd#114 )
|
||||
[156] if((byte) bc#113!=(byte) 9) goto fb::@return
|
||||
to:fb::@19
|
||||
@ -371,84 +339,72 @@ fb::@19: scope:[fb] from fb::@9
|
||||
[158] call fc
|
||||
to:fb::@return
|
||||
fb::@return: scope:[fb] from fb::@19 fb::@9
|
||||
[159] (byte) be#35 ← phi( fb::@19/(byte) be#46 fb::@9/(byte) be#127 )
|
||||
[159] (byte) bd#35 ← phi( fb::@19/(byte) 0 fb::@9/(byte) bd#116 )
|
||||
[160] return
|
||||
to:@return
|
||||
|
||||
(void()) fc()
|
||||
fc: scope:[fc] from fb::@10 fb::@11 fb::@12 fb::@13 fb::@14 fb::@15 fb::@16 fb::@17 fb::@18 fb::@19
|
||||
[161] (byte) be#129 ← phi( fb::@10/(byte) be#118 fb::@11/(byte) be#119 fb::@12/(byte) be#120 fb::@13/(byte) be#121 fb::@14/(byte) be#122 fb::@15/(byte) be#123 fb::@16/(byte) be#124 fb::@17/(byte) be#125 fb::@18/(byte) be#126 fb::@19/(byte) be#127 )
|
||||
[161] (byte) bd#117 ← phi( fb::@10/(byte) bd#235 fb::@11/(byte) bd#236 fb::@12/(byte) bd#237 fb::@13/(byte) bd#238 fb::@14/(byte) bd#239 fb::@15/(byte) bd#240 fb::@16/(byte) bd#241 fb::@17/(byte) bd#242 fb::@18/(byte) bd#243 fb::@19/(byte) 0 )
|
||||
[162] if((byte) bd#117!=(byte) 0) goto fc::@1
|
||||
to:fc::@10
|
||||
fc::@10: scope:[fc] from fc
|
||||
[163] (byte) be#36 ← ++ (byte) be#129
|
||||
[163] phi()
|
||||
to:fc::@1
|
||||
fc::@1: scope:[fc] from fc fc::@10
|
||||
[164] (byte) be#130 ← phi( fc/(byte) be#129 fc::@10/(byte) be#36 )
|
||||
[165] if((byte) bd#117!=(byte) 1) goto fc::@2
|
||||
[164] if((byte) bd#117!=(byte) 1) goto fc::@2
|
||||
to:fc::@11
|
||||
fc::@11: scope:[fc] from fc::@1
|
||||
[166] (byte) be#37 ← ++ (byte) be#130
|
||||
[165] phi()
|
||||
to:fc::@2
|
||||
fc::@2: scope:[fc] from fc::@1 fc::@11
|
||||
[167] (byte) be#131 ← phi( fc::@1/(byte) be#130 fc::@11/(byte) be#37 )
|
||||
[168] if((byte) bd#117!=(byte) 2) goto fc::@3
|
||||
[166] if((byte) bd#117!=(byte) 2) goto fc::@3
|
||||
to:fc::@12
|
||||
fc::@12: scope:[fc] from fc::@2
|
||||
[169] (byte) be#38 ← ++ (byte) be#131
|
||||
[167] phi()
|
||||
to:fc::@3
|
||||
fc::@3: scope:[fc] from fc::@12 fc::@2
|
||||
[170] (byte) be#132 ← phi( fc::@12/(byte) be#38 fc::@2/(byte) be#131 )
|
||||
[171] if((byte) bd#117!=(byte) 3) goto fc::@4
|
||||
[168] if((byte) bd#117!=(byte) 3) goto fc::@4
|
||||
to:fc::@13
|
||||
fc::@13: scope:[fc] from fc::@3
|
||||
[172] (byte) be#39 ← ++ (byte) be#132
|
||||
[169] phi()
|
||||
to:fc::@4
|
||||
fc::@4: scope:[fc] from fc::@13 fc::@3
|
||||
[173] (byte) be#133 ← phi( fc::@13/(byte) be#39 fc::@3/(byte) be#132 )
|
||||
[174] if((byte) bd#117!=(byte) 4) goto fc::@5
|
||||
[170] if((byte) bd#117!=(byte) 4) goto fc::@5
|
||||
to:fc::@14
|
||||
fc::@14: scope:[fc] from fc::@4
|
||||
[175] (byte) be#40 ← ++ (byte) be#133
|
||||
[171] phi()
|
||||
to:fc::@5
|
||||
fc::@5: scope:[fc] from fc::@14 fc::@4
|
||||
[176] (byte) be#134 ← phi( fc::@14/(byte) be#40 fc::@4/(byte) be#133 )
|
||||
[177] if((byte) bd#117!=(byte) 5) goto fc::@6
|
||||
[172] if((byte) bd#117!=(byte) 5) goto fc::@6
|
||||
to:fc::@15
|
||||
fc::@15: scope:[fc] from fc::@5
|
||||
[178] (byte) be#41 ← ++ (byte) be#134
|
||||
[173] phi()
|
||||
to:fc::@6
|
||||
fc::@6: scope:[fc] from fc::@15 fc::@5
|
||||
[179] (byte) be#135 ← phi( fc::@15/(byte) be#41 fc::@5/(byte) be#134 )
|
||||
[180] if((byte) bd#117!=(byte) 6) goto fc::@7
|
||||
[174] if((byte) bd#117!=(byte) 6) goto fc::@7
|
||||
to:fc::@16
|
||||
fc::@16: scope:[fc] from fc::@6
|
||||
[181] (byte) be#42 ← ++ (byte) be#135
|
||||
[175] phi()
|
||||
to:fc::@7
|
||||
fc::@7: scope:[fc] from fc::@16 fc::@6
|
||||
[182] (byte) be#136 ← phi( fc::@16/(byte) be#42 fc::@6/(byte) be#135 )
|
||||
[183] if((byte) bd#117!=(byte) 7) goto fc::@8
|
||||
[176] if((byte) bd#117!=(byte) 7) goto fc::@8
|
||||
to:fc::@17
|
||||
fc::@17: scope:[fc] from fc::@7
|
||||
[184] (byte) be#43 ← ++ (byte) be#136
|
||||
[177] phi()
|
||||
to:fc::@8
|
||||
fc::@8: scope:[fc] from fc::@17 fc::@7
|
||||
[185] (byte) be#137 ← phi( fc::@17/(byte) be#43 fc::@7/(byte) be#136 )
|
||||
[186] if((byte) bd#117!=(byte) 8) goto fc::@9
|
||||
[178] if((byte) bd#117!=(byte) 8) goto fc::@9
|
||||
to:fc::@18
|
||||
fc::@18: scope:[fc] from fc::@8
|
||||
[187] (byte) be#44 ← ++ (byte) be#137
|
||||
[179] phi()
|
||||
to:fc::@9
|
||||
fc::@9: scope:[fc] from fc::@18 fc::@8
|
||||
[188] (byte) be#138 ← phi( fc::@18/(byte) be#44 fc::@8/(byte) be#137 )
|
||||
[189] if((byte) bd#117!=(byte) 9) goto fc::@19
|
||||
to:fc::@return
|
||||
[180] if((byte) bd#117!=(byte) 9) goto fc::@return
|
||||
to:fc::@19
|
||||
fc::@19: scope:[fc] from fc::@9
|
||||
[190] phi()
|
||||
[181] phi()
|
||||
to:fc::@return
|
||||
fc::@return: scope:[fc] from fc::@19 fc::@9
|
||||
[191] (byte) be#46 ← phi( fc::@9/(byte) 0 fc::@19/(byte) be#138 )
|
||||
[192] return
|
||||
[182] return
|
||||
to:@return
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -93,7 +93,7 @@
|
||||
(byte) bd#113 reg byte y 4.0
|
||||
(byte) bd#114 reg byte y 4.0
|
||||
(byte) bd#116 reg byte y 3.0
|
||||
(byte) bd#117 reg byte a 1.3571428571428568
|
||||
(byte) bd#117 reg byte a 1.9999999999999991
|
||||
(byte) bd#129 reg byte y 2.0
|
||||
(byte) bd#13 reg byte y 3.75
|
||||
(byte) bd#130 reg byte y 2.0
|
||||
@ -130,60 +130,6 @@
|
||||
(byte) bd#243 reg byte a 4.0
|
||||
(byte) bd#35 reg byte y 1.8333333333333335
|
||||
(byte) bd#93 reg byte y 2.6666666666666665
|
||||
(byte) be
|
||||
(byte) be#100 be zp[1]:6 2.0
|
||||
(byte) be#101 be zp[1]:6 2.0
|
||||
(byte) be#102 be zp[1]:6 2.0
|
||||
(byte) be#103 be zp[1]:6 2.0
|
||||
(byte) be#104 be zp[1]:6 2.0
|
||||
(byte) be#105 be zp[1]:6 2.6666666666666665
|
||||
(byte) be#107 be zp[1]:6 6.0
|
||||
(byte) be#108 be zp[1]:6 2.0
|
||||
(byte) be#109 be zp[1]:6 2.0
|
||||
(byte) be#110 be zp[1]:6 2.0
|
||||
(byte) be#111 be zp[1]:6 2.0
|
||||
(byte) be#112 be zp[1]:6 2.0
|
||||
(byte) be#113 be zp[1]:6 2.0
|
||||
(byte) be#114 be zp[1]:6 2.0
|
||||
(byte) be#115 be zp[1]:6 2.0
|
||||
(byte) be#116 be zp[1]:6 2.6666666666666665
|
||||
(byte) be#118 be zp[1]:6 6.0
|
||||
(byte) be#119 be zp[1]:6 2.0
|
||||
(byte) be#120 be zp[1]:6 2.0
|
||||
(byte) be#121 be zp[1]:6 2.0
|
||||
(byte) be#122 be zp[1]:6 2.0
|
||||
(byte) be#123 be zp[1]:6 2.0
|
||||
(byte) be#124 be zp[1]:6 2.0
|
||||
(byte) be#125 be zp[1]:6 2.0
|
||||
(byte) be#126 be zp[1]:6 2.0
|
||||
(byte) be#127 be zp[1]:6 2.6666666666666665
|
||||
(byte) be#129 be zp[1]:6 12.0
|
||||
(byte) be#13 be zp[1]:6 3.75
|
||||
(byte) be#130 be zp[1]:6 4.0
|
||||
(byte) be#131 be zp[1]:6 4.0
|
||||
(byte) be#132 be zp[1]:6 4.0
|
||||
(byte) be#133 be zp[1]:6 4.0
|
||||
(byte) be#134 be zp[1]:6 4.0
|
||||
(byte) be#135 be zp[1]:6 4.0
|
||||
(byte) be#136 be zp[1]:6 4.0
|
||||
(byte) be#137 be zp[1]:6 4.0
|
||||
(byte) be#138 be zp[1]:6 2.0
|
||||
(byte) be#142 be zp[1]:6 2.0
|
||||
(byte) be#143 be zp[1]:6 2.0
|
||||
(byte) be#144 be zp[1]:6 2.0
|
||||
(byte) be#2 be zp[1]:6 3.0
|
||||
(byte) be#24 be zp[1]:6 2.0
|
||||
(byte) be#35 be zp[1]:6 2.0
|
||||
(byte) be#36 be zp[1]:6 4.0
|
||||
(byte) be#37 be zp[1]:6 4.0
|
||||
(byte) be#38 be zp[1]:6 4.0
|
||||
(byte) be#39 be zp[1]:6 4.0
|
||||
(byte) be#40 be zp[1]:6 4.0
|
||||
(byte) be#41 be zp[1]:6 4.0
|
||||
(byte) be#42 be zp[1]:6 4.0
|
||||
(byte) be#43 be zp[1]:6 4.0
|
||||
(byte) be#44 be zp[1]:6 4.0
|
||||
(byte) be#46 be zp[1]:6 1.8333333333333335
|
||||
(void()) f0()
|
||||
(label) f0::@1
|
||||
(label) f0::@10
|
||||
@ -280,4 +226,3 @@ reg byte x [ bc#83 bc#112 bc#47 bc#111 bc#46 bc#110 bc#45 bc#109 bc#44 bc#108 bc
|
||||
zp[1]:5 [ bc#113 bc#172 bc#173 bc#174 bc#175 bc#176 bc#177 bc#178 bc#179 bc#180 ]
|
||||
reg byte y [ bd#116 bd#154 bd#114 bd#153 bd#113 bd#152 bd#112 bd#151 bd#111 bd#150 bd#110 bd#149 bd#109 bd#108 bd#107 bd#106 bd#104 bd#103 bd#102 bd#101 bd#100 bd#141 bd#140 bd#139 bd#138 bd#137 bd#93 bd#136 bd#135 bd#134 bd#133 bd#132 bd#131 bd#130 bd#129 bd#2 bd#13 bd#24 bd#35 bd#146 bd#147 bd#148 ]
|
||||
reg byte a [ bd#117 bd#235 bd#236 bd#237 bd#238 bd#239 bd#240 bd#241 bd#242 bd#243 ]
|
||||
zp[1]:6 [ be#138 be#44 be#137 be#43 be#136 be#42 be#135 be#41 be#134 be#40 be#133 be#39 be#132 be#38 be#131 be#130 be#129 be#127 be#126 be#125 be#124 be#123 be#122 be#121 be#120 be#119 be#118 be#116 be#115 be#114 be#113 be#112 be#111 be#110 be#109 be#108 be#107 be#105 be#104 be#103 be#102 be#101 be#100 be#144 be#143 be#142 be#2 be#13 be#24 be#35 be#46 be#36 be#37 ]
|
||||
|
Loading…
Reference in New Issue
Block a user