1
0
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:
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) {
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
*

View File

@ -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
*

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
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

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
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

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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 ]

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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 ]

View File

@ -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
}

View File

@ -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

View File

@ -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 ]