1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-08-15 13:27:36 +00:00

Now identifying USE's that are also DEFINE's as unused.

This commit is contained in:
jespergravgaard
2020-02-14 10:57:29 +01:00
parent 0beeab9be2
commit d0bc5af94b
16 changed files with 1098 additions and 2423 deletions

View File

@@ -256,8 +256,31 @@ public class VariableReferenceInfos {
*/ */
public boolean isUnused(SymbolVariableRef variableRef) { public boolean isUnused(SymbolVariableRef variableRef) {
Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(variableRef); Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(variableRef);
if(refs == null) return true; if(refs == null)
return refs.stream().noneMatch(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.USE.equals(referenceToSymbolVar.getReferenceType())); 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 * Get the index of the statement defining a variable
*
* @param variableRef The variable to look for * @param variableRef The variable to look for
* @return Index of the defining statement * @return Index of the defining statement
*/ */
@@ -291,14 +315,13 @@ public class VariableReferenceInfos {
.filter(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.DEFINE.equals(referenceToSymbolVar.getReferenceType())) .filter(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.DEFINE.equals(referenceToSymbolVar.getReferenceType()))
.findFirst(); .findFirst();
if(refDefine.isPresent()) { if(refDefine.isPresent()) {
return ((ReferenceInStatement)refDefine.get()).getStatementIdx(); return ((ReferenceInStatement) refDefine.get()).getStatementIdx();
} }
} }
return null; return null;
} }
/** /**
* Get all statements referencing a variable * Get all statements referencing a variable
* *

View File

@@ -4,8 +4,10 @@ import dk.camelot64.kickc.model.ControlFlowBlock;
import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.VariableReferenceInfos; import dk.camelot64.kickc.model.VariableReferenceInfos;
import dk.camelot64.kickc.model.statements.*; import dk.camelot64.kickc.model.statements.*;
import dk.camelot64.kickc.model.symbols.*; import dk.camelot64.kickc.model.symbols.EnumDefinition;
import dk.camelot64.kickc.model.types.SymbolTypeStruct; 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.LValue;
import dk.camelot64.kickc.model.values.StructUnwoundPlaceholder; import dk.camelot64.kickc.model.values.StructUnwoundPlaceholder;
import dk.camelot64.kickc.model.values.VariableRef; import dk.camelot64.kickc.model.values.VariableRef;
@@ -36,29 +38,12 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
while(stmtIt.hasNext()) { while(stmtIt.hasNext()) {
Statement statement = stmtIt.next(); Statement statement = stmtIt.next();
if(statement instanceof StatementAssignment) { if(statement instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statement; LValue lValue = ((StatementAssignment) statement).getlValue();
LValue lValue = assignment.getlValue(); if(lValue instanceof VariableRef) {
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
Variable variable = getScope().getVariable((VariableRef) lValue); Variable variable = getScope().getVariable((VariableRef) lValue);
boolean eliminate = false; if(eliminate(variable, referenceInfos, statement)) {
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(pass2 || getLog().isVerbosePass1CreateSsa()) { 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(); stmtIt.remove();
if(variable != null) { if(variable != null) {
@@ -68,50 +53,47 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
} }
} }
} else if(statement instanceof StatementCall) { } else if(statement instanceof StatementCall) {
StatementCall call = (StatementCall) statement; LValue lValue = ((StatementCall) statement).getlValue();
LValue lValue = call.getlValue(); if(lValue instanceof VariableRef) {
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
Variable variable = getScope().getVariable((VariableRef) lValue); Variable variable = getScope().getVariable((VariableRef) lValue);
if(!variable.isVolatile()) { if(eliminate(variable, referenceInfos, statement)) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) { if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram())); getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
} }
if(variable != null) { if(variable != null) {
variable.getScope().remove(variable); variable.getScope().remove(variable);
} }
call.setlValue(null); ((StatementCall) statement).setlValue(null);
modified = true; modified = true;
} }
} }
} else if(statement instanceof StatementCallFinalize) { } else if(statement instanceof StatementCallFinalize) {
StatementCallFinalize call = (StatementCallFinalize) statement; LValue lValue = ((StatementCallFinalize) statement).getlValue();
LValue lValue = call.getlValue(); if(lValue instanceof VariableRef) {
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
Variable variable = getScope().getVariable((VariableRef) lValue); Variable variable = getScope().getVariable((VariableRef) lValue);
if(!variable.isVolatile()) { if(eliminate(variable, referenceInfos, statement)) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) { if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram())); getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
} }
if(variable != null) { if(variable != null) {
variable.getScope().remove(variable); variable.getScope().remove(variable);
} }
call.setlValue(null); ((StatementCallFinalize) statement).setlValue(null);
modified = true; modified = true;
} }
} }
} else if(statement instanceof StatementCallPointer) { } else if(statement instanceof StatementCallPointer) {
StatementCallPointer call = (StatementCallPointer) statement; LValue lValue = ((StatementCallPointer) statement).getlValue();
LValue lValue = call.getlValue(); if(lValue instanceof VariableRef) {
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
Variable variable = getScope().getVariable((VariableRef) lValue); Variable variable = getScope().getVariable((VariableRef) lValue);
if(!variable.isVolatile()) { if(eliminate(variable, referenceInfos, statement)) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) { if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram())); getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
} }
if(variable != null) { if(variable != null) {
variable.getScope().remove(variable); variable.getScope().remove(variable);
} }
call.setlValue(null); ((StatementCallPointer) statement).setlValue(null);
modified = true; modified = true;
} }
} }
@@ -121,18 +103,16 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
while(phiVarIt.hasNext()) { while(phiVarIt.hasNext()) {
StatementPhiBlock.PhiVariable phiVariable = phiVarIt.next(); StatementPhiBlock.PhiVariable phiVariable = phiVarIt.next();
VariableRef variableRef = phiVariable.getVariable(); VariableRef variableRef = phiVariable.getVariable();
if(referenceInfos.isUnused(variableRef)) { Variable variable = getScope().getVariable(variableRef);
Variable variable = getScope().getVariable(variableRef); if(eliminate(variable, referenceInfos, statement)) {
if(!variable.isVolatile()) { if(pass2 || getLog().isVerbosePass1CreateSsa()) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) { getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
}
if(variable != null) {
variable.getScope().remove(variable);
}
phiVarIt.remove();
modified = true;
} }
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)) { for(Variable variable : getScope().getAllVariables(true)) {
if(referenceInfos.isUnused(variable.getRef())) { if(eliminate(variable, referenceInfos, null) && !variable.isKindPhiMaster()) {
if(!variable.isExport() && !variable.isKindPhiMaster()) { getLog().append("Eliminating unused variable with no statement " + variable.getRef().toString(getProgram()));
getLog().append("Eliminating unused variable with no statement " + variable.getRef().toString(getProgram())); variable.getScope().remove(variable);
variable.getScope().remove(variable);
}
} }
} }
Collection<Variable> allConstants = getScope().getAllConstants(true); Collection<Variable> allConstants = getScope().getAllConstants(true);
for(Variable constant : allConstants) { for(Variable constant : allConstants) {
if(!(constant.getScope() instanceof EnumDefinition) && !(constant.getScope() instanceof StructDefinition)) { if(eliminate(constant, referenceInfos, null)) {
if(referenceInfos.isUnused(constant.getRef())) { if(pass2 || getLog().isVerbosePass1CreateSsa()) {
if(constant.isExport()) { getLog().append("Eliminating unused constant " + constant.toString(getProgram()));
// 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;
} }
constant.getScope().remove(constant);
modified = true;
} }
} }
@@ -170,6 +142,40 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
return modified; 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 * Determines if a variable is the return value for a procedure
* *

View File

@@ -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 Simplifying expression containing zero PROTO_BOB in [411] *((const byte*) PROTO_BOB + (byte) 0) ← (byte) 0
Successful SSA optimization PassNSimplifyExpressionWithZero Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#24 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 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 void*) memset::return#2
Eliminating unused constant (const byte) bob_charset_next_id#27 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
Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions 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 [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 [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 Constant right-side identified [53] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff

View File

@@ -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 Simplifying expression containing zero PROTO_BOB in [476] *((const byte*) PROTO_BOB + (byte) 0) ← (byte) 0
Successful SSA optimization PassNSimplifyExpressionWithZero Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#24 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 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 void*) memset::return#2
Eliminating unused constant (const byte) bob_charset_next_id#27 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
Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions 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 [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 [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 Constant right-side identified [86] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff

View File

@@ -5,16 +5,13 @@
.pc = $80d "Program" .pc = $80d "Program"
.label DC00 = $dc00 .label DC00 = $dc00
main: { main: {
ldy #0
__b1: __b1:
iny
__b2:
ldx DC00 ldx DC00
txa txa
and #$1f and #$1f
cpx #0 cpx #0
bne __b1 bne __b1
cmp #$1f cmp #$1f
beq __b2 beq __b1
jmp __b1 jmp __b1
} }

View File

@@ -13,14 +13,13 @@ main: scope:[main] from @1
[4] phi() [4] phi()
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@2 main::@3 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 ) [5] (byte) key#1 ← *((const byte*) DC00)
[6] (byte) rpc#1 ← ++ (byte) rpc#4 [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 to:main::@2
main::@2: scope:[main] from main::@1 main::@3 main::@2: scope:[main] from main::@1 main::@3
[7] (byte) key#1 ← *((const byte*) DC00) [9] phi()
[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
to:main::@1 to:main::@1

View File

@@ -1,21 +1,15 @@
Culled Empty Block (label) main::@1
Culled Empty Block (label) main::@4 Culled Empty Block (label) main::@4
CONTROL FLOW GRAPH SSA CONTROL FLOW GRAPH SSA
@begin: scope:[] from @begin: scope:[] from
(byte) rpc#0 ← (byte) 0
(byte) key#0 ← (byte) 0 (byte) key#0 ← (byte) 0
to:@1 to:@1
(void()) main() (void()) main()
main: scope:[main] from @1 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 to:main::@2
main::@2: scope:[main] from main::@1 main::@2 main::@2: scope:[main] from main main::@2 main::@3
(byte) rpc#10 ← phi( main::@1/(byte) rpc#1 main::@2/(byte) rpc#10 )
(byte) key#1 ← *((const byte*) DC00) (byte) key#1 ← *((const byte*) DC00)
(bool~) main::$0 ← (byte) key#1 == (number) 0 (bool~) main::$0 ← (byte) key#1 == (number) 0
(number~) main::$1 ← (byte) key#1 & (number) $1f (number~) main::$1 ← (byte) key#1 & (number) $1f
@@ -25,25 +19,19 @@ main::@2: scope:[main] from main::@1 main::@2
to:main::@3 to:main::@3
main::@3: scope:[main] from main::@2 main::@3: scope:[main] from main::@2
(byte) key#6 ← phi( main::@2/(byte) key#1 ) (byte) key#6 ← phi( main::@2/(byte) key#1 )
(byte) rpc#8 ← phi( main::@2/(byte) rpc#10 ) if(true) goto main::@2
if(true) goto main::@1
to:main::@return to:main::@return
main::@return: scope:[main] from main::@3 main::@return: scope:[main] from main::@3
(byte) key#4 ← phi( main::@3/(byte) key#6 ) (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 (byte) key#2 ← (byte) key#4
return return
to:@return to:@return
@1: scope:[] from @begin @1: scope:[] from @begin
(byte) key#7 ← phi( @begin/(byte) key#0 ) (byte) key#7 ← phi( @begin/(byte) key#0 )
(byte) rpc#9 ← phi( @begin/(byte) rpc#0 )
call main call main
to:@2 to:@2
@2: scope:[] from @1 @2: scope:[] from @1
(byte) key#5 ← phi( @1/(byte) key#2 ) (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 (byte) key#3 ← (byte) key#5
to:@end to:@end
@end: scope:[] from @2 @end: scope:[] from @2
@@ -68,22 +56,9 @@ SYMBOL TABLE SSA
(number~) main::$1 (number~) main::$1
(bool~) main::$2 (bool~) main::$2
(bool~) main::$3 (bool~) main::$3
(label) main::@1
(label) main::@2 (label) main::@2
(label) main::@3 (label) main::@3
(label) main::@return (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) 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 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 Finalized unsigned number type (byte) $1f
Successful SSA optimization PassNFinalizeNumberTypeConversions Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to byte in (unumber~) main::$1 ← (byte) key#1 & (byte) $1f 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) 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) key#0 = (byte) key#7
Alias (byte) rpc#3 = (byte) rpc#6
Alias (byte) key#3 = (byte) key#5 Alias (byte) key#3 = (byte) key#5
Successful SSA optimization Pass2AliasElimination 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 Identical Phi Values (byte) key#3 (byte) key#1
Successful SSA optimization Pass2IdenticalPhiElimination 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 Successful SSA optimization Pass2ConditionalAndOrRewriting
Constant (const byte) rpc#0 = 0
Constant (const byte) key#0 = 0 Constant (const byte) key#0 = 0
Successful SSA optimization Pass2ConstantIdentification 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 Successful SSA optimization Pass2ConstantIfs
Eliminating unused constant (const byte) key#0 Eliminating unused constant (const byte) key#0
Successful SSA optimization PassNEliminateUnusedVars Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks Successful SSA optimization Pass2EliminateUnusedBlocks
Simple Condition (bool~) main::$0 [6] if((byte) key#1==(byte) 0) goto main::@5 Simple Condition (bool~) main::$0 [4] 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::$2 [6] if((byte~) main::$1==(byte) $1f) goto main::@2
Successful SSA optimization Pass2ConditionalJumpSimplification 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 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 @begin
Adding NOP phi() at start of @1 Adding NOP phi() at start of @1
Adding NOP phi() at start of @2 Adding NOP phi() at start of @2
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
Adding NOP phi() at start of main Adding NOP phi() at start of main
Adding NOP phi() at start of main::@3
CALL GRAPH CALL GRAPH
Calls in [] to main:2 Calls in [] to main:2
Created 1 initial phi equivalence classes Created 0 initial phi equivalence classes
Coalesced [12] rpc#11 ← rpc#1 Coalesced down to 0 phi equivalence classes
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) @2 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 Renumbering block main::@5 to main::@3
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1 Adding NOP phi() at start of @1
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
Adding NOP phi() at start of main Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
FINAL CONTROL FLOW GRAPH FINAL CONTROL FLOW GRAPH
@begin: scope:[] from @begin: scope:[] from
@@ -166,16 +133,15 @@ main: scope:[main] from @1
[4] phi() [4] phi()
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@2 main::@3 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 ) [5] (byte) key#1 ← *((const byte*) DC00)
[6] (byte) rpc#1 ← ++ (byte) rpc#4 [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 to:main::@2
main::@2: scope:[main] from main::@1 main::@3 main::@2: scope:[main] from main::@1 main::@3
[7] (byte) key#1 ← *((const byte*) DC00) [9] phi()
[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
to:main::@1 to:main::@1
@@ -184,21 +150,15 @@ VARIABLE REGISTER WEIGHTS
(byte) key#1 151.5 (byte) key#1 151.5
(void()) main() (void()) main()
(byte~) main::$1 101.0 (byte~) main::$1 101.0
(byte) rpc
(byte) rpc#1 42.6
(byte) rpc#4 213.0
Initial phi equivalence classes Initial phi equivalence classes
[ rpc#4 rpc#1 ]
Added variable key#1 to live range equivalence class [ key#1 ] Added variable key#1 to live range equivalence class [ key#1 ]
Added variable main::$1 to live range equivalence class [ main::$1 ] Added variable main::$1 to live range equivalence class [ main::$1 ]
Complete equivalence classes Complete equivalence classes
[ rpc#4 rpc#1 ]
[ key#1 ] [ key#1 ]
[ main::$1 ] [ main::$1 ]
Allocated zp[1]:2 [ rpc#4 rpc#1 ] Allocated zp[1]:2 [ key#1 ]
Allocated zp[1]:3 [ key#1 ] Allocated zp[1]:3 [ main::$1 ]
Allocated zp[1]:4 [ main::$1 ]
INITIAL ASM INITIAL ASM
Target platform is c64basic / MOS6502X Target platform is c64basic / MOS6502X
@@ -211,8 +171,7 @@ Target platform is c64basic / MOS6502X
.pc = $80d "Program" .pc = $80d "Program"
// Global Constants & labels // Global Constants & labels
.label DC00 = $dc00 .label DC00 = $dc00
.label rpc = 2 .label key = 2
.label key = 3
// @begin // @begin
__bbegin: __bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1] // [1] phi from @begin to @1 [phi:@begin->@1]
@@ -231,58 +190,48 @@ __bend_from___b1:
__bend: __bend:
// main // main
main: { main: {
.label __1 = 4 .label __1 = 3
// [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
jmp __b1 jmp __b1
// main::@1 // main::@1
__b1: __b1:
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuz1=_inc_vbuz1 // [5] (byte) key#1 ← *((const byte*) DC00) -- vbuz1=_deref_pbuc1
inc.z rpc
jmp __b2
// main::@2
__b2:
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuz1=_deref_pbuc1
lda DC00 lda DC00
sta.z key 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 lda #$1f
and.z key and.z key
sta.z __1 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 lda.z key
cmp #0 cmp #0
bne __b1_from___b2 bne __b2_from___b1
jmp __b3 jmp __b3
// main::@3 // main::@3
__b3: __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 lda #$1f
cmp.z __1 cmp.z __1
beq __b2 beq __b1
jmp __b1_from___b3 // [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 // File Data
REGISTER UPLIFT POTENTIAL REGISTERS 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]:2 [ key#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]:3 [ main::$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 ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [] 255.6: zp[1]:2 [ rpc#4 rpc#1 ] 151.5: zp[1]:3 [ key#1 ] Uplift Scope [] 151.5: zp[1]:2 [ key#1 ]
Uplift Scope [main] 101: zp[1]:4 [ main::$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 [] best 2502 combination reg byte x [ key#1 ]
Uplifting [main] best 2442 combination reg byte a [ main::$1 ] Uplifting [main] best 2102 combination reg byte a [ main::$1 ]
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
// File Comments // File Comments
@@ -312,38 +261,30 @@ __bend_from___b1:
__bend: __bend:
// main // main
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 jmp __b1
// main::@1 // main::@1
__b1: __b1:
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuyy=_inc_vbuyy // [5] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
iny
jmp __b2
// main::@2
__b2:
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
ldx DC00 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 txa
and #$1f 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 cpx #0
bne __b1_from___b2 bne __b2_from___b1
jmp __b3 jmp __b3
// main::@3 // main::@3
__b3: __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 cmp #$1f
beq __b2 beq __b1
jmp __b1_from___b3 // [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 // File Data
@@ -351,29 +292,28 @@ ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1 Removing instruction jmp __b1
Removing instruction jmp __bend Removing instruction jmp __bend
Removing instruction jmp __b1 Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b3 Removing instruction jmp __b3
Removing instruction jmp __b2
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5NextJumpElimination
Replacing label __bbegin with __b1 Replacing label __bbegin with __b1
Replacing label __b1_from___b2 with __b1 Replacing label __b2_from___b1 with __b2
Replacing label __b1_from___b3 with __b1
Removing instruction __bbegin: Removing instruction __bbegin:
Removing instruction __b1_from___bbegin: Removing instruction __b1_from___bbegin:
Removing instruction main_from___b1: Removing instruction main_from___b1:
Removing instruction __bend_from___b1: Removing instruction __bend_from___b1:
Removing instruction __b1_from___b2: Removing instruction __b2_from___b1:
Removing instruction __b1_from___b3: Removing instruction __b2_from___b3:
Succesful ASM optimization Pass5RedundantLabelElimination Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __bend: Removing instruction __bend:
Removing instruction __b1_from_main:
Removing instruction __b3: Removing instruction __b3:
Succesful ASM optimization Pass5UnusedLabelElimination Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly Updating BasicUpstart to call main directly
Removing instruction jsr main Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp __b1 Skipping double jump to __b1 in bne __b2
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5DoubleJumpElimination
Removing instruction __b1: Removing instruction __b1:
Removing instruction __b2:
Succesful ASM optimization Pass5UnusedLabelElimination Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE FINAL SYMBOL TABLE
@@ -388,17 +328,13 @@ FINAL SYMBOL TABLE
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
(label) main::@3 (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 x [ key#1 ]
reg byte a [ main::$1 ] reg byte a [ main::$1 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 2040 Score: 1730
// File Comments // File Comments
// Duplicate Loop Problem from Richard-William Loerakker // Duplicate Loop Problem from Richard-William Loerakker
@@ -418,33 +354,25 @@ Score: 2040
// @end // @end
// main // main
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 // main::@1
__b1: __b1:
// rpc++;
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuyy=_inc_vbuyy
iny
// main::@2
__b2:
// key = *DC00 // key = *DC00
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1 // [5] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
ldx DC00 ldx DC00
// key & %00011111 // 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 txa
and #$1f and #$1f
// while(key == 0 && ((key & %00011111) == %00011111)) // 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 cpx #0
bne __b1 bne __b1
// main::@3 // 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 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 jmp __b1
} }
// File Data // File Data

View File

@@ -9,10 +9,6 @@
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
(label) main::@3 (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 x [ key#1 ]
reg byte a [ main::$1 ] reg byte a [ main::$1 ]

View File

@@ -3,14 +3,12 @@
.pc = $80d "Program" .pc = $80d "Program"
.label SCREEN = $400 .label SCREEN = $400
main: { main: {
ldy #0 ldx #0
ldx #'a'
__b1: __b1:
lda #'a' lda #'a'
sta SCREEN sta SCREEN
inx inx
iny cpx #4
cpy #4
bne __b1 bne __b1
rts rts
} }

View File

@@ -14,12 +14,10 @@ main: scope:[main] from @1
to:main::@1 to:main::@1
main::@1: scope:[main] from main 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::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 } asm { lda#'a' staSCREEN }
[7] (byte) main::a#1 ← ++ (byte) main::a#2 [7] (byte) main::i#1 ← ++ (byte) main::i#2
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [8] if((byte) main::i#1!=(byte) 4) goto main::@1
[9] if((byte) main::i#1!=(byte) 4) goto main::@1
to:main::@return to:main::@return
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
[10] return [9] return
to:@return to:@return

View File

@@ -7,14 +7,11 @@ CONTROL FLOW GRAPH SSA
(void()) main() (void()) main()
main: scope:[main] from @1 main: scope:[main] from @1
(byte) main::a#0 ← (byte) 'a'
(byte) main::i#0 ← (byte) 0 (byte) main::i#0 ← (byte) 0
to:main::@1 to:main::@1
main::@1: scope:[main] from main 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::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 } asm { lda#'a' staSCREEN }
(byte) main::a#1 ← ++ (byte) main::a#2
(byte) main::i#1 ← (byte) main::i#2 + rangenext(0,3) (byte) main::i#1 ← (byte) main::i#2 + rangenext(0,3)
(bool~) main::$0 ← (byte) main::i#1 != rangelast(0,3) (bool~) main::$0 ← (byte) main::i#1 != rangelast(0,3)
if((bool~) main::$0) goto main::@1 if((bool~) main::$0) goto main::@1
@@ -39,10 +36,6 @@ SYMBOL TABLE SSA
(bool~) main::$0 (bool~) main::$0
(label) main::@1 (label) main::@1
(label) main::@return (label) main::@return
(byte) main::a
(byte) main::a#0
(byte) main::a#1
(byte) main::a#2
(byte) main::i (byte) main::i
(byte) main::i#0 (byte) main::i#0
(byte) main::i#1 (byte) main::i#1
@@ -50,22 +43,19 @@ SYMBOL TABLE SSA
Simplifying constant pointer cast (byte*) 1024 Simplifying constant pointer cast (byte*) 1024
Successful SSA optimization PassNCastSimplification 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 Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) main::a#0 = 'a'
Constant (const byte) main::i#0 = 0 Constant (const byte) main::i#0 = 0
Successful SSA optimization Pass2ConstantIdentification Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [5] main::i#1 ← ++ main::i#2 to ++ Resolved ranged next value [3] 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 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 Adding number conversion cast (unumber) 4 in if((byte) main::i#1!=(number) 4) goto main::@1
Successful SSA optimization PassNAddNumberTypeConversions Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast 4 Simplifying constant integer cast 4
Successful SSA optimization PassNCastSimplification Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 4 Finalized unsigned number type (byte) 4
Successful SSA optimization PassNFinalizeNumberTypeConversions Successful SSA optimization PassNFinalizeNumberTypeConversions
Inlining constant with var siblings (const byte) main::a#0
Inlining constant with var siblings (const byte) main::i#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 Constant inlined main::i#0 = (byte) 0
Successful SSA optimization Pass2ConstantInlining Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@3(between main::@1 and main::@1) 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 CALL GRAPH
Calls in [] to main:2 Calls in [] to main:2
Created 2 initial phi equivalence classes Created 1 initial phi equivalence classes
Coalesced [12] main::a#3 ← main::a#1 Coalesced [11] main::i#3 ← main::i#1
Coalesced [13] main::i#3 ← main::i#1 Coalesced down to 1 phi equivalence classes
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) @2 Culled Empty Block (label) @2
Culled Empty Block (label) main::@3 Culled Empty Block (label) main::@3
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
@@ -105,34 +94,26 @@ main: scope:[main] from @1
to:main::@1 to:main::@1
main::@1: scope:[main] from main 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::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 } asm { lda#'a' staSCREEN }
[7] (byte) main::a#1 ← ++ (byte) main::a#2 [7] (byte) main::i#1 ← ++ (byte) main::i#2
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [8] if((byte) main::i#1!=(byte) 4) goto main::@1
[9] if((byte) main::i#1!=(byte) 4) goto main::@1
to:main::@return to:main::@return
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
[10] return [9] return
to:@return to:@return
VARIABLE REGISTER WEIGHTS VARIABLE REGISTER WEIGHTS
(void()) main() (void()) main()
(byte) main::a
(byte) main::a#1 7.333333333333333
(byte) main::a#2 11.0
(byte) main::i (byte) main::i
(byte) main::i#1 16.5 (byte) main::i#1 16.5
(byte) main::i#2 7.333333333333333 (byte) main::i#2 11.0
Initial phi equivalence classes Initial phi equivalence classes
[ main::a#2 main::a#1 ]
[ main::i#2 main::i#1 ] [ main::i#2 main::i#1 ]
Complete equivalence classes Complete equivalence classes
[ main::a#2 main::a#1 ]
[ main::i#2 main::i#1 ] [ main::i#2 main::i#1 ]
Allocated zp[1]:2 [ main::a#2 main::a#1 ] Allocated zp[1]:2 [ main::i#2 main::i#1 ]
Allocated zp[1]:3 [ main::i#2 main::i#1 ]
INITIAL ASM INITIAL ASM
Target platform is c64basic / MOS6502X Target platform is c64basic / MOS6502X
@@ -161,57 +142,48 @@ __bend_from___b1:
__bend: __bend:
// main // main
main: { main: {
.label a = 2 .label i = 2
.label i = 3
// [5] phi from main to main::@1 [phi:main->main::@1] // [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main: __b1_from_main:
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 // [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0 lda #0
sta.z i 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 jmp __b1
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] // [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
__b1_from___b1: __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::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 jmp __b1
// main::@1 // main::@1
__b1: __b1:
// asm { lda#'a' staSCREEN } // asm { lda#'a' staSCREEN }
lda #'a' lda #'a'
sta SCREEN sta SCREEN
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuz1=_inc_vbuz1 // [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc.z a
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc.z i 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 lda #4
cmp.z i cmp.z i
bne __b1_from___b1 bne __b1_from___b1
jmp __breturn jmp __breturn
// main::@return // main::@return
__breturn: __breturn:
// [10] return // [9] return
rts rts
} }
// File Data // File Data
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Statement asm { lda#'a' staSCREEN } always clobbers reg byte a 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]:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::i#2 main::i#1 ]
Statement asm { lda#'a' staSCREEN } always clobbers reg byte a 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]:2 [ main::i#2 main::i#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 ,
REGISTER UPLIFT SCOPES 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 [] 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 [main] best 253 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 293 combination Uplifting [] best 253 combination
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
// File Comments // File Comments
@@ -241,32 +213,27 @@ __bend:
main: { main: {
// [5] phi from main to main::@1 [phi:main->main::@1] // [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main: __b1_from_main:
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1 // [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldy #0 ldx #0
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuxx=vbuc1
ldx #'a'
jmp __b1 jmp __b1
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] // [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
__b1_from___b1: __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::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 jmp __b1
// main::@1 // main::@1
__b1: __b1:
// asm { lda#'a' staSCREEN } // asm { lda#'a' staSCREEN }
lda #'a' lda #'a'
sta SCREEN 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 inx
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuyy=_inc_vbuyy // [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
iny cpx #4
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuyy_neq_vbuc1_then_la1
cpy #4
bne __b1_from___b1 bne __b1_from___b1
jmp __breturn jmp __breturn
// main::@return // main::@return
__breturn: __breturn:
// [10] return // [9] return
rts rts
} }
// File Data // File Data
@@ -305,19 +272,15 @@ FINAL SYMBOL TABLE
(void()) main() (void()) main()
(label) main::@1 (label) main::@1
(label) main::@return (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
(byte) main::i#1 reg byte y 16.5 (byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte y 7.333333333333333 (byte) main::i#2 reg byte x 11.0
reg byte x [ main::a#2 main::a#1 ] reg byte x [ main::i#2 main::i#1 ]
reg byte y [ main::i#2 main::i#1 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 191 Score: 151
// File Comments // File Comments
// Upstart // Upstart
@@ -336,31 +299,25 @@ Score: 191
// main // main
main: { main: {
// [5] phi from main to main::@1 [phi:main->main::@1] // [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 // [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldy #0 ldx #0
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuxx=vbuc1
ldx #'a'
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] // [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::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 // main::@1
__b1: __b1:
// asm // asm
// asm { lda#'a' staSCREEN } // asm { lda#'a' staSCREEN }
lda #'a' lda #'a'
sta SCREEN sta SCREEN
// a++;
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuxx=_inc_vbuxx
inx
// for( byte i:0..3) // for( byte i:0..3)
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuyy=_inc_vbuyy // [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
iny inx
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuyy_neq_vbuc1_then_la1 // [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
cpy #4 cpx #4
bne __b1 bne __b1
// main::@return // main::@return
// } // }
// [10] return // [9] return
rts rts
} }
// File Data // File Data

View File

@@ -5,12 +5,8 @@
(void()) main() (void()) main()
(label) main::@1 (label) main::@1
(label) main::@return (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
(byte) main::i#1 reg byte y 16.5 (byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte y 7.333333333333333 (byte) main::i#2 reg byte x 11.0
reg byte x [ main::a#2 main::a#1 ] reg byte x [ main::i#2 main::i#1 ]
reg byte y [ main::i#2 main::i#1 ]

View File

@@ -2,14 +2,12 @@
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
.label ba = 2 .label ba = 2
.label be = 6
.label bb = 3 .label bb = 3
.label bb_1 = 4 .label bb_1 = 4
.label bc = 5 .label bc = 5
main: { main: {
lda #0 lda #0
sta.z ba sta.z ba
sta.z be
tay tay
tax tax
sta.z bb sta.z bb
@@ -254,46 +252,14 @@ fb: {
} }
fc: { fc: {
cmp #0 cmp #0
bne __b1
inc.z be
__b1:
cmp #1 cmp #1
bne __b2
inc.z be
__b2:
cmp #2 cmp #2
bne __b3
inc.z be
__b3:
cmp #3 cmp #3
bne __b4
inc.z be
__b4:
cmp #4 cmp #4
bne __b5
inc.z be
__b5:
cmp #5 cmp #5
bne __b6
inc.z be
__b6:
cmp #6 cmp #6
bne __b7
inc.z be
__b7:
cmp #7 cmp #7
bne __b8
inc.z be
__b8:
cmp #8 cmp #8
bne __b9
inc.z be
__b9:
cmp #9 cmp #9
bne __b19
lda #0
sta.z be
rts
__b19:
rts rts
} }

View File

@@ -14,7 +14,6 @@ main: scope:[main] from @1
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@3 main::@1: scope:[main] from main main::@3
[5] (byte) ba#17 ← phi( main/(byte) 0 main::@3/(byte) ba#1 ) [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) 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) bc#2 ← phi( main/(byte) 0 main::@3/(byte) bc#13 )
[5] (byte) bb#16 ← phi( main/(byte) 0 main::@3/(byte) bb#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 [12] call fa
to:f0::@1 to:f0::@1
f0::@1: scope:[f0] from f0 f0::@10 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) 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) 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 ) [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 [17] call fa
to:f0::@2 to:f0::@2
f0::@2: scope:[f0] from f0::@1 f0::@11 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) 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) 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 ) [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 [22] call fa
to:f0::@3 to:f0::@3
f0::@3: scope:[f0] from f0::@12 f0::@2 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) 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) 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 ) [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 [27] call fa
to:f0::@4 to:f0::@4
f0::@4: scope:[f0] from f0::@13 f0::@3 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) 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) 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 ) [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 [32] call fa
to:f0::@5 to:f0::@5
f0::@5: scope:[f0] from f0::@14 f0::@4 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) 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) 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 ) [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 [37] call fa
to:f0::@6 to:f0::@6
f0::@6: scope:[f0] from f0::@15 f0::@5 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) 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) 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 ) [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 [42] call fa
to:f0::@7 to:f0::@7
f0::@7: scope:[f0] from f0::@16 f0::@6 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) 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) 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 ) [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 [47] call fa
to:f0::@8 to:f0::@8
f0::@8: scope:[f0] from f0::@17 f0::@7 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) 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) 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 ) [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 [52] call fa
to:f0::@9 to:f0::@9
f0::@9: scope:[f0] from f0::@18 f0::@8 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) 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) 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 ) [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 [56] call fa
to:f0::@return to:f0::@return
f0::@return: scope:[f0] from f0::@19 f0::@9 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) 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) 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 ) [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() (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 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) 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) 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 ) [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 [63] call fb
to:fa::@1 to:fa::@1
fa::@1: scope:[fa] from fa fa::@10 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) 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 ) [64] (byte) bc#40 ← phi( fa/(byte) bc#39 fa::@10/(byte) bc#104 )
[65] if((byte) bb#27!=(byte) 1) goto fa::@2 [65] if((byte) bb#27!=(byte) 1) goto fa::@2
@@ -176,7 +163,6 @@ fa::@11: scope:[fa] from fa::@1
[68] call fb [68] call fb
to:fa::@2 to:fa::@2
fa::@2: scope:[fa] from fa::@1 fa::@11 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) 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 ) [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 [70] if((byte) bb#27!=(byte) 2) goto fa::@3
@@ -187,7 +173,6 @@ fa::@12: scope:[fa] from fa::@2
[73] call fb [73] call fb
to:fa::@3 to:fa::@3
fa::@3: scope:[fa] from fa::@12 fa::@2 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) 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 ) [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 [75] if((byte) bb#27!=(byte) 3) goto fa::@4
@@ -198,7 +183,6 @@ fa::@13: scope:[fa] from fa::@3
[78] call fb [78] call fb
to:fa::@4 to:fa::@4
fa::@4: scope:[fa] from fa::@13 fa::@3 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) 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 ) [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 [80] if((byte) bb#27!=(byte) 4) goto fa::@5
@@ -209,7 +193,6 @@ fa::@14: scope:[fa] from fa::@4
[83] call fb [83] call fb
to:fa::@5 to:fa::@5
fa::@5: scope:[fa] from fa::@14 fa::@4 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) 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 ) [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 [85] if((byte) bb#27!=(byte) 5) goto fa::@6
@@ -220,7 +203,6 @@ fa::@15: scope:[fa] from fa::@5
[88] call fb [88] call fb
to:fa::@6 to:fa::@6
fa::@6: scope:[fa] from fa::@15 fa::@5 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) 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 ) [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 [90] if((byte) bb#27!=(byte) 6) goto fa::@7
@@ -231,7 +213,6 @@ fa::@16: scope:[fa] from fa::@6
[93] call fb [93] call fb
to:fa::@7 to:fa::@7
fa::@7: scope:[fa] from fa::@16 fa::@6 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) 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 ) [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 [95] if((byte) bb#27!=(byte) 7) goto fa::@8
@@ -242,7 +223,6 @@ fa::@17: scope:[fa] from fa::@7
[98] call fb [98] call fb
to:fa::@8 to:fa::@8
fa::@8: scope:[fa] from fa::@17 fa::@7 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) 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 ) [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 [100] if((byte) bb#27!=(byte) 8) goto fa::@9
@@ -253,7 +233,6 @@ fa::@18: scope:[fa] from fa::@8
[103] call fb [103] call fb
to:fa::@9 to:fa::@9
fa::@9: scope:[fa] from fa::@18 fa::@8 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) 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 ) [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 [105] if((byte) bb#27!=(byte) 9) goto fa::@return
@@ -263,7 +242,6 @@ fa::@19: scope:[fa] from fa::@9
[107] call fb [107] call fb
to:fa::@return to:fa::@return
fa::@return: scope:[fa] from fa::@19 fa::@9 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) 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 ) [108] (byte) bc#24 ← phi( fa::@19/(byte) 0 fa::@9/(byte) bc#83 )
[109] return [109] return
@@ -271,7 +249,6 @@ fa::@return: scope:[fa] from fa::@19 fa::@9
(void()) fb() (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 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) 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 ) [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 [111] if((byte) bc#113!=(byte) 0) goto fb::@1
@@ -282,7 +259,6 @@ fb::@10: scope:[fb] from fb
[114] call fc [114] call fc
to:fb::@1 to:fb::@1
fb::@1: scope:[fb] from fb fb::@10 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 ) [115] (byte) bd#107 ← phi( fb/(byte) bd#106 fb::@10/(byte) bd#146 )
[116] if((byte) bc#113!=(byte) 1) goto fb::@2 [116] if((byte) bc#113!=(byte) 1) goto fb::@2
to:fb::@11 to:fb::@11
@@ -292,7 +268,6 @@ fb::@11: scope:[fb] from fb::@1
[119] call fc [119] call fc
to:fb::@2 to:fb::@2
fb::@2: scope:[fb] from fb::@1 fb::@11 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 ) [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 [121] if((byte) bc#113!=(byte) 2) goto fb::@3
to:fb::@12 to:fb::@12
@@ -302,7 +277,6 @@ fb::@12: scope:[fb] from fb::@2
[124] call fc [124] call fc
to:fb::@3 to:fb::@3
fb::@3: scope:[fb] from fb::@12 fb::@2 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 ) [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 [126] if((byte) bc#113!=(byte) 3) goto fb::@4
to:fb::@13 to:fb::@13
@@ -312,7 +286,6 @@ fb::@13: scope:[fb] from fb::@3
[129] call fc [129] call fc
to:fb::@4 to:fb::@4
fb::@4: scope:[fb] from fb::@13 fb::@3 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 ) [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 [131] if((byte) bc#113!=(byte) 4) goto fb::@5
to:fb::@14 to:fb::@14
@@ -322,7 +295,6 @@ fb::@14: scope:[fb] from fb::@4
[134] call fc [134] call fc
to:fb::@5 to:fb::@5
fb::@5: scope:[fb] from fb::@14 fb::@4 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 ) [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 [136] if((byte) bc#113!=(byte) 5) goto fb::@6
to:fb::@15 to:fb::@15
@@ -332,7 +304,6 @@ fb::@15: scope:[fb] from fb::@5
[139] call fc [139] call fc
to:fb::@6 to:fb::@6
fb::@6: scope:[fb] from fb::@15 fb::@5 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 ) [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 [141] if((byte) bc#113!=(byte) 6) goto fb::@7
to:fb::@16 to:fb::@16
@@ -342,7 +313,6 @@ fb::@16: scope:[fb] from fb::@6
[144] call fc [144] call fc
to:fb::@7 to:fb::@7
fb::@7: scope:[fb] from fb::@16 fb::@6 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 ) [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 [146] if((byte) bc#113!=(byte) 7) goto fb::@8
to:fb::@17 to:fb::@17
@@ -352,7 +322,6 @@ fb::@17: scope:[fb] from fb::@7
[149] call fc [149] call fc
to:fb::@8 to:fb::@8
fb::@8: scope:[fb] from fb::@17 fb::@7 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 ) [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 [151] if((byte) bc#113!=(byte) 8) goto fb::@9
to:fb::@18 to:fb::@18
@@ -362,7 +331,6 @@ fb::@18: scope:[fb] from fb::@8
[154] call fc [154] call fc
to:fb::@9 to:fb::@9
fb::@9: scope:[fb] from fb::@18 fb::@8 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 ) [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 [156] if((byte) bc#113!=(byte) 9) goto fb::@return
to:fb::@19 to:fb::@19
@@ -371,84 +339,72 @@ fb::@19: scope:[fb] from fb::@9
[158] call fc [158] call fc
to:fb::@return to:fb::@return
fb::@return: scope:[fb] from fb::@19 fb::@9 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 ) [159] (byte) bd#35 ← phi( fb::@19/(byte) 0 fb::@9/(byte) bd#116 )
[160] return [160] return
to:@return to:@return
(void()) fc() (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 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 ) [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 [162] if((byte) bd#117!=(byte) 0) goto fc::@1
to:fc::@10 to:fc::@10
fc::@10: scope:[fc] from fc fc::@10: scope:[fc] from fc
[163] (byte) be#36 ← ++ (byte) be#129 [163] phi()
to:fc::@1 to:fc::@1
fc::@1: scope:[fc] from fc fc::@10 fc::@1: scope:[fc] from fc fc::@10
[164] (byte) be#130 ← phi( fc/(byte) be#129 fc::@10/(byte) be#36 ) [164] if((byte) bd#117!=(byte) 1) goto fc::@2
[165] if((byte) bd#117!=(byte) 1) goto fc::@2
to:fc::@11 to:fc::@11
fc::@11: scope:[fc] from fc::@1 fc::@11: scope:[fc] from fc::@1
[166] (byte) be#37 ← ++ (byte) be#130 [165] phi()
to:fc::@2 to:fc::@2
fc::@2: scope:[fc] from fc::@1 fc::@11 fc::@2: scope:[fc] from fc::@1 fc::@11
[167] (byte) be#131 ← phi( fc::@1/(byte) be#130 fc::@11/(byte) be#37 ) [166] if((byte) bd#117!=(byte) 2) goto fc::@3
[168] if((byte) bd#117!=(byte) 2) goto fc::@3
to:fc::@12 to:fc::@12
fc::@12: scope:[fc] from fc::@2 fc::@12: scope:[fc] from fc::@2
[169] (byte) be#38 ← ++ (byte) be#131 [167] phi()
to:fc::@3 to:fc::@3
fc::@3: scope:[fc] from fc::@12 fc::@2 fc::@3: scope:[fc] from fc::@12 fc::@2
[170] (byte) be#132 ← phi( fc::@12/(byte) be#38 fc::@2/(byte) be#131 ) [168] if((byte) bd#117!=(byte) 3) goto fc::@4
[171] if((byte) bd#117!=(byte) 3) goto fc::@4
to:fc::@13 to:fc::@13
fc::@13: scope:[fc] from fc::@3 fc::@13: scope:[fc] from fc::@3
[172] (byte) be#39 ← ++ (byte) be#132 [169] phi()
to:fc::@4 to:fc::@4
fc::@4: scope:[fc] from fc::@13 fc::@3 fc::@4: scope:[fc] from fc::@13 fc::@3
[173] (byte) be#133 ← phi( fc::@13/(byte) be#39 fc::@3/(byte) be#132 ) [170] if((byte) bd#117!=(byte) 4) goto fc::@5
[174] if((byte) bd#117!=(byte) 4) goto fc::@5
to:fc::@14 to:fc::@14
fc::@14: scope:[fc] from fc::@4 fc::@14: scope:[fc] from fc::@4
[175] (byte) be#40 ← ++ (byte) be#133 [171] phi()
to:fc::@5 to:fc::@5
fc::@5: scope:[fc] from fc::@14 fc::@4 fc::@5: scope:[fc] from fc::@14 fc::@4
[176] (byte) be#134 ← phi( fc::@14/(byte) be#40 fc::@4/(byte) be#133 ) [172] if((byte) bd#117!=(byte) 5) goto fc::@6
[177] if((byte) bd#117!=(byte) 5) goto fc::@6
to:fc::@15 to:fc::@15
fc::@15: scope:[fc] from fc::@5 fc::@15: scope:[fc] from fc::@5
[178] (byte) be#41 ← ++ (byte) be#134 [173] phi()
to:fc::@6 to:fc::@6
fc::@6: scope:[fc] from fc::@15 fc::@5 fc::@6: scope:[fc] from fc::@15 fc::@5
[179] (byte) be#135 ← phi( fc::@15/(byte) be#41 fc::@5/(byte) be#134 ) [174] if((byte) bd#117!=(byte) 6) goto fc::@7
[180] if((byte) bd#117!=(byte) 6) goto fc::@7
to:fc::@16 to:fc::@16
fc::@16: scope:[fc] from fc::@6 fc::@16: scope:[fc] from fc::@6
[181] (byte) be#42 ← ++ (byte) be#135 [175] phi()
to:fc::@7 to:fc::@7
fc::@7: scope:[fc] from fc::@16 fc::@6 fc::@7: scope:[fc] from fc::@16 fc::@6
[182] (byte) be#136 ← phi( fc::@16/(byte) be#42 fc::@6/(byte) be#135 ) [176] if((byte) bd#117!=(byte) 7) goto fc::@8
[183] if((byte) bd#117!=(byte) 7) goto fc::@8
to:fc::@17 to:fc::@17
fc::@17: scope:[fc] from fc::@7 fc::@17: scope:[fc] from fc::@7
[184] (byte) be#43 ← ++ (byte) be#136 [177] phi()
to:fc::@8 to:fc::@8
fc::@8: scope:[fc] from fc::@17 fc::@7 fc::@8: scope:[fc] from fc::@17 fc::@7
[185] (byte) be#137 ← phi( fc::@17/(byte) be#43 fc::@7/(byte) be#136 ) [178] if((byte) bd#117!=(byte) 8) goto fc::@9
[186] if((byte) bd#117!=(byte) 8) goto fc::@9
to:fc::@18 to:fc::@18
fc::@18: scope:[fc] from fc::@8 fc::@18: scope:[fc] from fc::@8
[187] (byte) be#44 ← ++ (byte) be#137 [179] phi()
to:fc::@9 to:fc::@9
fc::@9: scope:[fc] from fc::@18 fc::@8 fc::@9: scope:[fc] from fc::@18 fc::@8
[188] (byte) be#138 ← phi( fc::@18/(byte) be#44 fc::@8/(byte) be#137 ) [180] if((byte) bd#117!=(byte) 9) goto fc::@return
[189] if((byte) bd#117!=(byte) 9) goto fc::@19 to:fc::@19
to:fc::@return
fc::@19: scope:[fc] from fc::@9 fc::@19: scope:[fc] from fc::@9
[190] phi() [181] phi()
to:fc::@return to:fc::@return
fc::@return: scope:[fc] from fc::@19 fc::@9 fc::@return: scope:[fc] from fc::@19 fc::@9
[191] (byte) be#46 ← phi( fc::@9/(byte) 0 fc::@19/(byte) be#138 ) [182] return
[192] return
to:@return to:@return

File diff suppressed because it is too large Load Diff

View File

@@ -93,7 +93,7 @@
(byte) bd#113 reg byte y 4.0 (byte) bd#113 reg byte y 4.0
(byte) bd#114 reg byte y 4.0 (byte) bd#114 reg byte y 4.0
(byte) bd#116 reg byte y 3.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#129 reg byte y 2.0
(byte) bd#13 reg byte y 3.75 (byte) bd#13 reg byte y 3.75
(byte) bd#130 reg byte y 2.0 (byte) bd#130 reg byte y 2.0
@@ -130,60 +130,6 @@
(byte) bd#243 reg byte a 4.0 (byte) bd#243 reg byte a 4.0
(byte) bd#35 reg byte y 1.8333333333333335 (byte) bd#35 reg byte y 1.8333333333333335
(byte) bd#93 reg byte y 2.6666666666666665 (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() (void()) f0()
(label) f0::@1 (label) f0::@1
(label) f0::@10 (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 ] 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 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 ] 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 ]