1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-08 17:54:40 +00:00

Refactored ReferenceInfos to use a more abstract model of references to variables/constants.

This commit is contained in:
Jesper Gravgaard 2018-07-23 01:00:25 +09:00
parent 4b4c6f5364
commit 99085f1351
39 changed files with 2766 additions and 4440 deletions

View File

@ -35,7 +35,7 @@ public class CompileLog {
/** /**
* Should the log be output to System.out while being built * Should the log be output to System.out while being built
*/ */
private boolean sysOut = true; private boolean sysOut = false;
public CompileLog() { public CompileLog() {
this.log = new StringBuilder(); this.log = new StringBuilder();

View File

@ -1,9 +1,6 @@
package dk.camelot64.kickc.model; package dk.camelot64.kickc.model;
import dk.camelot64.kickc.model.values.ConstantRef; import dk.camelot64.kickc.model.values.*;
import dk.camelot64.kickc.model.values.LabelRef;
import dk.camelot64.kickc.model.values.RValue;
import dk.camelot64.kickc.model.values.VariableRef;
import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.passes.PassNVariableReferenceInfos; import dk.camelot64.kickc.passes.PassNVariableReferenceInfos;
@ -11,12 +8,14 @@ import java.util.Collection;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Map; import java.util.Map;
/** Cached information about which variables/constants are defined/referenced/used in which statements / blocks / symbols . /**
* Cached information about which variables/constants are defined/referenced/used in which statements / blocks / symbols .
* <ul> * <ul>
* <li><i>Defined</i> means the variable/constant receives its value in a specific statement (or symbol for named constants) </li> * <li><i>Defined</i> means the variable/constant receives its value in a specific statement (or symbol for named constants) </li>
* <li><i>Used</i> means the value of the variable/constant is used in a specific statement (or symbol for named constants) </li> * <li><i>Used</i> means the value of the variable/constant is used in a specific statement (or symbol for named constants) </li>
* <li><i>Referenced</i> means the variable/constant is either defined or referenced in a specific statement (or symbol for named constants) </li> * <li><i>Referenced</i> means the variable/constant is either defined or referenced in a specific statement (or symbol for named constants) </li>
* </ul>*/ * </ul>
*/
public class VariableReferenceInfos { public class VariableReferenceInfos {
/** Variables referenced in each block. */ /** Variables referenced in each block. */
@ -31,37 +30,113 @@ public class VariableReferenceInfos {
/** Variables defined in each statement. */ /** Variables defined in each statement. */
private Map<Integer, Collection<VariableRef>> stmtDefinedVars; private Map<Integer, Collection<VariableRef>> stmtDefinedVars;
/** The statement defining each variable. */ /** All references to symbol variables (constants/variables). References can be either statements or symbols in the symbol table */
private Map<VariableRef, Integer> varDefineStmt; private Map<SymbolVariableRef, Collection<ReferenceToSymbolVar>> symbolVarReferences;
/** All statements referencing each variable . */ /**
private Map<VariableRef, Collection<Integer>> varRefStmts; * A reference of a symbol variable (variable or const).
* The reference is either a specific statement or a symbol in the symbol table.
* The reference can either be defining the symbol variable or it can be using it.
*/
public interface ReferenceToSymbolVar {
/** All statements referencing each constant. */ enum ReferenceType {USE, DEFINE}
private Map<ConstantRef, Collection<Integer>> constRefStmts;
/** All constants referencing another constant. (maps from a constant to all constants using it in their value) */ /**
private Map<ConstantRef, Collection<ConstantRef>> constRefConsts; * Get the type of the reference
*
* @return The type of the reference (define or use)
*/
ReferenceType getReferenceType();
/**
* Get the symbol being referenced
*
* @return The symbol being referenced
*/
SymbolVariableRef getReferenced();
}
/** A reference to a variable/constant inside a statement. */
public static class ReferenceInStatement implements ReferenceToSymbolVar {
/** The index of the statement. */
private Integer statementIdx;
/** The type of reference. */
private ReferenceType referenceType;
/** The symbol being referenced. */
private SymbolVariableRef referencedSymbol;
public ReferenceInStatement(Integer statementIdx, ReferenceType referenceType, SymbolVariableRef referencedSymbol) {
this.statementIdx = statementIdx;
this.referenceType = referenceType;
this.referencedSymbol = referencedSymbol;
}
public Integer getStatementIdx() {
return statementIdx;
}
@Override
public ReferenceType getReferenceType() {
return referenceType;
}
@Override
public SymbolVariableRef getReferenced() {
return referencedSymbol;
}
}
/** A reference to a variable/constant inside a symbol i he symbol table. */
public static class ReferenceInSymbol implements ReferenceToSymbolVar {
/** The symbol in the symbol table that contains the reference. */
private SymbolVariableRef referencingSymbol;
/** The type of reference. */
private ReferenceType referenceType;
/** The symbol being referenced. */
private SymbolVariableRef referencedSymbol;
public ReferenceInSymbol(SymbolVariableRef referencingSymbol, ReferenceType referenceType, SymbolVariableRef referencedSymbol) {
this.referencingSymbol = referencingSymbol;
this.referenceType = referenceType;
this.referencedSymbol = referencedSymbol;
}
public SymbolVariableRef getReferencingSymbol() {
return referencingSymbol;
}
@Override
public ReferenceType getReferenceType() {
return referenceType;
}
@Override
public SymbolVariableRef getReferenced() {
return referencedSymbol;
}
}
public VariableReferenceInfos( public VariableReferenceInfos(
Map<LabelRef, Collection<VariableRef>> blockReferencedVars, Map<LabelRef, Collection<VariableRef>> blockReferencedVars,
Map<LabelRef, Collection<VariableRef>> blockUsedVars, Map<LabelRef, Collection<VariableRef>> blockUsedVars,
Map<Integer, Collection<VariableRef>> stmtReferencedVars, Map<Integer, Collection<VariableRef>> stmtReferencedVars,
Map<Integer, Collection<VariableRef>> stmtDefinedVars, Map<Integer, Collection<VariableRef>> stmtDefinedVars,
Map<VariableRef, Integer> varDefineStmt, Map<SymbolVariableRef, Collection<ReferenceToSymbolVar>> symbolVarReferences
Map<VariableRef, Collection<Integer>> varRefStmts,
Map<ConstantRef, Collection<Integer>> constRefStmts,
Map<ConstantRef, Collection<ConstantRef>> constRefConsts
) { ) {
this.blockReferencedVars = blockReferencedVars; this.blockReferencedVars = blockReferencedVars;
this.blockUsedVars = blockUsedVars; this.blockUsedVars = blockUsedVars;
this.stmtDefinedVars = stmtDefinedVars; this.stmtDefinedVars = stmtDefinedVars;
this.stmtReferencedVars = stmtReferencedVars; this.stmtReferencedVars = stmtReferencedVars;
this.varDefineStmt = varDefineStmt; this.symbolVarReferences = symbolVarReferences;
this.varRefStmts = varRefStmts;
this.constRefStmts = constRefStmts;
this.constRefConsts = constRefConsts;
} }
/** /**
@ -132,41 +207,43 @@ public class VariableReferenceInfos {
* *
* @return true if the variable is defined but never referenced * @return true if the variable is defined but never referenced
*/ */
public boolean isUnused(VariableRef variableRef) { public boolean isUnused(SymbolVariableRef variableRef) {
Collection<Integer> refs = new LinkedHashSet<>(varRefStmts.get(variableRef)); Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(variableRef);
refs.remove(varDefineStmt.get(variableRef)); if(refs==null) return true;
return refs.size() == 0; return !refs.stream()
} .anyMatch(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.USE.equals(referenceToSymbolVar.getReferenceType())
);
/**
* Determines if a constant is unused
*
* @return true if the constant is never referenced
*/
public boolean isUnused(ConstantRef constRef) {
Collection<Integer> constStmts = this.constRefStmts.get(constRef);
Collection<ConstantRef> constRefs = constRefConsts.get(constRef);
boolean unusedInStmts = constStmts == null || constStmts.size() == 0;
boolean unusedInConsts = constRefs == null || constRefs.size() == 0;
return unusedInStmts && unusedInConsts;
} }
/** /**
* Get all statements referencing constant * Get all statements referencing constant
*
* @param constRef The constant to look for * @param constRef The constant to look for
* @return Index of all statements referencing the constant * @return Index of all statements referencing the constant
*/ */
public Collection<Integer> getConstRefStatements(ConstantRef constRef) { public Collection<Integer> getConstRefStatements(ConstantRef constRef) {
return constRefStmts.get(constRef); Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(constRef);
LinkedHashSet<Integer> stmts = new LinkedHashSet<>();
refs.stream()
.filter(referenceToSymbolVar -> referenceToSymbolVar instanceof ReferenceInStatement)
.forEach(referenceToSymbolVar -> stmts.add(((ReferenceInStatement) referenceToSymbolVar).getStatementIdx()));
return stmts;
} }
/** /**
* Get all constatns referencing another constant * Get all constatns referencing another constant
*
* @param constRef The constant to look for * @param constRef The constant to look for
* @return All constants that reference the constant in their value * @return All constants that reference the constant in their value
*/ */
public Collection<ConstantRef> getConstRefConsts(ConstantRef constRef) { public Collection<ConstantRef> getConstRefConsts(ConstantRef constRef) {
return constRefConsts.get(constRef); Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(constRef);
LinkedHashSet<ConstantRef> constRefs = new LinkedHashSet<>();
refs.stream()
.filter(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.USE.equals(referenceToSymbolVar.getReferenceType()))
.filter(referenceToSymbolVar -> referenceToSymbolVar instanceof ReferenceInSymbol)
.forEach(referenceToSymbolVar -> constRefs.add((ConstantRef) ((ReferenceInSymbol) referenceToSymbolVar).getReferencingSymbol()));
return constRefs;
} }
} }

View File

@ -51,6 +51,9 @@ public class SymbolRef implements Value {
} else { } else {
try { try {
Symbol symbol = program.getScope().getSymbol(fullName); Symbol symbol = program.getScope().getSymbol(fullName);
if(symbol==null) {
return fullName+"(null)";
}
return symbol.toString(program); return symbol.toString(program);
} catch(NullPointerException e) { } catch(NullPointerException e) {
throw e; throw e;

View File

@ -39,7 +39,9 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
getLog().append("Eliminating unused variable " + lValue.toString(getProgram()) + " and assignment " + assignment.toString(getProgram(), false)); getLog().append("Eliminating unused variable " + lValue.toString(getProgram()) + " and assignment " + assignment.toString(getProgram(), false));
stmtIt.remove(); stmtIt.remove();
Variable variable = getScope().getVariable((VariableRef) lValue); Variable variable = getScope().getVariable((VariableRef) lValue);
variable.getScope().remove(variable); if(variable!=null) {
variable.getScope().remove(variable);
}
modified = true; modified = true;
} }
} else if(statement instanceof StatementCall) { } else if(statement instanceof StatementCall) {
@ -48,7 +50,9 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue) && !Pass2ConstantIdentification.isAddressOfUsed((VariableRef) lValue, getProgram())) { if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue) && !Pass2ConstantIdentification.isAddressOfUsed((VariableRef) lValue, getProgram())) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram())); getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
Variable variable = getScope().getVariable((VariableRef) lValue); Variable variable = getScope().getVariable((VariableRef) lValue);
variable.getScope().remove(variable); if(variable!=null) {
variable.getScope().remove(variable);
}
call.setlValue(null); call.setlValue(null);
modified = true; modified = true;
} }
@ -61,7 +65,9 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
if(referenceInfos.isUnused(variableRef) && !Pass2ConstantIdentification.isAddressOfUsed(variableRef, getProgram())) { if(referenceInfos.isUnused(variableRef) && !Pass2ConstantIdentification.isAddressOfUsed(variableRef, getProgram())) {
getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram())); getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
Variable variable = getScope().getVariable(variableRef); Variable variable = getScope().getVariable(variableRef);
variable.getScope().remove(variable); if(variable!=null) {
variable.getScope().remove(variable);
}
phiVarIt.remove(); phiVarIt.remove();
modified = true; modified = true;
} }

View File

@ -74,9 +74,7 @@ public class PassNVariableReferenceInfos extends Pass2Base {
LinkedHashMap<LabelRef, Collection<VariableRef>> blockUsedVars = new LinkedHashMap<>(); LinkedHashMap<LabelRef, Collection<VariableRef>> blockUsedVars = new LinkedHashMap<>();
LinkedHashMap<Integer, Collection<VariableRef>> stmtReferenced = new LinkedHashMap<>(); LinkedHashMap<Integer, Collection<VariableRef>> stmtReferenced = new LinkedHashMap<>();
LinkedHashMap<Integer, Collection<VariableRef>> stmtDefined = new LinkedHashMap<>(); LinkedHashMap<Integer, Collection<VariableRef>> stmtDefined = new LinkedHashMap<>();
LinkedHashMap<VariableRef, Integer> varDefineStmts = new LinkedHashMap<>(); Map<SymbolVariableRef, Collection<VariableReferenceInfos.ReferenceToSymbolVar>> symbolVarReferences = new LinkedHashMap<>();
LinkedHashMap<VariableRef, Collection<Integer>> varRefStmts = new LinkedHashMap<>();
LinkedHashMap<ConstantRef, Collection<Integer>> constStmts = new LinkedHashMap<>();
for(ControlFlowBlock block : getProgram().getGraph().getAllBlocks()) { for(ControlFlowBlock block : getProgram().getGraph().getAllBlocks()) {
LabelRef blockLabel = block.getLabel(); LabelRef blockLabel = block.getLabel();
blockReferencedVars.put(blockLabel, getReferencedVars(blockLabel, new ArrayList<>())); blockReferencedVars.put(blockLabel, getReferencedVars(blockLabel, new ArrayList<>()));
@ -90,43 +88,37 @@ public class PassNVariableReferenceInfos extends Pass2Base {
stmtReferenced.put(statement.getIndex(), referencedVars); stmtReferenced.put(statement.getIndex(), referencedVars);
// Identify statement defining variables // Identify statement defining variables
for(VariableRef variableRef : defined) { for(VariableRef variableRef : defined) {
varDefineStmts.put(variableRef, statement.getIndex()); symbolVarReferences.putIfAbsent(variableRef, new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(variableRef);
references.add(new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.DEFINE, variableRef));
} }
// Gather statements referencing variables // Gather statements referencing variables
for(VariableRef variableRef : referencedVars) { for(VariableRef variableRef : referencedVars) {
Collection<Integer> stmts = varRefStmts.get(variableRef); if(!defined.contains(variableRef)) {
if(stmts == null) { symbolVarReferences.putIfAbsent(variableRef, new ArrayList<>());
stmts = new LinkedHashSet<>(); Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(variableRef);
varRefStmts.put(variableRef, stmts); references.add(new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, variableRef));
} }
stmts.add(statement.getIndex());
} }
// Gather statements referencing constants // Gather statements referencing constants
Collection<ConstantRef> referencedConsts = getReferencedConsts(statement); Collection<ConstantRef> referencedConsts = getReferencedConsts(statement);
for(ConstantRef constantRef : referencedConsts) { for(ConstantRef constantRef : referencedConsts) {
Collection<Integer> stmts = constStmts.get(constantRef); symbolVarReferences.putIfAbsent(constantRef, new ArrayList<>());
if(stmts == null) { Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(constantRef);
stmts = new LinkedHashSet<>(); references.add(new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, constantRef));
constStmts.put(constantRef, stmts);
}
stmts.add(statement.getIndex());
} }
} }
} }
// Gather constants referencing other constants // Gather constants referencing other constants
LinkedHashMap<ConstantRef, Collection<ConstantRef>> constRefConsts = new LinkedHashMap<>();
for(ConstantVar constantVar : getSymbols().getAllConstants(true)) { for(ConstantVar constantVar : getSymbols().getAllConstants(true)) {
Collection<ConstantRef> referencedConsts = getReferencedConsts(constantVar.getValue()); Collection<ConstantRef> referencedConsts = getReferencedConsts(constantVar.getValue());
for(ConstantRef constantRef : referencedConsts) { for(ConstantRef constantRef : referencedConsts) {
Collection<ConstantRef> consts = constRefConsts.get(constantRef); symbolVarReferences.putIfAbsent(constantRef, new ArrayList<>());
if(consts == null) { Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(constantRef);
consts = new LinkedHashSet<>(); references.add(new VariableReferenceInfos.ReferenceInSymbol(constantVar.getRef(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, constantRef));
constRefConsts.put(constantRef, consts);
}
consts.add(constantVar.getRef());
} }
} }
getProgram().setVariableReferenceInfos(new VariableReferenceInfos(blockReferencedVars, blockUsedVars, stmtReferenced, stmtDefined, varDefineStmts, varRefStmts, constStmts, constRefConsts)); getProgram().setVariableReferenceInfos(new VariableReferenceInfos(blockReferencedVars, blockUsedVars, stmtReferenced, stmtDefined, symbolVarReferences));
} }
/** /**

View File

@ -4,7 +4,6 @@
.label B = $1000 .label B = $1000
jsr main jsr main
main: { main: {
lda #0
b2: b2:
jsr menu jsr menu
jmp b2 jmp b2

View File

@ -9,33 +9,27 @@
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @3 main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) a#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(byte) a#12 ) [ a#1 ] ( main:2 [ a#1 ] )
to:main::@2 to:main::@2
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main main::@2
[6] phi() [ a#1 ] ( main:2 [ a#1 ] ) [5] phi() [ ] ( main:2 [ ] )
[7] call menu [ a#12 ] ( main:2 [ a#12 ] ) [6] call menu [ ] ( main:2 [ ] )
to:main::@1 to:main::@2
menu: scope:[menu] from main::@2 menu: scope:[menu] from main::@2
[8] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] ) [7] phi() [ ] ( main:2::menu:6 [ ] )
to:menu::@2 to:menu::@2
menu::@2: scope:[menu] from menu menu::@2: scope:[menu] from menu
[9] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] ) [8] phi() [ ] ( main:2::menu:6 [ ] )
[10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] ) [9] call mode [ ] ( main:2::menu:6 [ ] )
to:menu::@return to:menu::@return
menu::@return: scope:[menu] from menu::@2 menu::@return: scope:[menu] from menu::@2
[11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] ) [10] return [ ] ( main:2::menu:6 [ ] )
to:@return to:@return
mode: scope:[mode] from menu::@2 mode: scope:[mode] from menu::@2
[12] phi() [ a#1 ] ( main:2::menu:7::mode:10 [ a#1 ] ) [11] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@1 to:mode::@2
mode::@1: scope:[mode] from mode mode::@2 mode::@7 mode::@2: scope:[mode] from mode mode::@2 mode::@4
[13] (byte) a#12 ← phi( mode/(byte) a#1 mode::@7/(byte) a#5 ) [ ] ( main:2::menu:7::mode:10 [ ] ) [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@4: scope:[mode] from mode::@2
[13] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2 to:mode::@2
mode::@2: scope:[mode] from mode::@1
[14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@7
mode::@7: scope:[mode] from mode::@2
[15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] )
to:mode::@1

View File

@ -150,6 +150,8 @@ mode::@return: scope:[mode] from mode::@3
Eliminating unused variable - keeping the call (void~) main::$0 Eliminating unused variable - keeping the call (void~) main::$0
Eliminating unused variable - keeping the call (void~) menu::$0 Eliminating unused variable - keeping the call (void~) menu::$0
Eliminating unused variable (byte) a and assignment [6] (byte) a ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable a(null) and assignment [12] a(null) ← *((byte*) B)
Removing empty block main::@4 Removing empty block main::@4
Removing empty block main::@3 Removing empty block main::@3
Removing empty block main::@5 Removing empty block main::@5
@ -163,11 +165,9 @@ Removing empty block menu::@7
Removing empty block mode::@5 Removing empty block mode::@5
Removing empty block mode::@3 Removing empty block mode::@3
Removing empty block mode::@6 Removing empty block mode::@6
Removing empty block mode::@7
Removing empty block mode::@8 Removing empty block mode::@8
PROCEDURE MODIFY VARIABLE ANALYSIS PROCEDURE MODIFY VARIABLE ANALYSIS
main modifies a
menu modifies a
mode modifies a
Completing Phi functions... Completing Phi functions...
Completing Phi functions... Completing Phi functions...
@ -184,93 +184,65 @@ CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from @begin: scope:[] from
to:@2 to:@2
main: scope:[main] from @3 main: scope:[main] from @3
(byte*) B#11 ← phi( @3/(byte*) B#13 ) (byte*) B#10 ← phi( @3/(byte*) B#12 )
(byte) a#20 ← phi( @3/(byte) a#19 )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@7 main::@1: scope:[main] from main main::@7
(byte*) B#10 ← phi( main/(byte*) B#11 main::@7/(byte*) B#12 ) (byte*) B#9 ← phi( main/(byte*) B#10 main::@7/(byte*) B#11 )
(byte) a#15 ← phi( main/(byte) a#20 main::@7/(byte) a#0 )
if(true) goto main::@2 if(true) goto main::@2
to:main::@return to:main::@return
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
(byte*) B#9 ← phi( main::@1/(byte*) B#10 ) (byte*) B#8 ← phi( main::@1/(byte*) B#9 )
(byte) a#14 ← phi( main::@1/(byte) a#15 )
call menu call menu
to:main::@7 to:main::@7
main::@7: scope:[main] from main::@2 main::@7: scope:[main] from main::@2
(byte*) B#12 ← phi( main::@2/(byte*) B#9 ) (byte*) B#11 ← phi( main::@2/(byte*) B#8 )
(byte) a#8 ← phi( main::@2/(byte) a#3 )
(byte) a#0 ← (byte) a#8
to:main::@1 to:main::@1
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
(byte) a#9 ← phi( main::@1/(byte) a#15 )
(byte) a#1 ← (byte) a#9
return return
to:@return to:@return
menu: scope:[menu] from main::@2 menu: scope:[menu] from main::@2
(byte*) B#8 ← phi( main::@2/(byte*) B#9 ) (byte*) B#7 ← phi( main::@2/(byte*) B#8 )
(byte) a#21 ← phi( main::@2/(byte) a#14 )
to:menu::@1 to:menu::@1
menu::@1: scope:[menu] from menu menu::@1: scope:[menu] from menu
(byte*) B#7 ← phi( menu/(byte*) B#8 ) (byte*) B#6 ← phi( menu/(byte*) B#7 )
(byte) a#17 ← phi( menu/(byte) a#21 )
if(true) goto menu::@2 if(true) goto menu::@2
to:menu::@return to:menu::@return
menu::@2: scope:[menu] from menu::@1 menu::@2: scope:[menu] from menu::@1
(byte*) B#6 ← phi( menu::@1/(byte*) B#7 ) (byte*) B#5 ← phi( menu::@1/(byte*) B#6 )
(byte) a#16 ← phi( menu::@1/(byte) a#17 )
call mode call mode
to:menu::@8 to:menu::@8
menu::@8: scope:[menu] from menu::@2 menu::@8: scope:[menu] from menu::@2
(byte) a#10 ← phi( menu::@2/(byte) a#6 )
(byte) a#2 ← (byte) a#10
to:menu::@return to:menu::@return
menu::@return: scope:[menu] from menu::@1 menu::@8 menu::@return: scope:[menu] from menu::@1 menu::@8
(byte) a#11 ← phi( menu::@1/(byte) a#17 menu::@8/(byte) a#2 )
(byte) a#3 ← (byte) a#11
return return
to:@return to:@return
@2: scope:[] from @begin @2: scope:[] from @begin
(byte) a#4 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte*) B#0 ← ((byte*)) (word/signed word/dword/signed dword) 4096 (byte*) B#0 ← ((byte*)) (word/signed word/dword/signed dword) 4096
to:@3 to:@3
mode: scope:[mode] from menu::@2 mode: scope:[mode] from menu::@2
(byte) a#22 ← phi( menu::@2/(byte) a#16 ) (byte*) B#3 ← phi( menu::@2/(byte*) B#5 )
(byte*) B#4 ← phi( menu::@2/(byte*) B#6 )
to:mode::@1 to:mode::@1
mode::@1: scope:[mode] from mode mode::@4 mode::@7 mode::@1: scope:[mode] from mode mode::@2 mode::@4
(byte) a#18 ← phi( mode/(byte) a#22 mode::@4/(byte) a#23 mode::@7/(byte) a#5 ) (byte*) B#2 ← phi( mode/(byte*) B#3 mode::@2/(byte*) B#1 mode::@4/(byte*) B#4 )
(byte*) B#3 ← phi( mode/(byte*) B#4 mode::@4/(byte*) B#5 mode::@7/(byte*) B#2 )
if(true) goto mode::@2 if(true) goto mode::@2
to:mode::@return to:mode::@return
mode::@2: scope:[mode] from mode::@1 mode::@2: scope:[mode] from mode::@1
(byte) a#24 ← phi( mode::@1/(byte) a#18 ) (byte*) B#1 ← phi( mode::@1/(byte*) B#2 )
(byte*) B#1 ← phi( mode::@1/(byte*) B#3 )
(bool~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0 (bool~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) mode::$1 ← ! (bool~) mode::$0 (bool~) mode::$1 ← ! (bool~) mode::$0
if((bool~) mode::$1) goto mode::@4 if((bool~) mode::$1) goto mode::@4
to:mode::@7
mode::@4: scope:[mode] from mode::@2
(byte) a#23 ← phi( mode::@2/(byte) a#24 )
(byte*) B#5 ← phi( mode::@2/(byte*) B#1 )
to:mode::@1 to:mode::@1
mode::@7: scope:[mode] from mode::@2 mode::@4: scope:[mode] from mode::@2
(byte*) B#2 ← phi( mode::@2/(byte*) B#1 ) (byte*) B#4 ← phi( mode::@2/(byte*) B#1 )
(byte) a#5 ← *((byte*) B#2)
to:mode::@1 to:mode::@1
mode::@return: scope:[mode] from mode::@1 mode::@return: scope:[mode] from mode::@1
(byte) a#12 ← phi( mode::@1/(byte) a#18 )
(byte) a#6 ← (byte) a#12
return return
to:@return to:@return
@3: scope:[] from @2 @3: scope:[] from @2
(byte*) B#13 ← phi( @2/(byte*) B#0 ) (byte*) B#12 ← phi( @2/(byte*) B#0 )
(byte) a#19 ← phi( @2/(byte) a#4 )
call main call main
to:@4 to:@4
@4: scope:[] from @3 @4: scope:[] from @3
(byte) a#13 ← phi( @3/(byte) a#1 )
(byte) a#7 ← (byte) a#13
to:@end to:@end
@end: scope:[] from @4 @end: scope:[] from @4
@ -286,7 +258,6 @@ SYMBOL TABLE SSA
(byte*) B#10 (byte*) B#10
(byte*) B#11 (byte*) B#11
(byte*) B#12 (byte*) B#12
(byte*) B#13
(byte*) B#2 (byte*) B#2
(byte*) B#3 (byte*) B#3
(byte*) B#4 (byte*) B#4
@ -295,32 +266,6 @@ SYMBOL TABLE SSA
(byte*) B#7 (byte*) B#7
(byte*) B#8 (byte*) B#8
(byte*) B#9 (byte*) B#9
(byte) a
(byte) a#0
(byte) a#1
(byte) a#10
(byte) a#11
(byte) a#12
(byte) a#13
(byte) a#14
(byte) a#15
(byte) a#16
(byte) a#17
(byte) a#18
(byte) a#19
(byte) a#2
(byte) a#20
(byte) a#21
(byte) a#22
(byte) a#23
(byte) a#24
(byte) a#3
(byte) a#4
(byte) a#5
(byte) a#6
(byte) a#7
(byte) a#8
(byte) a#9
(void()) main() (void()) main()
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
@ -337,116 +282,58 @@ SYMBOL TABLE SSA
(label) mode::@1 (label) mode::@1
(label) mode::@2 (label) mode::@2
(label) mode::@4 (label) mode::@4
(label) mode::@7
(label) mode::@return (label) mode::@return
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) menu::@8
Culled Empty Block (label) @4
Succesful SSA optimization Pass2CullEmptyBlocks
Inversing boolean not (bool~) mode::$1 ← *((byte*) B#1) != (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0 Inversing boolean not (bool~) mode::$1 ← *((byte*) B#1) != (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2UnaryNotSimplification Succesful SSA optimization Pass2UnaryNotSimplification
Not aliassing across scopes: a#20 a#19 Not aliassing across scopes: B#10 B#12
Not aliassing across scopes: B#11 B#13 Not aliassing across scopes: B#7 B#8
Not aliassing across scopes: a#8 a#3 Not aliassing across scopes: B#3 B#5
Not aliassing across scopes: a#21 a#14 Alias (byte*) B#11 = (byte*) B#8 (byte*) B#9
Not aliassing across scopes: B#8 B#9 Alias (byte*) B#5 = (byte*) B#6 (byte*) B#7
Not aliassing across scopes: a#10 a#6 Alias (byte*) B#1 = (byte*) B#2 (byte*) B#4
Not aliassing across scopes: B#4 B#6 Alias (byte*) B#0 = (byte*) B#12
Not aliassing across scopes: a#22 a#16
Not aliassing across scopes: a#13 a#1
Alias (byte) a#1 = (byte) a#14 (byte) a#15 (byte) a#9
Alias (byte*) B#10 = (byte*) B#9 (byte*) B#12
Alias (byte) a#0 = (byte) a#8
Alias (byte) a#16 = (byte) a#17 (byte) a#21
Alias (byte*) B#6 = (byte*) B#7 (byte*) B#8
Alias (byte) a#10 = (byte) a#2
Alias (byte) a#11 = (byte) a#3
Alias (byte*) B#1 = (byte*) B#3 (byte*) B#5 (byte*) B#2
Alias (byte) a#12 = (byte) a#24 (byte) a#18 (byte) a#23 (byte) a#6
Alias (byte) a#19 = (byte) a#4
Alias (byte*) B#0 = (byte*) B#13
Alias (byte) a#13 = (byte) a#7
Succesful SSA optimization Pass2AliasElimination Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: a#20 a#19 Not aliassing across scopes: B#10 B#0
Not aliassing across scopes: B#11 B#0 Not aliassing across scopes: B#5 B#11
Not aliassing across scopes: a#0 a#11 Not aliassing across scopes: B#3 B#5
Not aliassing across scopes: a#16 a#1 Self Phi Eliminated (byte*) B#11
Not aliassing across scopes: B#6 B#10
Not aliassing across scopes: a#10 a#12
Not aliassing across scopes: B#4 B#6
Not aliassing across scopes: a#22 a#16
Not aliassing across scopes: a#13 a#1
Self Phi Eliminated (byte*) B#10
Self Phi Eliminated (byte*) B#1 Self Phi Eliminated (byte*) B#1
Self Phi Eliminated (byte*) B#1 Self Phi Eliminated (byte*) B#1
Self Phi Eliminated (byte) a#12
Succesful SSA optimization Pass2SelfPhiElimination Succesful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte) a#20 (byte) a#19 Redundant Phi (byte*) B#10 (byte*) B#0
Redundant Phi (byte*) B#11 (byte*) B#0 Redundant Phi (byte*) B#11 (byte*) B#10
Redundant Phi (byte*) B#10 (byte*) B#11 Redundant Phi (byte*) B#5 (byte*) B#11
Redundant Phi (byte) a#0 (byte) a#11 Redundant Phi (byte*) B#3 (byte*) B#5
Redundant Phi (byte) a#16 (byte) a#1 Redundant Phi (byte*) B#1 (byte*) B#3
Redundant Phi (byte*) B#6 (byte*) B#10
Redundant Phi (byte) a#10 (byte) a#12
Redundant Phi (byte*) B#4 (byte*) B#6
Redundant Phi (byte) a#22 (byte) a#16
Redundant Phi (byte*) B#1 (byte*) B#4
Redundant Phi (byte) a#13 (byte) a#1
Succesful SSA optimization Pass2RedundantPhiElimination Succesful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) mode::$1 if(*((byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 Simple Condition (bool~) mode::$1 if(*((byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4
Succesful SSA optimization Pass2ConditionalJumpSimplification Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) a#19 = 0
Constant (const byte*) B#0 = ((byte*))4096 Constant (const byte*) B#0 = ((byte*))4096
Succesful SSA optimization Pass2ConstantIdentification Succesful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination if(true) goto main::@2 if() condition always true - replacing block destination if(true) goto main::@2
Removing PHI-reference to removed block (menu::@1) in block menu::@return
if() condition always true - replacing block destination if(true) goto menu::@2 if() condition always true - replacing block destination if(true) goto menu::@2
if() condition always true - replacing block destination if(true) goto mode::@2 if() condition always true - replacing block destination if(true) goto mode::@2
Succesful SSA optimization Pass2ConstantIfs Succesful SSA optimization Pass2ConstantIfs
Removing unused block main::@return Removing unused block main::@return
Removing unused block mode::@return Removing unused block mode::@return
Succesful SSA optimization Pass2EliminateUnusedBlocks Succesful SSA optimization Pass2EliminateUnusedBlocks
Culled Empty Block (label) main::@1
Culled Empty Block (label) main::@7 Culled Empty Block (label) main::@7
Culled Empty Block (label) menu::@1 Culled Empty Block (label) menu::@1
Culled Empty Block (label) menu::@8
Culled Empty Block (label) @2 Culled Empty Block (label) @2
Culled Empty Block (label) mode::@4 Culled Empty Block (label) mode::@1
Culled Empty Block (label) @4 Not culling empty block because it shares successor with its predecessor. (label) mode::@4
Succesful SSA optimization Pass2CullEmptyBlocks Succesful SSA optimization Pass2CullEmptyBlocks
Not aliassing across scopes: a#11 a#12 Not culling empty block because it shares successor with its predecessor. (label) mode::@4
Not aliassing across scopes: a#12 a#1 Not culling empty block because it shares successor with its predecessor. (label) mode::@4
Redundant Phi (byte) a#11 (byte) a#12
Succesful SSA optimization Pass2RedundantPhiElimination
Not aliassing across scopes: a#12 a#1
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) a#19 Block Sequence Planned @begin @3 @end main main::@2 menu menu::@2 menu::@return mode mode::@2 mode::@4
Inlining constant with var siblings (const byte) a#19 Block Sequence Planned @begin @3 @end main main::@2 menu menu::@2 menu::@return mode mode::@2 mode::@4
Inlining constant with var siblings (const byte) a#19
Constant inlined a#19 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2
CALL GRAPH
Calls in [] to main:2
Calls in [main] to menu:7
Calls in [menu] to mode:11
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced [8] a#25 ← a#12
Coalesced (already) [13] a#26 ← a#1
Coalesced [17] a#27 ← a#5
Coalesced down to 1 phi equivalence classes
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3 Adding NOP phi() at start of @3
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
@ -455,11 +342,26 @@ Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2 Adding NOP phi() at start of menu::@2
Adding NOP phi() at start of mode Adding NOP phi() at start of mode
Adding NOP phi() at start of mode::@4
CALL GRAPH
Calls in [] to main:2
Calls in [main] to menu:6
Calls in [menu] to mode:9
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Created 0 initial phi equivalence classes
Propagating live ranges... Coalesced down to 0 phi equivalence classes
Propagating live ranges... Not culling empty block because it shares successor with its predecessor. (label) mode::@4
Propagating live ranges... Block Sequence Planned @begin @3 @end main main::@2 menu menu::@2 menu::@return mode mode::@2 mode::@4
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2
Adding NOP phi() at start of mode
Adding NOP phi() at start of mode::@4
Propagating live ranges... Propagating live ranges...
FINAL CONTROL FLOW GRAPH FINAL CONTROL FLOW GRAPH
@ -474,91 +376,76 @@ FINAL CONTROL FLOW GRAPH
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @3 main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) a#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(byte) a#12 ) [ a#1 ] ( main:2 [ a#1 ] )
to:main::@2 to:main::@2
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main main::@2
[6] phi() [ a#1 ] ( main:2 [ a#1 ] ) [5] phi() [ ] ( main:2 [ ] )
[7] call menu [ a#12 ] ( main:2 [ a#12 ] ) [6] call menu [ ] ( main:2 [ ] )
to:main::@1 to:main::@2
menu: scope:[menu] from main::@2 menu: scope:[menu] from main::@2
[8] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] ) [7] phi() [ ] ( main:2::menu:6 [ ] )
to:menu::@2 to:menu::@2
menu::@2: scope:[menu] from menu menu::@2: scope:[menu] from menu
[9] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] ) [8] phi() [ ] ( main:2::menu:6 [ ] )
[10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] ) [9] call mode [ ] ( main:2::menu:6 [ ] )
to:menu::@return to:menu::@return
menu::@return: scope:[menu] from menu::@2 menu::@return: scope:[menu] from menu::@2
[11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] ) [10] return [ ] ( main:2::menu:6 [ ] )
to:@return to:@return
mode: scope:[mode] from menu::@2 mode: scope:[mode] from menu::@2
[12] phi() [ a#1 ] ( main:2::menu:7::mode:10 [ a#1 ] ) [11] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@1 to:mode::@2
mode::@1: scope:[mode] from mode mode::@2 mode::@7 mode::@2: scope:[mode] from mode mode::@2 mode::@4
[13] (byte) a#12 ← phi( mode/(byte) a#1 mode::@7/(byte) a#5 ) [ ] ( main:2::menu:7::mode:10 [ ] ) [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@4: scope:[mode] from mode::@2
[13] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2 to:mode::@2
mode::@2: scope:[mode] from mode::@1
[14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@7
mode::@7: scope:[mode] from mode::@2
[15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] )
to:mode::@1
DOMINATORS DOMINATORS
@begin dominated by @begin @begin dominated by @begin
@3 dominated by @begin @3 @3 dominated by @begin @3
@end dominated by @begin @end @3 @end dominated by @begin @3 @end
main dominated by @begin main @3 main dominated by @begin @3 main
main::@1 dominated by @begin main @3 main::@1 main::@2 dominated by @begin @3 main::@2 main
main::@2 dominated by @begin main @3 main::@1 main::@2 menu dominated by @begin @3 main::@2 main menu
menu dominated by @begin main menu @3 main::@1 main::@2 menu::@2 dominated by @begin @3 menu::@2 main::@2 main menu
menu::@2 dominated by @begin menu::@2 main menu @3 main::@1 main::@2 menu::@return dominated by @begin @3 menu::@return menu::@2 main::@2 main menu
menu::@return dominated by @begin menu::@return menu::@2 main menu @3 main::@1 main::@2 mode dominated by mode @begin @3 menu::@2 main::@2 main menu
mode dominated by @begin menu::@2 main menu mode @3 main::@1 main::@2 mode::@2 dominated by mode @begin @3 menu::@2 mode::@2 main::@2 main menu
mode::@1 dominated by @begin menu::@2 main menu mode @3 mode::@1 main::@1 main::@2 mode::@4 dominated by mode @begin @3 mode::@4 menu::@2 mode::@2 main::@2 main menu
mode::@2 dominated by @begin menu::@2 main menu mode @3 mode::@1 mode::@2 main::@1 main::@2
mode::@7 dominated by @begin menu::@2 main menu mode @3 mode::@1 mode::@2 main::@1 mode::@7 main::@2
NATURAL LOOPS NATURAL LOOPS
Found back edge: Loop head: main::@1 tails: main::@2 blocks: null Found back edge: Loop head: main::@2 tails: main::@2 blocks: null
Found back edge: Loop head: mode::@1 tails: mode::@2 blocks: null Found back edge: Loop head: mode::@2 tails: mode::@2 blocks: null
Found back edge: Loop head: mode::@1 tails: mode::@7 blocks: null Found back edge: Loop head: mode::@2 tails: mode::@4 blocks: null
Populated: Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 Populated: Loop head: main::@2 tails: main::@2 blocks: main::@2
Populated: Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1 Populated: Loop head: mode::@2 tails: mode::@2 blocks: mode::@2
Populated: Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1 Populated: Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 Loop head: main::@2 tails: main::@2 blocks: main::@2
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1 Loop head: mode::@2 tails: mode::@2 blocks: mode::@2
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1 Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2
NATURAL LOOPS WITH DEPTH NATURAL LOOPS WITH DEPTH
Found 0 loops in scope [] Found 0 loops in scope []
Found 1 loops in scope [main] Found 1 loops in scope [main]
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 Loop head: main::@2 tails: main::@2 blocks: main::@2
Found 0 loops in scope [menu] Found 0 loops in scope [menu]
Found 2 loops in scope [mode] Found 2 loops in scope [mode]
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1 Loop head: mode::@2 tails: mode::@2 blocks: mode::@2
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1 Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 depth: 1 Loop head: main::@2 tails: main::@2 blocks: main::@2 depth: 1
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1 depth: 3 Loop head: mode::@2 tails: mode::@2 blocks: mode::@2 depth: 3
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1 depth: 2 Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2 depth: 2
VARIABLE REGISTER WEIGHTS VARIABLE REGISTER WEIGHTS
(byte*) B (byte*) B
(byte) a
(byte) a#1 2.6
(byte) a#12 38.0
(byte) a#5 202.0
(void()) main() (void()) main()
(void()) menu() (void()) menu()
(void()) mode() (void()) mode()
Initial phi equivalence classes Initial phi equivalence classes
[ a#1 a#12 a#5 ]
Complete equivalence classes Complete equivalence classes
[ a#1 a#12 a#5 ]
Allocated zp ZP_BYTE:2 [ a#1 a#12 a#5 ]
INITIAL ASM INITIAL ASM
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -567,7 +454,6 @@ INITIAL ASM
.pc = $80d "Program" .pc = $80d "Program"
//SEG1 Global Constants & labels //SEG1 Global Constants & labels
.label B = $1000 .label B = $1000
.label a = 2
//SEG2 @begin //SEG2 @begin
bbegin: bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3] //SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
@ -586,87 +472,66 @@ bend_from_b3:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main main::@2 to main::@2 [phi:main/main::@2->main::@2]
b1_from_main: b2_from_main:
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 b2_from_b2:
lda #0
sta a
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2 jmp b2
//SEG14 main::@2 //SEG11 main::@2
b2: b2:
//SEG15 [7] call menu [ a#12 ] ( main:2 [ a#12 ] ) //SEG12 [6] call menu [ ] ( main:2 [ ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu] //SEG13 [7] phi from main::@2 to menu [phi:main::@2->menu]
menu_from_b2: menu_from_b2:
jsr menu jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1] jmp b2_from_b2
b1_from_b2:
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
} }
//SEG19 menu //SEG14 menu
menu: { menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2] //SEG15 [8] phi from menu to menu::@2 [phi:menu->menu::@2]
b2_from_menu: b2_from_menu:
jmp b2 jmp b2
//SEG21 menu::@2 //SEG16 menu::@2
b2: b2:
//SEG22 [10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] ) //SEG17 [9] call mode [ ] ( main:2::menu:6 [ ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode] //SEG18 [11] phi from menu::@2 to mode [phi:menu::@2->mode]
mode_from_b2: mode_from_b2:
jsr mode jsr mode
jmp breturn jmp breturn
//SEG24 menu::@return //SEG19 menu::@return
breturn: breturn:
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] ) //SEG20 [10] return [ ] ( main:2::menu:6 [ ] )
rts rts
} }
//SEG26 mode //SEG21 mode
mode: { mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
b1_from_mode:
b1_from_b7:
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
jmp b1
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
b1_from_b2:
jmp b1
//SEG30 mode::@1
b1:
jmp b2 jmp b2
//SEG31 mode::@2 //SEG22 mode::@2
b2: b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1 //SEG23 [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B lda B
cmp #0 cmp #0
bne b1_from_b2 bne b4_from_b2
jmp b7 jmp b2
//SEG33 mode::@7 //SEG24 [13] phi from mode::@2 to mode::@4 [phi:mode::@2->mode::@4]
b7: b4_from_b2:
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuz1=_deref_pbuc1 jmp b4
lda B //SEG25 mode::@4
sta a b4:
jmp b1_from_b7 jmp b2
} }
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Statement [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) always clobbers reg byte a Statement [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ a#1 a#12 a#5 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [] 242.6: zp ZP_BYTE:2 [ a#1 a#12 a#5 ]
Uplift Scope [main] Uplift Scope [main]
Uplift Scope [menu] Uplift Scope [menu]
Uplift Scope [mode] Uplift Scope [mode]
Uplift Scope []
Uplifting [] best 18376 combination reg byte a [ a#1 a#12 a#5 ] Uplifting [main] best 11929 combination
Uplifting [main] best 18376 combination Uplifting [menu] best 11929 combination
Uplifting [menu] best 18376 combination Uplifting [mode] best 11929 combination
Uplifting [mode] best 18376 combination Uplifting [] best 11929 combination
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -693,116 +558,86 @@ bend_from_b3:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main main::@2 to main::@2 [phi:main/main::@2->main::@2]
b1_from_main: b2_from_main:
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1 b2_from_b2:
lda #0
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2 jmp b2
//SEG14 main::@2 //SEG11 main::@2
b2: b2:
//SEG15 [7] call menu [ a#12 ] ( main:2 [ a#12 ] ) //SEG12 [6] call menu [ ] ( main:2 [ ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu] //SEG13 [7] phi from main::@2 to menu [phi:main::@2->menu]
menu_from_b2: menu_from_b2:
jsr menu jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1] jmp b2_from_b2
b1_from_b2:
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
} }
//SEG19 menu //SEG14 menu
menu: { menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2] //SEG15 [8] phi from menu to menu::@2 [phi:menu->menu::@2]
b2_from_menu: b2_from_menu:
jmp b2 jmp b2
//SEG21 menu::@2 //SEG16 menu::@2
b2: b2:
//SEG22 [10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] ) //SEG17 [9] call mode [ ] ( main:2::menu:6 [ ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode] //SEG18 [11] phi from menu::@2 to mode [phi:menu::@2->mode]
mode_from_b2: mode_from_b2:
jsr mode jsr mode
jmp breturn jmp breturn
//SEG24 menu::@return //SEG19 menu::@return
breturn: breturn:
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] ) //SEG20 [10] return [ ] ( main:2::menu:6 [ ] )
rts rts
} }
//SEG26 mode //SEG21 mode
mode: { mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
b1_from_mode:
b1_from_b7:
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
jmp b1
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
b1_from_b2:
jmp b1
//SEG30 mode::@1
b1:
jmp b2 jmp b2
//SEG31 mode::@2 //SEG22 mode::@2
b2: b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1 //SEG23 [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B lda B
cmp #0 cmp #0
bne b1_from_b2 bne b4_from_b2
jmp b7 jmp b2
//SEG33 mode::@7 //SEG24 [13] phi from mode::@2 to mode::@4 [phi:mode::@2->mode::@4]
b7: b4_from_b2:
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuaa=_deref_pbuc1 jmp b4
lda B //SEG25 mode::@4
jmp b1_from_b7 b4:
jmp b2
} }
ASSEMBLER OPTIMIZATIONS ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b3 Removing instruction jmp b3
Removing instruction jmp bend Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp b2 Removing instruction jmp b2
Removing instruction jmp b2 Removing instruction jmp b2
Removing instruction jmp breturn Removing instruction jmp breturn
Removing instruction jmp b1
Removing instruction jmp b2 Removing instruction jmp b2
Removing instruction jmp b7 Removing instruction jmp b4
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1 with b2 Replacing label b2_from_b2 with b2
Replacing label b1 with b2 Replacing label b4_from_b2 with b4
Replacing label b1_from_b2 with b2
Removing instruction bbegin: Removing instruction bbegin:
Removing instruction b3_from_bbegin: Removing instruction b3_from_bbegin:
Removing instruction main_from_b3: Removing instruction main_from_b3:
Removing instruction bend_from_b3: Removing instruction bend_from_b3:
Removing instruction b1: Removing instruction b2_from_main:
Removing instruction b2_from_b1: Removing instruction b2_from_b2:
Removing instruction menu_from_b2: Removing instruction menu_from_b2:
Removing instruction b2_from_menu: Removing instruction b2_from_menu:
Removing instruction mode_from_b2: Removing instruction mode_from_b2:
Removing instruction b1_from_mode: Removing instruction b4_from_b2:
Removing instruction b1_from_b2:
Removing instruction b1:
Succesful ASM optimization Pass5RedundantLabelElimination Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b3: Removing instruction b3:
Removing instruction bend: Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction b1_from_b2:
Removing instruction b2: Removing instruction b2:
Removing instruction breturn: Removing instruction breturn:
Removing instruction b7:
Succesful ASM optimization Pass5UnusedLabelElimination Succesful ASM optimization Pass5UnusedLabelElimination
Skipping double jump to b2 in jmp b1_from_b7 Skipping double jump to b2 in bne b4
Succesful ASM optimization Pass5DoubleJumpElimination Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label b1_from_b7 to b1 Removing instruction b4:
Succesful ASM optimization Pass5RelabelLongLabels Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp b2 Removing unreachable instruction jmp b2
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5UnreachableCodeElimination
Removing instruction lda B
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction b1:
Succesful ASM optimization Pass5RedundantLabelElimination
FINAL SYMBOL TABLE FINAL SYMBOL TABLE
(label) @3 (label) @3
@ -810,26 +645,19 @@ FINAL SYMBOL TABLE
(label) @end (label) @end
(byte*) B (byte*) B
(const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096 (const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096
(byte) a
(byte) a#1 reg byte a 2.6
(byte) a#12 reg byte a 38.0
(byte) a#5 reg byte a 202.0
(void()) main() (void()) main()
(label) main::@1
(label) main::@2 (label) main::@2
(void()) menu() (void()) menu()
(label) menu::@2 (label) menu::@2
(label) menu::@return (label) menu::@return
(void()) mode() (void()) mode()
(label) mode::@1
(label) mode::@2 (label) mode::@2
(label) mode::@7 (label) mode::@4
reg byte a [ a#1 a#12 a#5 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 8874 Score: 11527
//SEG0 Basic Upstart //SEG0 Basic Upstart
.pc = $801 "Basic" .pc = $801 "Basic"
@ -847,45 +675,35 @@ Score: 8874
//SEG8 @end //SEG8 @end
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main main::@2 to main::@2 [phi:main/main::@2->main::@2]
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1 //SEG11 main::@2
lda #0
//SEG12 main::@1
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG14 main::@2
b2: b2:
//SEG15 [7] call menu [ a#12 ] ( main:2 [ a#12 ] ) //SEG12 [6] call menu [ ] ( main:2 [ ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu] //SEG13 [7] phi from main::@2 to menu [phi:main::@2->menu]
jsr menu jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b2 jmp b2
} }
//SEG19 menu //SEG14 menu
menu: { menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2] //SEG15 [8] phi from menu to menu::@2 [phi:menu->menu::@2]
//SEG21 menu::@2 //SEG16 menu::@2
//SEG22 [10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] ) //SEG17 [9] call mode [ ] ( main:2::menu:6 [ ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode] //SEG18 [11] phi from menu::@2 to mode [phi:menu::@2->mode]
jsr mode jsr mode
//SEG24 menu::@return //SEG19 menu::@return
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] ) //SEG20 [10] return [ ] ( main:2::menu:6 [ ] )
rts rts
} }
//SEG26 mode //SEG21 mode
mode: { mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1] //SEG22 mode::@2
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
//SEG30 mode::@1
//SEG31 mode::@2
b2: b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1 //SEG23 [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B lda B
cmp #0 cmp #0
bne b2 bne b2
//SEG33 mode::@7
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuaa=_deref_pbuc1
jmp b2 jmp b2
//SEG24 [13] phi from mode::@2 to mode::@4 [phi:mode::@2->mode::@4]
//SEG25 mode::@4
} }

View File

@ -3,19 +3,12 @@
(label) @end (label) @end
(byte*) B (byte*) B
(const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096 (const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096
(byte) a
(byte) a#1 reg byte a 2.6
(byte) a#12 reg byte a 38.0
(byte) a#5 reg byte a 202.0
(void()) main() (void()) main()
(label) main::@1
(label) main::@2 (label) main::@2
(void()) menu() (void()) menu()
(label) menu::@2 (label) menu::@2
(label) menu::@return (label) menu::@return
(void()) mode() (void()) mode()
(label) mode::@1
(label) mode::@2 (label) mode::@2
(label) mode::@7 (label) mode::@4
reg byte a [ a#1 a#12 a#5 ]

View File

@ -4,10 +4,10 @@
jsr main jsr main
main: { main: {
.label w = 2 .label w = 2
lda #<0 ldx #0
txa
sta w sta w
sta w+1 sta w+1
tax
b1: b1:
txa txa
clc clc

View File

@ -11,11 +11,11 @@ main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1 main::@1: scope:[main] from main main::@1
[5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] ) [5] (byte) main::j#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[5] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] ) [5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] )
[7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
to:main::@return to:main::@return
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
[9] return [ ] ( main:2 [ ] ) [9] return [ ] ( main:2 [ ] )

View File

@ -50,6 +50,8 @@ main::@return: scope:[main] from main::@2
to:@end to:@end
@end: scope:[] from @1 @end: scope:[] from @1
Eliminating unused variable (byte) main::i and assignment [0] (byte) main::i ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable main::i(null) and assignment [4] main::i(null) ← (byte) main::j
Removing empty block main::@2 Removing empty block main::@2
PROCEDURE MODIFY VARIABLE ANALYSIS PROCEDURE MODIFY VARIABLE ANALYSIS
@ -59,15 +61,13 @@ CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from @begin: scope:[] from
to:@1 to:@1
main: scope:[main] from @1 main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte/signed byte/word/signed word/dword/signed dword~) main::$0 ← ((word)) (byte/signed byte/word/signed word/dword/signed dword) 0 (byte/signed byte/word/signed word/dword/signed dword~) main::$0 ← ((word)) (byte/signed byte/word/signed word/dword/signed dword) 0
(word) main::w#0 ← (byte/signed byte/word/signed word/dword/signed dword~) main::$0 (word) main::w#0 ← (byte/signed byte/word/signed word/dword/signed dword~) main::$0
(byte) main::j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 (byte) main::j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1 main::@1: scope:[main] from main main::@1
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
(byte) main::j#2 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 ) (byte) main::j#2 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 )
(byte) main::i#1 ← (byte) main::j#2 (word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
(word~) main::$1 ← (word) main::w#2 + (byte) main::j#2 (word~) main::$1 ← (word) main::w#2 + (byte) main::j#2
(word) main::w#1 ← (word~) main::$1 (word) main::w#1 ← (word~) main::$1
(byte) main::j#1 ← (byte) main::j#2 + rangenext(0,10) (byte) main::j#1 ← (byte) main::j#2 + rangenext(0,10)
@ -95,9 +95,6 @@ SYMBOL TABLE SSA
(bool~) main::$2 (bool~) main::$2
(label) main::@1 (label) main::@1
(label) main::@return (label) main::@return
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::j (byte) main::j
(byte) main::j#0 (byte) main::j#0
(byte) main::j#1 (byte) main::j#1
@ -111,23 +108,20 @@ OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) @2 Culled Empty Block (label) @2
Succesful SSA optimization Pass2CullEmptyBlocks Succesful SSA optimization Pass2CullEmptyBlocks
Alias (word) main::w#0 = (byte/signed byte/word/signed word/dword/signed dword~) main::$0 Alias (word) main::w#0 = (byte/signed byte/word/signed word/dword/signed dword~) main::$0
Alias (byte) main::i#1 = (byte) main::j#2
Alias (word) main::w#1 = (word~) main::$1 Alias (word) main::w#1 = (word~) main::$1
Succesful SSA optimization Pass2AliasElimination Succesful SSA optimization Pass2AliasElimination
Simple Condition (bool~) main::$2 if((byte) main::j#1!=rangelast(0,10)) goto main::@1 Simple Condition (bool~) main::$2 if((byte) main::j#1!=rangelast(0,10)) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) main::i#0 = 0
Constant (const word) main::w#0 = ((word))0 Constant (const word) main::w#0 = ((word))0
Constant (const byte) main::j#0 = 0 Constant (const byte) main::j#0 = 0
Succesful SSA optimization Pass2ConstantIdentification Succesful SSA optimization Pass2ConstantIdentification
Eliminating unused constant (const byte) main::i#0 Resolved ranged next value main::j#1 ← ++ main::j#2 to ++
Succesful SSA optimization PassNEliminateUnusedVars
Resolved ranged next value main::j#1 ← ++ main::i#1 to ++
Resolved ranged comparison value if(main::j#1!=rangelast(0,10)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) 11 Resolved ranged comparison value if(main::j#1!=rangelast(0,10)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) 11
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const word) main::w#0 Inlining constant with var siblings (const word) main::w#0
Inlining constant with var siblings (const word) main::w#0 Inlining constant with var siblings (const word) main::w#0
Inlining constant with var siblings (const byte) main::j#0 Inlining constant with var siblings (const byte) main::j#0
Inlining constant with var siblings (const byte) main::j#0
Constant inlined main::w#0 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 Constant inlined main::w#0 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::j#0 = (byte/signed byte/word/signed word/dword/signed dword) 0 Constant inlined main::j#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining Succesful SSA optimization Pass2ConstantInlining
@ -145,10 +139,9 @@ Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes Created 2 initial phi equivalence classes
Coalesced [10] main::i#2 ← main::j#1 Coalesced [10] main::w#3 ← main::w#1
Coalesced [11] main::w#3 ← main::w#1 Coalesced [11] main::j#3 ← main::j#1
Coalesced down to 2 phi equivalence classes Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) main::@3 Culled Empty Block (label) main::@3
Block Sequence Planned @begin @1 @end main main::@1 main::@return Block Sequence Planned @begin @1 @end main main::@1 main::@return
@ -174,11 +167,11 @@ main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1 main::@1: scope:[main] from main main::@1
[5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] ) [5] (byte) main::j#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[5] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] ) [5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] )
[7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
to:main::@return to:main::@return
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
[9] return [ ] ( main:2 [ ] ) [9] return [ ] ( main:2 [ ] )
@ -206,22 +199,21 @@ Loop head: main::@1 tails: main::@1 blocks: main::@1 depth: 1
VARIABLE REGISTER WEIGHTS VARIABLE REGISTER WEIGHTS
(void()) main() (void()) main()
(byte) main::i
(byte) main::i#1 16.5
(byte) main::j (byte) main::j
(byte) main::j#1 16.5 (byte) main::j#1 16.5
(byte) main::j#2 16.5
(word) main::w (word) main::w
(word) main::w#1 7.333333333333333 (word) main::w#1 7.333333333333333
(word) main::w#2 22.0 (word) main::w#2 22.0
Initial phi equivalence classes Initial phi equivalence classes
[ main::i#1 main::j#1 ]
[ main::w#2 main::w#1 ] [ main::w#2 main::w#1 ]
[ main::j#2 main::j#1 ]
Complete equivalence classes Complete equivalence classes
[ main::i#1 main::j#1 ]
[ main::w#2 main::w#1 ] [ main::w#2 main::w#1 ]
Allocated zp ZP_BYTE:2 [ main::i#1 main::j#1 ] [ main::j#2 main::j#1 ]
Allocated zp ZP_WORD:3 [ main::w#2 main::w#1 ] Allocated zp ZP_WORD:2 [ main::w#2 main::w#1 ]
Allocated zp ZP_BYTE:4 [ main::j#2 main::j#1 ]
INITIAL ASM INITIAL ASM
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -247,38 +239,37 @@ bend_from_b1:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
.label i = 2 .label w = 2
.label w = 3 .label j = 4
.label j = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main: b1_from_main:
//SEG11 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vwuz1=vbuc1 //SEG11 [5] phi (byte) main::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta j
//SEG12 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vwuz1=vbuc1
lda #<0 lda #<0
sta w sta w
lda #>0 lda #>0
sta w+1 sta w+1
//SEG12 [5] phi (byte) main::i#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vbuz1=vbuc1
lda #0
sta i
jmp b1 jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1: b1_from_b1:
//SEG14 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy //SEG14 [5] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy //SEG15 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#1] -- register_copy
jmp b1 jmp b1
//SEG16 main::@1 //SEG16 main::@1
b1: b1:
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuz2 //SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuz2
lda i lda j
clc clc
adc w adc w
sta w sta w
lda #0 lda #0
adc w+1 adc w+1
sta w+1 sta w+1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuz1=_inc_vbuz1 //SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuz1=_inc_vbuz1
inc j inc j
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuz1_neq_vbuc1_then_la1 //SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda j lda j
cmp #$b cmp #$b
bne b1_from_b1 bne b1_from_b1
@ -290,19 +281,18 @@ main: {
} }
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) always clobbers reg byte a Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#1 main::j#1 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ main::j#2 main::j#1 ]
Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) always clobbers reg byte a Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#1 main::j#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y , Potential registers zp ZP_WORD:2 [ main::w#2 main::w#1 ] : zp ZP_WORD:2 ,
Potential registers zp ZP_WORD:3 [ main::w#2 main::w#1 ] : zp ZP_WORD:3 , Potential registers zp ZP_BYTE:4 [ main::j#2 main::j#1 ] : zp ZP_BYTE:4 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [main] 33: zp ZP_BYTE:2 [ main::i#1 main::j#1 ] 29.33: zp ZP_WORD:3 [ main::w#2 main::w#1 ] Uplift Scope [main] 33: zp ZP_BYTE:4 [ main::j#2 main::j#1 ] 29.33: zp ZP_WORD:2 [ main::w#2 main::w#1 ]
Uplift Scope [] Uplift Scope []
Uplifting [main] best 473 combination reg byte x [ main::i#1 main::j#1 ] zp ZP_WORD:3 [ main::w#2 main::w#1 ] Uplifting [main] best 473 combination reg byte x [ main::j#2 main::j#1 ] zp ZP_WORD:2 [ main::w#2 main::w#1 ]
Uplifting [] best 473 combination Uplifting [] best 473 combination
Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ main::w#2 main::w#1 ]
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -331,22 +321,22 @@ main: {
.label w = 2 .label w = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main: b1_from_main:
//SEG11 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vwuz1=vbuc1 //SEG11 [5] phi (byte) main::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
//SEG12 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vwuz1=vbuc1
lda #<0 lda #<0
sta w sta w
lda #>0 lda #>0
sta w+1 sta w+1
//SEG12 [5] phi (byte) main::i#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vbuxx=vbuc1
ldx #0
jmp b1 jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1: b1_from_b1:
//SEG14 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy //SEG14 [5] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy //SEG15 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#1] -- register_copy
jmp b1 jmp b1
//SEG16 main::@1 //SEG16 main::@1
b1: b1:
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx //SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx
txa txa
clc clc
adc w adc w
@ -354,9 +344,9 @@ main: {
lda #0 lda #0
adc w+1 adc w+1
sta w+1 sta w+1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx=_inc_vbuxx //SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx_neq_vbuc1_then_la1 //SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$b cpx #$b
bne b1_from_b1 bne b1_from_b1
jmp breturn jmp breturn
@ -372,8 +362,8 @@ Removing instruction jmp bend
Removing instruction jmp b1 Removing instruction jmp b1
Removing instruction jmp breturn Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5NextJumpElimination
Replacing instruction lda #<0 with TXA
Removing instruction lda #>0 Removing instruction lda #>0
Replacing instruction ldx #0 with TAX
Succesful ASM optimization Pass5UnnecesaryLoadElimination Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label b1_from_b1 with b1 Replacing label b1_from_b1 with b1
Removing instruction bbegin: Removing instruction bbegin:
@ -397,16 +387,15 @@ FINAL SYMBOL TABLE
(void()) main() (void()) main()
(label) main::@1 (label) main::@1
(label) main::@return (label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::j (byte) main::j
(byte) main::j#1 reg byte x 16.5 (byte) main::j#1 reg byte x 16.5
(byte) main::j#2 reg byte x 16.5
(word) main::w (word) main::w
(word) main::w#1 w zp ZP_WORD:2 7.333333333333333 (word) main::w#1 w zp ZP_WORD:2 7.333333333333333
(word) main::w#2 w zp ZP_WORD:2 22.0 (word) main::w#2 w zp ZP_WORD:2 22.0
reg byte x [ main::i#1 main::j#1 ]
zp ZP_WORD:2 [ main::w#2 main::w#1 ] zp ZP_WORD:2 [ main::w#2 main::w#1 ]
reg byte x [ main::j#2 main::j#1 ]
FINAL ASSEMBLER FINAL ASSEMBLER
@ -429,18 +418,18 @@ Score: 357
main: { main: {
.label w = 2 .label w = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vwuz1=vbuc1 //SEG11 [5] phi (byte) main::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
lda #<0 ldx #0
//SEG12 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vwuz1=vbuc1
txa
sta w sta w
sta w+1 sta w+1
//SEG12 [5] phi (byte) main::i#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vbuxx=vbuc1
tax
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
//SEG14 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy //SEG14 [5] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy //SEG15 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#1] -- register_copy
//SEG16 main::@1 //SEG16 main::@1
b1: b1:
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx //SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx
txa txa
clc clc
adc w adc w
@ -448,9 +437,9 @@ main: {
lda #0 lda #0
adc w+1 adc w+1
sta w+1 sta w+1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx=_inc_vbuxx //SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx_neq_vbuc1_then_la1 //SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$b cpx #$b
bne b1 bne b1
//SEG20 main::@return //SEG20 main::@return

View File

@ -4,13 +4,12 @@
(void()) main() (void()) main()
(label) main::@1 (label) main::@1
(label) main::@return (label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::j (byte) main::j
(byte) main::j#1 reg byte x 16.5 (byte) main::j#1 reg byte x 16.5
(byte) main::j#2 reg byte x 16.5
(word) main::w (word) main::w
(word) main::w#1 w zp ZP_WORD:2 7.333333333333333 (word) main::w#1 w zp ZP_WORD:2 7.333333333333333
(word) main::w#2 w zp ZP_WORD:2 22.0 (word) main::w#2 w zp ZP_WORD:2 22.0
reg byte x [ main::i#1 main::j#1 ]
zp ZP_WORD:2 [ main::w#2 main::w#1 ] zp ZP_WORD:2 [ main::w#2 main::w#1 ]
reg byte x [ main::j#2 main::j#1 ]

View File

@ -17,8 +17,6 @@
.label BITMAP = $a000 .label BITMAP = $a000
.label SCREEN = $8800 .label SCREEN = $8800
.const DELAY = 8 .const DELAY = 8
.label rem16s = 3
.label rem16u = 9
jsr main jsr main
main: { main: {
.const vicSelectGfxBank1_toDd001_return = 3^(>SCREEN)>>6 .const vicSelectGfxBank1_toDd001_return = 3^(>SCREEN)>>6
@ -40,11 +38,7 @@ main: {
jsr bitmap_init jsr bitmap_init
jsr bitmap_clear jsr bitmap_clear
jsr screen_fill jsr screen_fill
lda #<0 lda #0
sta rem16s
sta rem16s+1
sta rem16u
sta rem16u+1
sta i sta i
b1: b1:
jsr point_init jsr point_init
@ -72,10 +66,10 @@ main: {
jmp b5 jmp b5
} }
bitmap_plot: { bitmap_plot: {
.label _1 = $b .label _1 = 7
.label x = 5 .label x = 3
.label plotter = 7 .label plotter = 5
.label _3 = 7 .label _3 = 5
lda bitmap_plot_yhi,y lda bitmap_plot_yhi,y
sta _3+1 sta _3+1
lda bitmap_plot_ylo,y lda bitmap_plot_ylo,y
@ -102,20 +96,20 @@ bitmap_plot: {
rts rts
} }
point_init: { point_init: {
.label _4 = $e .label _4 = 7
.label _5 = 5 .label _5 = 3
.label _16 = 5 .label _16 = 3
.label _17 = 5 .label _17 = 3
.label _18 = 5 .label _18 = 3
.label point_idx = 2 .label point_idx = 2
.label point_idx1 = $d .label point_idx1 = $b
.label y_diff = $e .label y_diff = 7
.label abs16s1__2 = 5 .label abs16s1__2 = 3
.label abs16s1_return = 5 .label abs16s1_return = 3
.label abs16s2__2 = 7 .label abs16s2__2 = 5
.label abs16s2_return = 7 .label abs16s2_return = 5
.label x_stepf = 5 .label x_stepf = 5
.label x_diff = $b .label x_diff = 9
lda point_idx lda point_idx
lsr lsr
sta point_idx1 sta point_idx1
@ -216,10 +210,6 @@ point_init: {
lda #$10 lda #$10
sta x_add,y sta x_add,y
b4: b4:
lda y_diff
sta divr16s.rem
lda y_diff+1
sta divr16s.rem+1
jsr divr16s jsr divr16s
lda x_stepf+1 lda x_stepf+1
lsr lsr
@ -259,15 +249,15 @@ point_init: {
} }
divr16s: { divr16s: {
.const dividend = 0 .const dividend = 0
.label _7 = 9 .label _7 = 7
.label _11 = $b .label _11 = 9
.label resultu = 5 .label resultu = 5
.label return = 5 .label return = 5
.label divisor = $b .label divisor = 9
.label rem = 9 .label rem = 7
.label dividendu = 3 .label dividendu = 3
.label divisoru = $b .label divisoru = 9
.label remu = 9 .label remu = 7
lda rem+1 lda rem+1
bmi b1 bmi b1
lda #<dividend lda #<dividend
@ -281,16 +271,7 @@ divr16s: {
b4: b4:
jsr divr16u jsr divr16u
cpy #0 cpy #0
beq b19 beq breturn
sec
lda divr16u.rem
eor #$ff
adc #0
sta rem16s
lda divr16u.rem+1
eor #$ff
adc #0
sta rem16s+1
sec sec
lda return lda return
eor #$ff eor #$ff
@ -302,12 +283,6 @@ divr16s: {
sta return+1 sta return+1
breturn: breturn:
rts rts
b19:
lda divr16u.rem
sta rem16s
lda divr16u.rem+1
sta rem16s+1
jmp breturn
b3: b3:
sec sec
lda _11 lda _11
@ -340,11 +315,11 @@ divr16s: {
jmp b2 jmp b2
} }
divr16u: { divr16u: {
.label rem = 9 .label rem = 7
.label dividend = 3 .label dividend = 3
.label quotient = 5 .label quotient = 5
.label return = 5 .label return = 5
.label divisor = $b .label divisor = 9
ldx #0 ldx #0
txa txa
sta quotient sta quotient

View File

@ -38,21 +38,19 @@ main::@18: scope:[main] from main::@17
[17] call screen_fill [ ] ( main:2 [ ] ) [17] call screen_fill [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main::@18 main::@21 main::@1: scope:[main] from main::@18 main::@21
[18] (signed word) rem16s#15 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(signed word) rem16s#13 ) [ main::i#2 rem16u#21 rem16s#15 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 ] ) [18] (byte) main::i#2 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[18] (word) rem16u#21 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(word) rem16u#18 ) [ main::i#2 rem16u#21 rem16s#15 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 ] ) [19] (byte) point_init::point_idx#0 ← (byte) main::i#2 [ main::i#2 point_init::point_idx#0 ] ( main:2 [ main::i#2 point_init::point_idx#0 ] )
[18] (byte) main::i#2 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(byte) main::i#1 ) [ main::i#2 rem16u#21 rem16s#15 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 ] ) [20] call point_init [ main::i#2 ] ( main:2 [ main::i#2 ] )
[19] (byte) point_init::point_idx#0 ← (byte) main::i#2 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 ] )
[20] call point_init [ main::i#2 rem16u#18 rem16s#13 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 ] )
to:main::@20 to:main::@20
main::@20: scope:[main] from main::@1 main::@20: scope:[main] from main::@1
[21] (byte~) main::$9 ← (byte) main::i#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 rem16u#18 rem16s#13 main::$9 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 main::$9 ] ) [21] (byte~) main::$9 ← (byte) main::i#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::$9 ] ( main:2 [ main::i#2 main::$9 ] )
[22] (word) bitmap_plot::x#0 ← *((const word[4]) x_start#0 + (byte) main::i#2) [ main::i#2 rem16u#18 rem16s#13 main::$9 bitmap_plot::x#0 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 main::$9 bitmap_plot::x#0 ] ) [22] (word) bitmap_plot::x#0 ← *((const word[4]) x_start#0 + (byte) main::i#2) [ main::i#2 main::$9 bitmap_plot::x#0 ] ( main:2 [ main::i#2 main::$9 bitmap_plot::x#0 ] )
[23] (byte) bitmap_plot::y#0 ← *((const byte[4]) y_start#0 + (byte~) main::$9) [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::y#0 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::y#0 ] ) [23] (byte) bitmap_plot::y#0 ← *((const byte[4]) y_start#0 + (byte~) main::$9) [ main::i#2 bitmap_plot::x#0 bitmap_plot::y#0 ] ( main:2 [ main::i#2 bitmap_plot::x#0 bitmap_plot::y#0 ] )
[24] call bitmap_plot [ main::i#2 rem16u#18 rem16s#13 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 ] ) [24] call bitmap_plot [ main::i#2 ] ( main:2 [ main::i#2 ] )
to:main::@21 to:main::@21
main::@21: scope:[main] from main::@20 main::@21: scope:[main] from main::@20
[25] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::i#1 rem16u#18 rem16s#13 ] ( main:2 [ main::i#1 rem16u#18 rem16s#13 ] ) [25] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[26] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto main::@1 [ main::i#1 rem16u#18 rem16s#13 ] ( main:2 [ main::i#1 rem16u#18 rem16s#13 ] ) [26] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@5 to:main::@5
main::@5: scope:[main] from main::@21 main::@5 main::@7 main::@5: scope:[main] from main::@21 main::@5 main::@7
[27] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@5 [ ] ( main:2 [ ] ) [27] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@5 [ ] ( main:2 [ ] )
@ -61,256 +59,251 @@ main::@7: scope:[main] from main::@5
[28] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) [ ] ( main:2 [ ] ) [28] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) [ ] ( main:2 [ ] )
to:main::@5 to:main::@5
bitmap_plot: scope:[bitmap_plot] from main::@20 bitmap_plot: scope:[bitmap_plot] from main::@20
[29] (word~) bitmap_plot::$3 ← *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_plot::y#0) w= *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_plot::y#0) [ bitmap_plot::x#0 bitmap_plot::$3 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::$3 ] ) [29] (word~) bitmap_plot::$3 ← *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_plot::y#0) w= *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_plot::y#0) [ bitmap_plot::x#0 bitmap_plot::$3 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::x#0 bitmap_plot::$3 ] )
[30] (word~) bitmap_plot::$1 ← (word) bitmap_plot::x#0 & (word/dword/signed dword) 65528 [ bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] ) [30] (word~) bitmap_plot::$1 ← (word) bitmap_plot::x#0 & (word/dword/signed dword) 65528 [ bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] )
[31] (byte*) bitmap_plot::plotter#1 ← (byte*)(word~) bitmap_plot::$3 + (word~) bitmap_plot::$1 [ bitmap_plot::x#0 bitmap_plot::plotter#1 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::plotter#1 ] ) [31] (byte*) bitmap_plot::plotter#1 ← (byte*)(word~) bitmap_plot::$3 + (word~) bitmap_plot::$1 [ bitmap_plot::x#0 bitmap_plot::plotter#1 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::x#0 bitmap_plot::plotter#1 ] )
[32] (byte~) bitmap_plot::$2 ← < (word) bitmap_plot::x#0 [ bitmap_plot::plotter#1 bitmap_plot::$2 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::plotter#1 bitmap_plot::$2 ] ) [32] (byte~) bitmap_plot::$2 ← < (word) bitmap_plot::x#0 [ bitmap_plot::plotter#1 bitmap_plot::$2 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::plotter#1 bitmap_plot::$2 ] )
[33] *((byte*) bitmap_plot::plotter#1) ← *((byte*) bitmap_plot::plotter#1) | *((const byte[256]) bitmap_plot_bit#0 + (byte~) bitmap_plot::$2) [ ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 ] ) [33] *((byte*) bitmap_plot::plotter#1) ← *((byte*) bitmap_plot::plotter#1) | *((const byte[256]) bitmap_plot_bit#0 + (byte~) bitmap_plot::$2) [ ] ( main:2::bitmap_plot:24 [ main::i#2 ] )
to:bitmap_plot::@return to:bitmap_plot::@return
bitmap_plot::@return: scope:[bitmap_plot] from bitmap_plot bitmap_plot::@return: scope:[bitmap_plot] from bitmap_plot
[34] return [ ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 ] ) [34] return [ ] ( main:2::bitmap_plot:24 [ main::i#2 ] )
to:@return to:@return
point_init: scope:[point_init] from main::@1 point_init: scope:[point_init] from main::@1
[35] (byte) point_init::point_idx1#0 ← (byte) point_init::point_idx#0 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 ] ) [35] (byte) point_init::point_idx1#0 ← (byte) point_init::point_idx#0 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 ] )
[36] (signed word) point_init::x_diff#1 ← (signed word)*((const word[4]) x_end#0 + (byte) point_init::point_idx#0) - (signed word)*((const word[4]) x_start#0 + (byte) point_init::point_idx#0) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] ) [36] (signed word) point_init::x_diff#1 ← (signed word)*((const word[4]) x_end#0 + (byte) point_init::point_idx#0) - (signed word)*((const word[4]) x_start#0 + (byte) point_init::point_idx#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] )
[37] (signed word~) point_init::$4 ← ((signed word)) *((const byte[4]) y_end#0 + (byte) point_init::point_idx1#0) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] ) [37] (signed word~) point_init::$4 ← ((signed word)) *((const byte[4]) y_end#0 + (byte) point_init::point_idx1#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] )
[38] (signed word~) point_init::$5 ← ((signed word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] ) [38] (signed word~) point_init::$5 ← ((signed word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] )
[39] (signed word) point_init::y_diff#0 ← (signed word~) point_init::$4 - (signed word~) point_init::$5 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ) [39] (signed word) point_init::y_diff#0 ← (signed word~) point_init::$4 - (signed word~) point_init::$5 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::abs16s1 to:point_init::abs16s1
point_init::abs16s1: scope:[point_init] from point_init point_init::abs16s1: scope:[point_init] from point_init
[40] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s1_@1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ) [40] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s1_@1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@12 to:point_init::@12
point_init::@12: scope:[point_init] from point_init::abs16s1 point_init::@12: scope:[point_init] from point_init::abs16s1
[41] (word~) point_init::abs16s1_return#6 ← (word)(signed word) point_init::x_diff#1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] ) [41] (word~) point_init::abs16s1_return#6 ← (word)(signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] )
to:point_init::abs16s1_@return to:point_init::abs16s1_@return
point_init::abs16s1_@return: scope:[point_init] from point_init::@12 point_init::abs16s1_@1 point_init::abs16s1_@return: scope:[point_init] from point_init::@12 point_init::abs16s1_@1
[42] (word) point_init::abs16s1_return#2 ← phi( point_init::abs16s1_@1/(word~) point_init::abs16s1_return#5 point_init::@12/(word~) point_init::abs16s1_return#6 ) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ) [42] (word) point_init::abs16s1_return#2 ← phi( point_init::abs16s1_@1/(word~) point_init::abs16s1_return#5 point_init::@12/(word~) point_init::abs16s1_return#6 ) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] )
to:point_init::abs16s2 to:point_init::abs16s2
point_init::abs16s2: scope:[point_init] from point_init::abs16s1_@return point_init::abs16s2: scope:[point_init] from point_init::abs16s1_@return
[43] if((signed word) point_init::y_diff#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s2_@1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ) [43] if((signed word) point_init::y_diff#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s2_@1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] )
to:point_init::@13 to:point_init::@13
point_init::@13: scope:[point_init] from point_init::abs16s2 point_init::@13: scope:[point_init] from point_init::abs16s2
[44] (word~) point_init::abs16s2_return#6 ← (word)(signed word) point_init::y_diff#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] ) [44] (word~) point_init::abs16s2_return#6 ← (word)(signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] )
to:point_init::abs16s2_@return to:point_init::abs16s2_@return
point_init::abs16s2_@return: scope:[point_init] from point_init::@13 point_init::abs16s2_@1 point_init::abs16s2_@return: scope:[point_init] from point_init::@13 point_init::abs16s2_@1
[45] (word) point_init::abs16s2_return#2 ← phi( point_init::abs16s2_@1/(word~) point_init::abs16s2_return#5 point_init::@13/(word~) point_init::abs16s2_return#6 ) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] ) [45] (word) point_init::abs16s2_return#2 ← phi( point_init::abs16s2_@1/(word~) point_init::abs16s2_return#5 point_init::@13/(word~) point_init::abs16s2_return#6 ) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] )
to:point_init::@10 to:point_init::@10
point_init::@10: scope:[point_init] from point_init::abs16s2_@return point_init::@10: scope:[point_init] from point_init::abs16s2_@return
[46] if((word) point_init::abs16s1_return#2>(word) point_init::abs16s2_return#2) goto point_init::@1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ) [46] if((word) point_init::abs16s1_return#2>(word) point_init::abs16s2_return#2) goto point_init::@1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@2 to:point_init::@2
point_init::@2: scope:[point_init] from point_init::@10 point_init::@11 point_init::@2: scope:[point_init] from point_init::@10 point_init::@11
[47] (signed word) rem16s#13 ← phi( point_init::@10/(signed word) rem16s#15 point_init::@11/(signed word) rem16s#3 ) [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ) [47] (word~) point_init::$16 ← *((const word[4]) x_start#0 + (byte) point_init::point_idx#0) << (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] )
[47] (word) rem16u#18 ← phi( point_init::@10/(word) rem16u#21 point_init::@11/(word) divr16u::rem#10 ) [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ) [48] *((const word[4]) x_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$16 [ point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 ] )
[48] (word~) point_init::$16 ← *((const word[4]) x_start#0 + (byte) point_init::point_idx#0) << (byte/signed byte/word/signed word/dword/signed dword) 4 [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] ) [49] (word~) point_init::$17 ← ((word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] )
[49] *((const word[4]) x_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$16 [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ) [50] (word~) point_init::$18 ← (word~) point_init::$17 << (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] )
[50] (word~) point_init::$17 ← ((word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] ) [51] *((const word[4]) y_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$18 [ point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx1#0 ] )
[51] (word~) point_init::$18 ← (word~) point_init::$17 << (byte/signed byte/word/signed word/dword/signed dword) 4 [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] ) [52] *((const byte[4]) delay#0 + (byte) point_init::point_idx1#0) ← (const byte) DELAY#0 [ ] ( main:2::point_init:20 [ main::i#2 ] )
[52] *((const word[4]) y_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$18 [ rem16u#18 rem16s#13 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx1#0 ] )
[53] *((const byte[4]) delay#0 + (byte) point_init::point_idx1#0) ← (const byte) DELAY#0 [ rem16u#18 rem16s#13 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 ] )
to:point_init::@return to:point_init::@return
point_init::@return: scope:[point_init] from point_init::@2 point_init::@return: scope:[point_init] from point_init::@2
[54] return [ rem16u#18 rem16s#13 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 ] ) [53] return [ ] ( main:2::point_init:20 [ main::i#2 ] )
to:@return to:@return
point_init::@1: scope:[point_init] from point_init point_init::@10 point_init::@1: scope:[point_init] from point_init point_init::@10
[55] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::@3 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ) [54] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::@3 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@7 to:point_init::@7
point_init::@7: scope:[point_init] from point_init::@1 point_init::@7: scope:[point_init] from point_init::@1
[56] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← (byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ) [55] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← (byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@4 to:point_init::@4
point_init::@4: scope:[point_init] from point_init::@3 point_init::@7 point_init::@4: scope:[point_init] from point_init::@3 point_init::@7
[57] (signed word) divr16s::divisor#0 ← (signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] ) [56] (signed word) divr16s::divisor#0 ← (signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] )
[58] (signed word) divr16s::rem#0 ← (signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] ) [57] (signed word) divr16s::rem#0 ← (signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
[59] call divr16s [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] ) [58] call divr16s [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] )
[60] (signed word) divr16s::return#3 ← (signed word) divr16s::return#2 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#3 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#3 ] ) [59] (signed word) divr16s::return#3 ← (signed word) divr16s::return#2 [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#3 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#3 ] )
to:point_init::@11 to:point_init::@11
point_init::@11: scope:[point_init] from point_init::@4 point_init::@11: scope:[point_init] from point_init::@4
[61] (signed word) point_init::x_stepf#0 ← (signed word) divr16s::return#3 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::x_stepf#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::x_stepf#0 ] ) [60] (signed word) point_init::x_stepf#0 ← (signed word) divr16s::return#3 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_stepf#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_stepf#0 ] )
[62] (byte~) point_init::$13 ← > (signed word) point_init::x_stepf#0 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$13 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$13 ] ) [61] (byte~) point_init::$13 ← > (signed word) point_init::x_stepf#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$13 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$13 ] )
[63] (byte~) point_init::$14 ← (byte~) point_init::$13 >> (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$14 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$14 ] ) [62] (byte~) point_init::$14 ← (byte~) point_init::$13 >> (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$14 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$14 ] )
[64] *((const signed byte[4]) y_add#0 + (byte) point_init::point_idx1#0) ← (signed byte)(byte~) point_init::$14 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 ] ) [63] *((const signed byte[4]) y_add#0 + (byte) point_init::point_idx1#0) ← (signed byte)(byte~) point_init::$14 [ point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 ] )
to:point_init::@2 to:point_init::@2
point_init::@3: scope:[point_init] from point_init::@1 point_init::@3: scope:[point_init] from point_init::@1
[65] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← -(byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ) [64] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← -(byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@4 to:point_init::@4
point_init::abs16s2_@1: scope:[point_init] from point_init::abs16s2 point_init::abs16s2_@1: scope:[point_init] from point_init::abs16s2
[66] (signed word) point_init::abs16s2_$2#0 ← - (signed word) point_init::y_diff#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] ) [65] (signed word) point_init::abs16s2_$2#0 ← - (signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] )
[67] (word~) point_init::abs16s2_return#5 ← (word)(signed word) point_init::abs16s2_$2#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] ) [66] (word~) point_init::abs16s2_return#5 ← (word)(signed word) point_init::abs16s2_$2#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] )
to:point_init::abs16s2_@return to:point_init::abs16s2_@return
point_init::abs16s1_@1: scope:[point_init] from point_init::abs16s1 point_init::abs16s1_@1: scope:[point_init] from point_init::abs16s1
[68] (signed word) point_init::abs16s1_$2#0 ← - (signed word) point_init::x_diff#1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] ) [67] (signed word) point_init::abs16s1_$2#0 ← - (signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] )
[69] (word~) point_init::abs16s1_return#5 ← (word)(signed word) point_init::abs16s1_$2#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] ) [68] (word~) point_init::abs16s1_return#5 ← (word)(signed word) point_init::abs16s1_$2#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] )
to:point_init::abs16s1_@return to:point_init::abs16s1_@return
divr16s: scope:[divr16s] from point_init::@4 divr16s: scope:[divr16s] from point_init::@4
[70] phi() [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] ) [69] phi() [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
to:divr16s::@16 to:divr16s::@16
divr16s::@16: scope:[divr16s] from divr16s divr16s::@16: scope:[divr16s] from divr16s
[71] if((signed word) divr16s::rem#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@1 [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] ) [70] if((signed word) divr16s::rem#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@1 [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
to:divr16s::@17 to:divr16s::@17
divr16s::@17: scope:[divr16s] from divr16s::@16 divr16s::@17: scope:[divr16s] from divr16s::@16
[72] (word~) divr16s::remu#8 ← (word)(signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::remu#8 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#8 ] ) [71] (word~) divr16s::remu#8 ← (word)(signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::remu#8 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#8 ] )
to:divr16s::@2 to:divr16s::@2
divr16s::@2: scope:[divr16s] from divr16s::@1 divr16s::@17 divr16s::@2: scope:[divr16s] from divr16s::@1 divr16s::@17
[73] (word) divr16s::remu#3 ← phi( divr16s::@1/(word~) divr16s::remu#7 divr16s::@17/(word~) divr16s::remu#8 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ) [72] (word) divr16s::remu#3 ← phi( divr16s::@1/(word~) divr16s::remu#7 divr16s::@17/(word~) divr16s::remu#8 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[73] (word) divr16s::dividendu#3 ← phi( divr16s::@1/((word))-(const signed word) divr16s::dividend#0 divr16s::@17/((word))(const signed word) divr16s::dividend#0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ) [72] (word) divr16s::dividendu#3 ← phi( divr16s::@1/((word))-(const signed word) divr16s::dividend#0 divr16s::@17/((word))(const signed word) divr16s::dividend#0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[73] (byte) divr16s::neg#3 ← phi( divr16s::@1/(byte/signed byte/word/signed word/dword/signed dword) 1 divr16s::@17/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ) [72] (byte) divr16s::neg#3 ← phi( divr16s::@1/(byte/signed byte/word/signed word/dword/signed dword) 1 divr16s::@17/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[74] if((signed word) divr16s::divisor#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@3 [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ) [73] if((signed word) divr16s::divisor#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@3 [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
to:divr16s::@18 to:divr16s::@18
divr16s::@18: scope:[divr16s] from divr16s::@2 divr16s::@18: scope:[divr16s] from divr16s::@2
[75] (word~) divr16s::divisoru#5 ← (word)(signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] ) [74] (word~) divr16s::divisoru#5 ← (word)(signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] )
to:divr16s::@4 to:divr16s::@4
divr16s::@4: scope:[divr16s] from divr16s::@18 divr16s::@3 divr16s::@4: scope:[divr16s] from divr16s::@18 divr16s::@3
[76] (byte) divr16s::neg#4 ← phi( divr16s::@3/(byte) divr16s::neg#2 divr16s::@18/(byte) divr16s::neg#3 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ) [75] (byte) divr16s::neg#4 ← phi( divr16s::@3/(byte) divr16s::neg#2 divr16s::@18/(byte) divr16s::neg#3 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] )
[76] (word) divr16s::divisoru#3 ← phi( divr16s::@3/(word~) divr16s::divisoru#4 divr16s::@18/(word~) divr16s::divisoru#5 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ) [75] (word) divr16s::divisoru#3 ← phi( divr16s::@3/(word~) divr16s::divisoru#4 divr16s::@18/(word~) divr16s::divisoru#5 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] )
[77] (word) divr16u::dividend#1 ← (word) divr16s::dividendu#3 [ divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] ) [76] (word) divr16u::dividend#1 ← (word) divr16s::dividendu#3 [ divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] )
[78] (word) divr16u::divisor#0 ← (word) divr16s::divisoru#3 [ divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] ) [77] (word) divr16u::divisor#0 ← (word) divr16s::divisoru#3 [ divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] )
[79] (word) divr16u::rem#3 ← (word) divr16s::remu#3 [ divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ) [78] (word) divr16u::rem#3 ← (word) divr16s::remu#3 [ divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] )
[80] call divr16u [ divr16u::rem#10 divr16s::neg#4 divr16u::return#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::neg#4 divr16u::return#0 ] ) [79] call divr16u [ divr16s::neg#4 divr16u::return#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::return#0 ] )
[81] (word) divr16u::return#2 ← (word) divr16u::return#0 [ divr16u::rem#10 divr16s::neg#4 divr16u::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::neg#4 divr16u::return#2 ] ) [80] (word) divr16u::return#2 ← (word) divr16u::return#0 [ divr16s::neg#4 divr16u::return#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::return#2 ] )
to:divr16s::@15 to:divr16s::@15
divr16s::@15: scope:[divr16s] from divr16s::@4 divr16s::@15: scope:[divr16s] from divr16s::@4
[82] (word) divr16s::resultu#0 ← (word) divr16u::return#2 [ divr16u::rem#10 divr16s::neg#4 divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::neg#4 divr16s::resultu#0 ] ) [81] (word) divr16s::resultu#0 ← (word) divr16u::return#2 [ divr16s::neg#4 divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16s::resultu#0 ] )
[83] if((byte) divr16s::neg#4==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@19 [ divr16u::rem#10 divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::resultu#0 ] ) [82] if((byte) divr16s::neg#4==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@19 [ divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::resultu#0 ] )
to:divr16s::@11 to:divr16s::@11
divr16s::@11: scope:[divr16s] from divr16s::@15 divr16s::@11: scope:[divr16s] from divr16s::@15
[84] (signed word) rem16s#2 ← - (signed word)(word) divr16u::rem#10 [ divr16u::rem#10 divr16s::resultu#0 rem16s#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::resultu#0 rem16s#2 ] ) [83] (signed word) divr16s::return#1 ← - (signed word)(word) divr16s::resultu#0 [ divr16s::return#1 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#1 ] )
[85] (signed word) divr16s::return#1 ← - (signed word)(word) divr16s::resultu#0 [ divr16u::rem#10 rem16s#2 divr16s::return#1 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#2 divr16s::return#1 ] )
to:divr16s::@return to:divr16s::@return
divr16s::@return: scope:[divr16s] from divr16s::@11 divr16s::@19 divr16s::@return: scope:[divr16s] from divr16s::@11 divr16s::@19
[86] (signed word) rem16s#3 ← phi( divr16s::@11/(signed word) rem16s#2 divr16s::@19/(signed word~) rem16s#57 ) [ divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] ) [84] (signed word) divr16s::return#2 ← phi( divr16s::@11/(signed word) divr16s::return#1 divr16s::@19/(signed word~) divr16s::return#7 ) [ divr16s::return#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] )
[86] (signed word) divr16s::return#2 ← phi( divr16s::@11/(signed word) divr16s::return#1 divr16s::@19/(signed word~) divr16s::return#7 ) [ divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] ) [85] return [ divr16s::return#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] )
[87] return [ divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] )
to:@return to:@return
divr16s::@19: scope:[divr16s] from divr16s::@15 divr16s::@19: scope:[divr16s] from divr16s::@15
[88] (signed word~) divr16s::return#7 ← (signed word)(word) divr16s::resultu#0 [ divr16u::rem#10 divr16s::return#7 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::return#7 ] ) [86] (signed word~) divr16s::return#7 ← (signed word)(word) divr16s::resultu#0 [ divr16s::return#7 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#7 ] )
[89] (signed word~) rem16s#57 ← (signed word)(word) divr16u::rem#10 [ divr16u::rem#10 divr16s::return#7 rem16s#57 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::return#7 rem16s#57 ] )
to:divr16s::@return to:divr16s::@return
divr16s::@3: scope:[divr16s] from divr16s::@2 divr16s::@3: scope:[divr16s] from divr16s::@2
[90] (signed word~) divr16s::$11 ← - (signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] ) [87] (signed word~) divr16s::$11 ← - (signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] )
[91] (byte) divr16s::neg#2 ← (byte) divr16s::neg#3 ^ (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] ) [88] (byte) divr16s::neg#2 ← (byte) divr16s::neg#3 ^ (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] )
[92] (word~) divr16s::divisoru#4 ← (word)(signed word~) divr16s::$11 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] ) [89] (word~) divr16s::divisoru#4 ← (word)(signed word~) divr16s::$11 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] )
to:divr16s::@4 to:divr16s::@4
divr16s::@1: scope:[divr16s] from divr16s::@16 divr16s::@1: scope:[divr16s] from divr16s::@16
[93] (signed word~) divr16s::$7 ← - (signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::$7 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::$7 ] ) [90] (signed word~) divr16s::$7 ← - (signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::$7 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::$7 ] )
[94] (word~) divr16s::remu#7 ← (word)(signed word~) divr16s::$7 [ divr16s::divisor#0 divr16s::remu#7 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#7 ] ) [91] (word~) divr16s::remu#7 ← (word)(signed word~) divr16s::$7 [ divr16s::divisor#0 divr16s::remu#7 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#7 ] )
to:divr16s::@2 to:divr16s::@2
divr16u: scope:[divr16u] from divr16s::@4 divr16u: scope:[divr16u] from divr16s::@4
[95] phi() [ divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ) [92] phi() [ divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] )
to:divr16u::@1 to:divr16u::@1
divr16u::@1: scope:[divr16u] from divr16u divr16u::@3 divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[96] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [93] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[96] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [93] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[96] (word) divr16u::dividend#2 ← phi( divr16u/(word) divr16u::dividend#1 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [93] (word) divr16u::dividend#2 ← phi( divr16u/(word) divr16u::dividend#1 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[96] (word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#3 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [93] (word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#3 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[97] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) [94] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[98] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ) [95] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[99] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ) [96] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
[100] if((byte~) divr16u::$2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16u::@2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) [97] if((byte~) divr16u::$2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16u::@2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
to:divr16u::@4 to:divr16u::@4
divr16u::@4: scope:[divr16u] from divr16u::@1 divr16u::@4: scope:[divr16u] from divr16u::@1
[101] (word) divr16u::rem#1 ← (word) divr16u::rem#0 | (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] ) [98] (word) divr16u::rem#1 ← (word) divr16u::rem#0 | (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] )
to:divr16u::@2 to:divr16u::@2
divr16u::@2: scope:[divr16u] from divr16u::@1 divr16u::@4 divr16u::@2: scope:[divr16u] from divr16u::@1 divr16u::@4
[102] (word) divr16u::rem#5 ← phi( divr16u::@1/(word) divr16u::rem#0 divr16u::@4/(word) divr16u::rem#1 ) [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] ) [99] (word) divr16u::rem#5 ← phi( divr16u::@1/(word) divr16u::rem#0 divr16u::@4/(word) divr16u::rem#1 ) [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] )
[103] (word) divr16u::dividend#0 ← (word) divr16u::dividend#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] ) [100] (word) divr16u::dividend#0 ← (word) divr16u::dividend#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] )
[104] (word) divr16u::quotient#1 ← (word) divr16u::quotient#3 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ) [101] (word) divr16u::quotient#1 ← (word) divr16u::quotient#3 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] )
[105] if((word) divr16u::rem#5<(word) divr16u::divisor#0) goto divr16u::@3 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ) [102] if((word) divr16u::rem#5<(word) divr16u::divisor#0) goto divr16u::@3 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] )
to:divr16u::@5 to:divr16u::@5
divr16u::@5: scope:[divr16u] from divr16u::@2 divr16u::@5: scope:[divr16u] from divr16u::@2
[106] (word) divr16u::quotient#2 ← ++ (word) divr16u::quotient#1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] ) [103] (word) divr16u::quotient#2 ← ++ (word) divr16u::quotient#1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] )
[107] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (word) divr16u::divisor#0 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) [104] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (word) divr16u::divisor#0 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3 to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5 divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[108] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] ) [105] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[108] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] ) [105] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[109] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] ) [106] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[110] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] ) [107] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3 divr16u::@return: scope:[divr16u] from divr16u::@3
[111] return [ divr16u::rem#10 divr16u::return#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::return#0 ] ) [108] return [ divr16u::return#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::return#0 ] )
to:@return to:@return
screen_fill: scope:[screen_fill] from main::@18 screen_fill: scope:[screen_fill] from main::@18
[112] phi() [ ] ( main:2::screen_fill:17 [ ] ) [109] phi() [ ] ( main:2::screen_fill:17 [ ] )
to:screen_fill::@1 to:screen_fill::@1
screen_fill::@1: scope:[screen_fill] from screen_fill screen_fill::@3 screen_fill::@1: scope:[screen_fill] from screen_fill screen_fill::@3
[113] (byte) screen_fill::y#4 ← phi( screen_fill/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@3/(byte) screen_fill::y#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] ) [110] (byte) screen_fill::y#4 ← phi( screen_fill/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@3/(byte) screen_fill::y#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] )
[113] (byte*) screen_fill::screen#3 ← phi( screen_fill/(const byte*) SCREEN#0 screen_fill::@3/(byte*) screen_fill::screen#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] ) [110] (byte*) screen_fill::screen#3 ← phi( screen_fill/(const byte*) SCREEN#0 screen_fill::@3/(byte*) screen_fill::screen#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] )
to:screen_fill::@2 to:screen_fill::@2
screen_fill::@2: scope:[screen_fill] from screen_fill::@1 screen_fill::@2 screen_fill::@2: scope:[screen_fill] from screen_fill::@1 screen_fill::@2
[114] (byte) screen_fill::x#2 ← phi( screen_fill::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@2/(byte) screen_fill::x#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ) [111] (byte) screen_fill::x#2 ← phi( screen_fill::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@2/(byte) screen_fill::x#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[114] (byte*) screen_fill::screen#2 ← phi( screen_fill::@1/(byte*) screen_fill::screen#3 screen_fill::@2/(byte*) screen_fill::screen#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ) [111] (byte*) screen_fill::screen#2 ← phi( screen_fill::@1/(byte*) screen_fill::screen#3 screen_fill::@2/(byte*) screen_fill::screen#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[115] *((byte*) screen_fill::screen#2) ← (const byte) screen_fill::ch#0 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ) [112] *((byte*) screen_fill::screen#2) ← (const byte) screen_fill::ch#0 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[116] (byte*) screen_fill::screen#1 ← ++ (byte*) screen_fill::screen#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] ) [113] (byte*) screen_fill::screen#1 ← ++ (byte*) screen_fill::screen#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] )
[117] (byte) screen_fill::x#1 ← ++ (byte) screen_fill::x#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ) [114] (byte) screen_fill::x#1 ← ++ (byte) screen_fill::x#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] )
[118] if((byte) screen_fill::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto screen_fill::@2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ) [115] if((byte) screen_fill::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto screen_fill::@2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] )
to:screen_fill::@3 to:screen_fill::@3
screen_fill::@3: scope:[screen_fill] from screen_fill::@2 screen_fill::@3: scope:[screen_fill] from screen_fill::@2
[119] (byte) screen_fill::y#1 ← ++ (byte) screen_fill::y#4 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] ) [116] (byte) screen_fill::y#1 ← ++ (byte) screen_fill::y#4 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] )
[120] if((byte) screen_fill::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 25) goto screen_fill::@1 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] ) [117] if((byte) screen_fill::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 25) goto screen_fill::@1 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] )
to:screen_fill::@return to:screen_fill::@return
screen_fill::@return: scope:[screen_fill] from screen_fill::@3 screen_fill::@return: scope:[screen_fill] from screen_fill::@3
[121] return [ ] ( main:2::screen_fill:17 [ ] ) [118] return [ ] ( main:2::screen_fill:17 [ ] )
to:@return to:@return
bitmap_clear: scope:[bitmap_clear] from main::@17 bitmap_clear: scope:[bitmap_clear] from main::@17
[122] (word~) bitmap_clear::$3 ← *((const byte[256]) bitmap_plot_yhi#0+(byte/signed byte/word/signed word/dword/signed dword) 0) w= *((const byte[256]) bitmap_plot_ylo#0+(byte/signed byte/word/signed word/dword/signed dword) 0) [ bitmap_clear::$3 ] ( main:2::bitmap_clear:15 [ bitmap_clear::$3 ] ) [119] (word~) bitmap_clear::$3 ← *((const byte[256]) bitmap_plot_yhi#0+(byte/signed byte/word/signed word/dword/signed dword) 0) w= *((const byte[256]) bitmap_plot_ylo#0+(byte/signed byte/word/signed word/dword/signed dword) 0) [ bitmap_clear::$3 ] ( main:2::bitmap_clear:15 [ bitmap_clear::$3 ] )
[123] (byte*~) bitmap_clear::bitmap#5 ← (byte*)(word~) bitmap_clear::$3 [ bitmap_clear::bitmap#5 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#5 ] ) [120] (byte*~) bitmap_clear::bitmap#5 ← (byte*)(word~) bitmap_clear::$3 [ bitmap_clear::bitmap#5 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#5 ] )
to:bitmap_clear::@1 to:bitmap_clear::@1
bitmap_clear::@1: scope:[bitmap_clear] from bitmap_clear bitmap_clear::@3 bitmap_clear::@1: scope:[bitmap_clear] from bitmap_clear bitmap_clear::@3
[124] (byte) bitmap_clear::y#4 ← phi( bitmap_clear/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@3/(byte) bitmap_clear::y#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ) [121] (byte) bitmap_clear::y#4 ← phi( bitmap_clear/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@3/(byte) bitmap_clear::y#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] )
[124] (byte*) bitmap_clear::bitmap#3 ← phi( bitmap_clear/(byte*~) bitmap_clear::bitmap#5 bitmap_clear::@3/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ) [121] (byte*) bitmap_clear::bitmap#3 ← phi( bitmap_clear/(byte*~) bitmap_clear::bitmap#5 bitmap_clear::@3/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] )
to:bitmap_clear::@2 to:bitmap_clear::@2
bitmap_clear::@2: scope:[bitmap_clear] from bitmap_clear::@1 bitmap_clear::@2 bitmap_clear::@2: scope:[bitmap_clear] from bitmap_clear::@1 bitmap_clear::@2
[125] (byte) bitmap_clear::x#2 ← phi( bitmap_clear::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@2/(byte) bitmap_clear::x#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ) [122] (byte) bitmap_clear::x#2 ← phi( bitmap_clear::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@2/(byte) bitmap_clear::x#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[125] (byte*) bitmap_clear::bitmap#2 ← phi( bitmap_clear::@1/(byte*) bitmap_clear::bitmap#3 bitmap_clear::@2/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ) [122] (byte*) bitmap_clear::bitmap#2 ← phi( bitmap_clear::@1/(byte*) bitmap_clear::bitmap#3 bitmap_clear::@2/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[126] *((byte*) bitmap_clear::bitmap#2) ← (byte/signed byte/word/signed word/dword/signed dword) 0 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ) [123] *((byte*) bitmap_clear::bitmap#2) ← (byte/signed byte/word/signed word/dword/signed dword) 0 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[127] (byte*) bitmap_clear::bitmap#1 ← ++ (byte*) bitmap_clear::bitmap#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] ) [124] (byte*) bitmap_clear::bitmap#1 ← ++ (byte*) bitmap_clear::bitmap#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] )
[128] (byte) bitmap_clear::x#1 ← ++ (byte) bitmap_clear::x#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ) [125] (byte) bitmap_clear::x#1 ← ++ (byte) bitmap_clear::x#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] )
[129] if((byte) bitmap_clear::x#1!=(byte/word/signed word/dword/signed dword) 200) goto bitmap_clear::@2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ) [126] if((byte) bitmap_clear::x#1!=(byte/word/signed word/dword/signed dword) 200) goto bitmap_clear::@2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] )
to:bitmap_clear::@3 to:bitmap_clear::@3
bitmap_clear::@3: scope:[bitmap_clear] from bitmap_clear::@2 bitmap_clear::@3: scope:[bitmap_clear] from bitmap_clear::@2
[130] (byte) bitmap_clear::y#1 ← ++ (byte) bitmap_clear::y#4 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ) [127] (byte) bitmap_clear::y#1 ← ++ (byte) bitmap_clear::y#4 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] )
[131] if((byte) bitmap_clear::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto bitmap_clear::@1 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ) [128] if((byte) bitmap_clear::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto bitmap_clear::@1 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] )
to:bitmap_clear::@return to:bitmap_clear::@return
bitmap_clear::@return: scope:[bitmap_clear] from bitmap_clear::@3 bitmap_clear::@return: scope:[bitmap_clear] from bitmap_clear::@3
[132] return [ ] ( main:2::bitmap_clear:15 [ ] ) [129] return [ ] ( main:2::bitmap_clear:15 [ ] )
to:@return to:@return
bitmap_init: scope:[bitmap_init] from main::@16 bitmap_init: scope:[bitmap_init] from main::@16
[133] phi() [ ] ( main:2::bitmap_init:13 [ ] ) [130] phi() [ ] ( main:2::bitmap_init:13 [ ] )
to:bitmap_init::@1 to:bitmap_init::@1
bitmap_init::@1: scope:[bitmap_init] from bitmap_init bitmap_init::@2 bitmap_init::@1: scope:[bitmap_init] from bitmap_init bitmap_init::@2
[134] (byte) bitmap_init::x#2 ← phi( bitmap_init/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_init::@2/(byte) bitmap_init::x#1 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] ) [131] (byte) bitmap_init::x#2 ← phi( bitmap_init/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_init::@2/(byte) bitmap_init::x#1 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[134] (byte) bitmap_init::bits#3 ← phi( bitmap_init/(byte/word/signed word/dword/signed dword) 128 bitmap_init::@2/(byte) bitmap_init::bits#4 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] ) [131] (byte) bitmap_init::bits#3 ← phi( bitmap_init/(byte/word/signed word/dword/signed dword) 128 bitmap_init::@2/(byte) bitmap_init::bits#4 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[135] *((const byte[256]) bitmap_plot_bit#0 + (byte) bitmap_init::x#2) ← (byte) bitmap_init::bits#3 [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] ) [132] *((const byte[256]) bitmap_plot_bit#0 + (byte) bitmap_init::x#2) ← (byte) bitmap_init::bits#3 [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[136] (byte) bitmap_init::bits#1 ← (byte) bitmap_init::bits#3 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] ) [133] (byte) bitmap_init::bits#1 ← (byte) bitmap_init::bits#3 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
[137] if((byte) bitmap_init::bits#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@10 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] ) [134] if((byte) bitmap_init::bits#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@10 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
to:bitmap_init::@2 to:bitmap_init::@2
bitmap_init::@2: scope:[bitmap_init] from bitmap_init::@1 bitmap_init::@10 bitmap_init::@2: scope:[bitmap_init] from bitmap_init::@1 bitmap_init::@10
[138] (byte) bitmap_init::bits#4 ← phi( bitmap_init::@10/(byte) bitmap_init::bits#1 bitmap_init::@1/(byte/word/signed word/dword/signed dword) 128 ) [ bitmap_init::x#2 bitmap_init::bits#4 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#4 ] ) [135] (byte) bitmap_init::bits#4 ← phi( bitmap_init::@10/(byte) bitmap_init::bits#1 bitmap_init::@1/(byte/word/signed word/dword/signed dword) 128 ) [ bitmap_init::x#2 bitmap_init::bits#4 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#4 ] )
[139] (byte) bitmap_init::x#1 ← ++ (byte) bitmap_init::x#2 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] ) [136] (byte) bitmap_init::x#1 ← ++ (byte) bitmap_init::x#2 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] )
[140] if((byte) bitmap_init::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@1 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] ) [137] if((byte) bitmap_init::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@1 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] )
to:bitmap_init::@3 to:bitmap_init::@3
bitmap_init::@3: scope:[bitmap_init] from bitmap_init::@2 bitmap_init::@4 bitmap_init::@3: scope:[bitmap_init] from bitmap_init::@2 bitmap_init::@4
[141] (byte*) bitmap_init::yoffs#2 ← phi( bitmap_init::@4/(byte*) bitmap_init::yoffs#4 bitmap_init::@2/(const byte*) BITMAP#0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ) [138] (byte*) bitmap_init::yoffs#2 ← phi( bitmap_init::@4/(byte*) bitmap_init::yoffs#4 bitmap_init::@2/(const byte*) BITMAP#0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[141] (byte) bitmap_init::y#2 ← phi( bitmap_init::@4/(byte) bitmap_init::y#1 bitmap_init::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ) [138] (byte) bitmap_init::y#2 ← phi( bitmap_init::@4/(byte) bitmap_init::y#1 bitmap_init::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[142] (byte~) bitmap_init::$3 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] ) [139] (byte~) bitmap_init::$3 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] )
[143] (byte~) bitmap_init::$4 ← < (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] ) [140] (byte~) bitmap_init::$4 ← < (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] )
[144] (byte~) bitmap_init::$5 ← (byte~) bitmap_init::$3 | (byte~) bitmap_init::$4 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] ) [141] (byte~) bitmap_init::$5 ← (byte~) bitmap_init::$3 | (byte~) bitmap_init::$4 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] )
[145] *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$5 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ) [142] *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$5 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[146] (byte~) bitmap_init::$6 ← > (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] ) [143] (byte~) bitmap_init::$6 ← > (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] )
[147] *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$6 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ) [144] *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$6 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[148] (byte~) bitmap_init::$7 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ) [145] (byte~) bitmap_init::$7 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] )
[149] if((byte~) bitmap_init::$7!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto bitmap_init::@4 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ) [146] if((byte~) bitmap_init::$7!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto bitmap_init::@4 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
to:bitmap_init::@7 to:bitmap_init::@7
bitmap_init::@7: scope:[bitmap_init] from bitmap_init::@3 bitmap_init::@7: scope:[bitmap_init] from bitmap_init::@3
[150] (byte*) bitmap_init::yoffs#1 ← (byte*) bitmap_init::yoffs#2 + (byte/signed byte/word/signed word/dword/signed dword) 40*(byte/signed byte/word/signed word/dword/signed dword) 8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ) [147] (byte*) bitmap_init::yoffs#1 ← (byte*) bitmap_init::yoffs#2 + (byte/signed byte/word/signed word/dword/signed dword) 40*(byte/signed byte/word/signed word/dword/signed dword) 8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] )
to:bitmap_init::@4 to:bitmap_init::@4
bitmap_init::@4: scope:[bitmap_init] from bitmap_init::@3 bitmap_init::@7 bitmap_init::@4: scope:[bitmap_init] from bitmap_init::@3 bitmap_init::@7
[151] (byte*) bitmap_init::yoffs#4 ← phi( bitmap_init::@3/(byte*) bitmap_init::yoffs#2 bitmap_init::@7/(byte*) bitmap_init::yoffs#1 ) [ bitmap_init::y#2 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#4 ] ) [148] (byte*) bitmap_init::yoffs#4 ← phi( bitmap_init::@3/(byte*) bitmap_init::yoffs#2 bitmap_init::@7/(byte*) bitmap_init::yoffs#1 ) [ bitmap_init::y#2 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#4 ] )
[152] (byte) bitmap_init::y#1 ← ++ (byte) bitmap_init::y#2 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ) [149] (byte) bitmap_init::y#1 ← ++ (byte) bitmap_init::y#2 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] )
[153] if((byte) bitmap_init::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@3 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ) [150] if((byte) bitmap_init::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@3 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] )
to:bitmap_init::@return to:bitmap_init::@return
bitmap_init::@return: scope:[bitmap_init] from bitmap_init::@4 bitmap_init::@return: scope:[bitmap_init] from bitmap_init::@4
[154] return [ ] ( main:2::bitmap_init:13 [ ] ) [151] return [ ] ( main:2::bitmap_init:13 [ ] )
to:@return to:@return
bitmap_init::@10: scope:[bitmap_init] from bitmap_init::@1 bitmap_init::@10: scope:[bitmap_init] from bitmap_init::@1
[155] phi() [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] ) [152] phi() [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
to:bitmap_init::@2 to:bitmap_init::@2

File diff suppressed because it is too large Load Diff

View File

@ -79,14 +79,14 @@
(byte*) bitmap_init::yoffs#2 yoffs zp ZP_WORD:3 6.111111111111112 (byte*) bitmap_init::yoffs#2 yoffs zp ZP_WORD:3 6.111111111111112
(byte*) bitmap_init::yoffs#4 yoffs zp ZP_WORD:3 11.0 (byte*) bitmap_init::yoffs#4 yoffs zp ZP_WORD:3 11.0
(void()) bitmap_plot((word) bitmap_plot::x , (byte) bitmap_plot::y) (void()) bitmap_plot((word) bitmap_plot::x , (byte) bitmap_plot::y)
(word~) bitmap_plot::$1 $1 zp ZP_WORD:11 4.0 (word~) bitmap_plot::$1 $1 zp ZP_WORD:7 4.0
(byte~) bitmap_plot::$2 reg byte a 4.0 (byte~) bitmap_plot::$2 reg byte a 4.0
(word~) bitmap_plot::$3 $3 zp ZP_WORD:7 1.0 (word~) bitmap_plot::$3 $3 zp ZP_WORD:5 1.0
(label) bitmap_plot::@return (label) bitmap_plot::@return
(byte*) bitmap_plot::plotter (byte*) bitmap_plot::plotter
(byte*) bitmap_plot::plotter#1 plotter zp ZP_WORD:7 3.0 (byte*) bitmap_plot::plotter#1 plotter zp ZP_WORD:5 3.0
(word) bitmap_plot::x (word) bitmap_plot::x
(word) bitmap_plot::x#0 x zp ZP_WORD:5 3.0 (word) bitmap_plot::x#0 x zp ZP_WORD:3 3.0
(byte) bitmap_plot::y (byte) bitmap_plot::y
(byte) bitmap_plot::y#0 reg byte y 15.0 (byte) bitmap_plot::y#0 reg byte y 15.0
(byte[256]) bitmap_plot_bit (byte[256]) bitmap_plot_bit
@ -98,8 +98,8 @@
(byte[4]) delay (byte[4]) delay
(const byte[4]) delay#0 delay = { fill( 4, 0) } (const byte[4]) delay#0 delay = { fill( 4, 0) }
(signed word()) divr16s((signed word) divr16s::dividend , (signed word) divr16s::divisor , (signed word) divr16s::rem) (signed word()) divr16s((signed word) divr16s::dividend , (signed word) divr16s::divisor , (signed word) divr16s::rem)
(signed word~) divr16s::$11 $11 zp ZP_WORD:11 1.0 (signed word~) divr16s::$11 $11 zp ZP_WORD:9 1.0
(signed word~) divr16s::$7 $7 zp ZP_WORD:9 2.0 (signed word~) divr16s::$7 $7 zp ZP_WORD:7 2.0
(label) divr16s::@1 (label) divr16s::@1
(label) divr16s::@11 (label) divr16s::@11
(label) divr16s::@15 (label) divr16s::@15
@ -116,28 +116,28 @@
(word) divr16s::dividendu (word) divr16s::dividendu
(word) divr16s::dividendu#3 dividendu zp ZP_WORD:3 0.2857142857142857 (word) divr16s::dividendu#3 dividendu zp ZP_WORD:3 0.2857142857142857
(signed word) divr16s::divisor (signed word) divr16s::divisor
(signed word) divr16s::divisor#0 divisor zp ZP_WORD:11 0.6666666666666666 (signed word) divr16s::divisor#0 divisor zp ZP_WORD:9 0.6666666666666666
(word) divr16s::divisoru (word) divr16s::divisoru
(word) divr16s::divisoru#3 divisoru zp ZP_WORD:11 3.0 (word) divr16s::divisoru#3 divisoru zp ZP_WORD:9 3.0
(word~) divr16s::divisoru#4 divisoru zp ZP_WORD:11 4.0 (word~) divr16s::divisoru#4 divisoru zp ZP_WORD:9 4.0
(word~) divr16s::divisoru#5 divisoru zp ZP_WORD:11 4.0 (word~) divr16s::divisoru#5 divisoru zp ZP_WORD:9 4.0
(byte) divr16s::neg (byte) divr16s::neg
(byte) divr16s::neg#2 reg byte y 2.0 (byte) divr16s::neg#2 reg byte y 2.0
(byte) divr16s::neg#3 reg byte y 1.0 (byte) divr16s::neg#3 reg byte y 1.0
(byte) divr16s::neg#4 reg byte y 0.8571428571428571 (byte) divr16s::neg#4 reg byte y 0.8571428571428571
(signed word) divr16s::rem (signed word) divr16s::rem
(signed word) divr16s::rem#0 rem zp ZP_WORD:9 2.0 (signed word) divr16s::rem#0 rem zp ZP_WORD:7 2.0
(word) divr16s::remu (word) divr16s::remu
(word) divr16s::remu#3 remu zp ZP_WORD:9 0.6666666666666666 (word) divr16s::remu#3 remu zp ZP_WORD:7 0.6666666666666666
(word~) divr16s::remu#7 remu zp ZP_WORD:9 4.0 (word~) divr16s::remu#7 remu zp ZP_WORD:7 4.0
(word~) divr16s::remu#8 remu zp ZP_WORD:9 4.0 (word~) divr16s::remu#8 remu zp ZP_WORD:7 4.0
(word) divr16s::resultu (word) divr16s::resultu
(word) divr16s::resultu#0 resultu zp ZP_WORD:5 0.6666666666666666 (word) divr16s::resultu#0 resultu zp ZP_WORD:5 1.0
(signed word) divr16s::return (signed word) divr16s::return
(signed word) divr16s::return#1 return zp ZP_WORD:5 4.0 (signed word) divr16s::return#1 return zp ZP_WORD:5 4.0
(signed word) divr16s::return#2 return zp ZP_WORD:5 2.0 (signed word) divr16s::return#2 return zp ZP_WORD:5 2.0
(signed word) divr16s::return#3 return zp ZP_WORD:5 4.0 (signed word) divr16s::return#3 return zp ZP_WORD:5 4.0
(signed word~) divr16s::return#7 return zp ZP_WORD:5 2.0 (signed word~) divr16s::return#7 return zp ZP_WORD:5 4.0
(word()) divr16u((word) divr16u::dividend , (word) divr16u::divisor , (word) divr16u::rem) (word()) divr16u((word) divr16u::dividend , (word) divr16u::divisor , (word) divr16u::rem)
(byte~) divr16u::$1 reg byte a 202.0 (byte~) divr16u::$1 reg byte a 202.0
(byte~) divr16u::$2 reg byte a 202.0 (byte~) divr16u::$2 reg byte a 202.0
@ -152,7 +152,7 @@
(word) divr16u::dividend#1 dividend zp ZP_WORD:3 1.0 (word) divr16u::dividend#1 dividend zp ZP_WORD:3 1.0
(word) divr16u::dividend#2 dividend zp ZP_WORD:3 43.57142857142858 (word) divr16u::dividend#2 dividend zp ZP_WORD:3 43.57142857142858
(word) divr16u::divisor (word) divr16u::divisor
(word) divr16u::divisor#0 divisor zp ZP_WORD:11 11.333333333333332 (word) divr16u::divisor#0 divisor zp ZP_WORD:9 11.333333333333332
(byte) divr16u::i (byte) divr16u::i
(byte) divr16u::i#1 reg byte x 151.5 (byte) divr16u::i#1 reg byte x 151.5
(byte) divr16u::i#2 reg byte x 15.538461538461538 (byte) divr16u::i#2 reg byte x 15.538461538461538
@ -161,13 +161,13 @@
(word) divr16u::quotient#2 quotient zp ZP_WORD:5 101.0 (word) divr16u::quotient#2 quotient zp ZP_WORD:5 101.0
(word) divr16u::quotient#3 quotient zp ZP_WORD:5 25.25 (word) divr16u::quotient#3 quotient zp ZP_WORD:5 25.25
(word) divr16u::rem (word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:9 75.75 (word) divr16u::rem#0 rem zp ZP_WORD:7 75.75
(word) divr16u::rem#1 rem zp ZP_WORD:9 202.0 (word) divr16u::rem#1 rem zp ZP_WORD:7 202.0
(word) divr16u::rem#10 rem zp ZP_WORD:9 15.25 (word) divr16u::rem#2 rem zp ZP_WORD:7 202.0
(word) divr16u::rem#2 rem zp ZP_WORD:9 202.0 (word) divr16u::rem#3 rem zp ZP_WORD:7 2.0
(word) divr16u::rem#3 rem zp ZP_WORD:9 2.0 (word) divr16u::rem#4 rem zp ZP_WORD:7 204.0
(word) divr16u::rem#4 rem zp ZP_WORD:9 204.0 (word) divr16u::rem#5 rem zp ZP_WORD:7 101.0
(word) divr16u::rem#5 rem zp ZP_WORD:9 101.0 (word) divr16u::rem#9 rem zp ZP_WORD:7 101.0
(word) divr16u::return (word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:5 61.0 (word) divr16u::return#0 return zp ZP_WORD:5 61.0
(word) divr16u::return#2 return zp ZP_WORD:5 4.0 (word) divr16u::return#2 return zp ZP_WORD:5 4.0
@ -213,11 +213,11 @@
(void()) point_init((byte) point_init::point_idx) (void()) point_init((byte) point_init::point_idx)
(byte~) point_init::$13 reg byte a 4.0 (byte~) point_init::$13 reg byte a 4.0
(byte~) point_init::$14 reg byte a 2.0 (byte~) point_init::$14 reg byte a 2.0
(word~) point_init::$16 $16 zp ZP_WORD:5 4.0 (word~) point_init::$16 $16 zp ZP_WORD:3 4.0
(word~) point_init::$17 $17 zp ZP_WORD:5 4.0 (word~) point_init::$17 $17 zp ZP_WORD:3 4.0
(word~) point_init::$18 $18 zp ZP_WORD:5 4.0 (word~) point_init::$18 $18 zp ZP_WORD:3 4.0
(signed word~) point_init::$4 $4 zp ZP_WORD:14 2.0 (signed word~) point_init::$4 $4 zp ZP_WORD:7 2.0
(signed word~) point_init::$5 $5 zp ZP_WORD:5 4.0 (signed word~) point_init::$5 $5 zp ZP_WORD:3 4.0
(label) point_init::@1 (label) point_init::@1
(label) point_init::@10 (label) point_init::@10
(label) point_init::@11 (label) point_init::@11
@ -232,47 +232,38 @@
(bool~) point_init::abs16s1_$0 (bool~) point_init::abs16s1_$0
(word~) point_init::abs16s1_$1 (word~) point_init::abs16s1_$1
(signed word~) point_init::abs16s1_$2 (signed word~) point_init::abs16s1_$2
(signed word) point_init::abs16s1_$2#0 abs16s1_$2 zp ZP_WORD:5 2.0 (signed word) point_init::abs16s1_$2#0 abs16s1_$2 zp ZP_WORD:3 2.0
(word~) point_init::abs16s1_$3 (word~) point_init::abs16s1_$3
(label) point_init::abs16s1_@1 (label) point_init::abs16s1_@1
(label) point_init::abs16s1_@return (label) point_init::abs16s1_@return
(word) point_init::abs16s1_return (word) point_init::abs16s1_return
(word) point_init::abs16s1_return#2 abs16s1_return zp ZP_WORD:5 1.0 (word) point_init::abs16s1_return#2 abs16s1_return zp ZP_WORD:3 1.0
(word~) point_init::abs16s1_return#5 abs16s1_return zp ZP_WORD:5 4.0 (word~) point_init::abs16s1_return#5 abs16s1_return zp ZP_WORD:3 4.0
(word~) point_init::abs16s1_return#6 abs16s1_return zp ZP_WORD:5 4.0 (word~) point_init::abs16s1_return#6 abs16s1_return zp ZP_WORD:3 4.0
(signed word) point_init::abs16s1_w (signed word) point_init::abs16s1_w
(label) point_init::abs16s2 (label) point_init::abs16s2
(bool~) point_init::abs16s2_$0 (bool~) point_init::abs16s2_$0
(word~) point_init::abs16s2_$1 (word~) point_init::abs16s2_$1
(signed word~) point_init::abs16s2_$2 (signed word~) point_init::abs16s2_$2
(signed word) point_init::abs16s2_$2#0 abs16s2_$2 zp ZP_WORD:7 2.0 (signed word) point_init::abs16s2_$2#0 abs16s2_$2 zp ZP_WORD:5 2.0
(word~) point_init::abs16s2_$3 (word~) point_init::abs16s2_$3
(label) point_init::abs16s2_@1 (label) point_init::abs16s2_@1
(label) point_init::abs16s2_@return (label) point_init::abs16s2_@return
(word) point_init::abs16s2_return (word) point_init::abs16s2_return
(word) point_init::abs16s2_return#2 abs16s2_return zp ZP_WORD:7 6.0 (word) point_init::abs16s2_return#2 abs16s2_return zp ZP_WORD:5 6.0
(word~) point_init::abs16s2_return#5 abs16s2_return zp ZP_WORD:7 4.0 (word~) point_init::abs16s2_return#5 abs16s2_return zp ZP_WORD:5 4.0
(word~) point_init::abs16s2_return#6 abs16s2_return zp ZP_WORD:7 4.0 (word~) point_init::abs16s2_return#6 abs16s2_return zp ZP_WORD:5 4.0
(signed word) point_init::abs16s2_w (signed word) point_init::abs16s2_w
(byte) point_init::point_idx (byte) point_init::point_idx
(byte) point_init::point_idx#0 point_idx zp ZP_BYTE:2 0.6969696969696968 (byte) point_init::point_idx#0 point_idx zp ZP_BYTE:2 0.71875
(byte) point_init::point_idx1 (byte) point_init::point_idx1
(byte) point_init::point_idx1#0 point_idx1 zp ZP_BYTE:13 0.36363636363636365 (byte) point_init::point_idx1#0 point_idx1 zp ZP_BYTE:11 0.375
(signed word) point_init::x_diff (signed word) point_init::x_diff
(signed word) point_init::x_diff#1 x_diff zp ZP_WORD:11 0.5555555555555556 (signed word) point_init::x_diff#1 x_diff zp ZP_WORD:9 0.5555555555555556
(signed word) point_init::x_stepf (signed word) point_init::x_stepf
(signed word) point_init::x_stepf#0 x_stepf zp ZP_WORD:5 4.0 (signed word) point_init::x_stepf#0 x_stepf zp ZP_WORD:5 4.0
(signed word) point_init::y_diff (signed word) point_init::y_diff
(signed word) point_init::y_diff#0 y_diff zp ZP_WORD:14 0.5 (signed word) point_init::y_diff#0 y_diff zp ZP_WORD:7 0.5
(signed word) rem16s
(signed word) rem16s#13 rem16s zp ZP_WORD:3 0.9999999999999999
(signed word) rem16s#15 rem16s zp ZP_WORD:3 0.7222222222222223
(signed word) rem16s#2 rem16s zp ZP_WORD:3 2.0
(signed word) rem16s#3 rem16s zp ZP_WORD:3 0.75
(signed word~) rem16s#57 rem16s zp ZP_WORD:3 4.0
(word) rem16u
(word) rem16u#18 rem16u zp ZP_WORD:9 0.9999999999999999
(word) rem16u#21 rem16u zp ZP_WORD:9 0.7222222222222223
(void()) screen_fill((byte*) screen_fill::screen , (byte) screen_fill::ch) (void()) screen_fill((byte*) screen_fill::screen , (byte) screen_fill::ch)
(label) screen_fill::@1 (label) screen_fill::@1
(label) screen_fill::@2 (label) screen_fill::@2
@ -308,11 +299,10 @@
(const byte[4]) y_start#0 y_start = { (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 20 } (const byte[4]) y_start#0 y_start = { (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 20 }
zp ZP_BYTE:2 [ main::i#2 main::i#1 point_init::point_idx#0 screen_fill::y#4 screen_fill::y#1 bitmap_clear::y#4 bitmap_clear::y#1 bitmap_init::$3 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 point_init::point_idx#0 screen_fill::y#4 screen_fill::y#1 bitmap_clear::y#4 bitmap_clear::y#1 bitmap_init::$3 ]
zp ZP_WORD:3 [ rem16s#15 rem16s#13 rem16s#3 rem16s#2 rem16s#57 divr16s::dividendu#3 divr16u::dividend#2 divr16u::dividend#1 divr16u::dividend#0 screen_fill::screen#2 screen_fill::screen#3 screen_fill::screen#1 bitmap_clear::bitmap#2 bitmap_clear::bitmap#3 bitmap_clear::bitmap#5 bitmap_clear::bitmap#1 bitmap_clear::$3 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] zp ZP_WORD:3 [ point_init::abs16s1_return#2 point_init::abs16s1_return#5 point_init::abs16s1_return#6 point_init::abs16s1_$2#0 divr16s::dividendu#3 divr16u::dividend#2 divr16u::dividend#1 divr16u::dividend#0 screen_fill::screen#2 screen_fill::screen#3 screen_fill::screen#1 bitmap_clear::bitmap#2 bitmap_clear::bitmap#3 bitmap_clear::bitmap#5 bitmap_clear::bitmap#1 bitmap_clear::$3 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 bitmap_plot::x#0 point_init::$5 point_init::$16 point_init::$17 point_init::$18 ]
zp ZP_WORD:5 [ point_init::abs16s1_return#2 point_init::abs16s1_return#5 point_init::abs16s1_return#6 point_init::abs16s1_$2#0 divr16s::return#2 divr16s::return#1 divr16s::return#7 divr16s::resultu#0 divr16s::return#3 divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 point_init::x_stepf#0 bitmap_plot::x#0 point_init::$5 point_init::$16 point_init::$17 point_init::$18 ] zp ZP_WORD:5 [ point_init::abs16s2_return#2 point_init::abs16s2_return#5 point_init::abs16s2_return#6 point_init::abs16s2_$2#0 divr16s::return#2 divr16s::return#1 divr16s::return#7 divr16s::resultu#0 divr16s::return#3 divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 point_init::x_stepf#0 bitmap_plot::$3 bitmap_plot::plotter#1 ]
zp ZP_WORD:7 [ point_init::abs16s2_return#2 point_init::abs16s2_return#5 point_init::abs16s2_return#6 point_init::abs16s2_$2#0 bitmap_plot::$3 bitmap_plot::plotter#1 ] zp ZP_WORD:7 [ divr16s::remu#3 divr16s::remu#7 divr16s::remu#8 divr16u::rem#4 divr16u::rem#3 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 divr16s::rem#0 divr16s::$7 point_init::$4 point_init::y_diff#0 bitmap_plot::$1 ]
zp ZP_WORD:9 [ divr16s::remu#3 divr16s::remu#7 divr16s::remu#8 divr16u::rem#4 divr16u::rem#3 rem16u#21 rem16u#18 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 divr16s::rem#0 divr16s::$7 ] zp ZP_WORD:9 [ divr16s::divisoru#3 divr16s::divisoru#4 divr16s::divisoru#5 divr16s::divisor#0 divr16u::divisor#0 divr16s::$11 point_init::x_diff#1 ]
zp ZP_WORD:11 [ divr16s::divisoru#3 divr16s::divisoru#4 divr16s::divisoru#5 divr16s::divisor#0 divr16u::divisor#0 divr16s::$11 point_init::x_diff#1 bitmap_plot::$1 ]
reg byte y [ divr16s::neg#4 divr16s::neg#2 divr16s::neg#3 ] reg byte y [ divr16s::neg#4 divr16s::neg#2 divr16s::neg#3 ]
reg byte x [ divr16u::i#2 divr16u::i#1 ] reg byte x [ divr16u::i#2 divr16u::i#1 ]
reg byte x [ screen_fill::x#2 screen_fill::x#1 ] reg byte x [ screen_fill::x#2 screen_fill::x#1 ]
@ -323,8 +313,7 @@ reg byte x [ bitmap_init::y#2 bitmap_init::y#1 ]
reg byte x [ main::$9 ] reg byte x [ main::$9 ]
reg byte y [ bitmap_plot::y#0 ] reg byte y [ bitmap_plot::y#0 ]
reg byte a [ bitmap_plot::$2 ] reg byte a [ bitmap_plot::$2 ]
zp ZP_BYTE:13 [ point_init::point_idx1#0 ] zp ZP_BYTE:11 [ point_init::point_idx1#0 ]
zp ZP_WORD:14 [ point_init::$4 point_init::y_diff#0 ]
reg byte a [ point_init::$13 ] reg byte a [ point_init::$13 ]
reg byte a [ point_init::$14 ] reg byte a [ point_init::$14 ]
reg byte a [ divr16u::$1 ] reg byte a [ divr16u::$1 ]

View File

@ -1,33 +1,17 @@
.pc = $801 "Basic" .pc = $801 "Basic"
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
.label w1 = 4
.label w2 = 2
jsr main jsr main
main: { main: {
lda #<0
sta w1
sta w1+1
jsr incw1 jsr incw1
lda #<0
sta w2
sta w2+1
jsr incw2 jsr incw2
jsr incw1 jsr incw1
jsr incw2 jsr incw2
rts rts
} }
incw2: { incw2: {
inc w2
bne !+
inc w2+1
!:
rts rts
} }
incw1: { incw1: {
inc w1
bne !+
inc w1+1
!:
rts rts
} }

View File

@ -9,34 +9,32 @@
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @3 main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
[5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] ) [5] call incw1 [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1: scope:[main] from main
[6] phi() [ w1#11 ] ( main:2 [ w1#11 ] ) [6] phi() [ ] ( main:2 [ ] )
[7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] ) [7] call incw2 [ ] ( main:2 [ ] )
to:main::@2 to:main::@2
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
[8] phi() [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] ) [8] phi() [ ] ( main:2 [ ] )
[9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] ) [9] call incw1 [ ] ( main:2 [ ] )
to:main::@3 to:main::@3
main::@3: scope:[main] from main::@2 main::@3: scope:[main] from main::@2
[10] phi() [ w2#11 ] ( main:2 [ w2#11 ] ) [10] phi() [ ] ( main:2 [ ] )
[11] call incw2 [ ] ( main:2 [ ] ) [11] call incw2 [ ] ( main:2 [ ] )
to:main::@return to:main::@return
main::@return: scope:[main] from main::@3 main::@return: scope:[main] from main::@3
[12] return [ ] ( main:2 [ ] ) [12] return [ ] ( main:2 [ ] )
to:@return to:@return
incw2: scope:[incw2] from main::@1 main::@3 incw2: scope:[incw2] from main::@1 main::@3
[13] (word) w2#10 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/(word) w2#11 ) [ w2#10 ] ( main:2::incw2:7 [ w1#11 w2#10 ] main:2::incw2:11 [ w2#10 ] ) [13] phi() [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
[14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
to:incw2::@return to:incw2::@return
incw2::@return: scope:[incw2] from incw2 incw2::@return: scope:[incw2] from incw2
[15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
to:@return to:@return
incw1: scope:[incw1] from main main::@2 incw1: scope:[incw1] from main main::@2
[16] (word) w1#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(word) w1#11 ) [ w1#10 ] ( main:2::incw1:5 [ w1#10 ] main:2::incw1:9 [ w2#11 w1#10 ] ) [15] phi() [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
[17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
to:incw1::@return to:incw1::@return
incw1::@return: scope:[incw1] from incw1 incw1::@return: scope:[incw1] from incw1
[18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
to:@return to:@return

View File

@ -76,90 +76,54 @@ incw2::@return: scope:[incw2] from incw2
to:@end to:@end
@end: scope:[] from @3 @end: scope:[] from @3
Eliminating unused variable (word) w1 and assignment [0] (word) w1 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (word) w2 and assignment [1] (word) w2 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable - keeping the call (void~) main::$0 Eliminating unused variable - keeping the call (void~) main::$0
Eliminating unused variable - keeping the call (void~) main::$1 Eliminating unused variable - keeping the call (void~) main::$1
Eliminating unused variable - keeping the call (void~) main::$2 Eliminating unused variable - keeping the call (void~) main::$2
Eliminating unused variable - keeping the call (void~) main::$3 Eliminating unused variable - keeping the call (void~) main::$3
Eliminating unused variable w1(null) and assignment [7] w1(null) ← ++ w1(null)
Eliminating unused variable w2(null) and assignment [9] w2(null) ← ++ w2(null)
Removing empty block @1 Removing empty block @1
Removing empty block @2 Removing empty block @2
PROCEDURE MODIFY VARIABLE ANALYSIS PROCEDURE MODIFY VARIABLE ANALYSIS
main modifies w1
main modifies w2
incw1 modifies w1
incw2 modifies w2
Completing Phi functions...
Completing Phi functions...
Completing Phi functions... Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from @begin: scope:[] from
(word) w1#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(word) w2#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:@3 to:@3
main: scope:[main] from @3 main: scope:[main] from @3
(word) w2#16 ← phi( @3/(word) w2#15 )
(word) w1#13 ← phi( @3/(word) w1#16 )
call incw1 call incw1
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1: scope:[main] from main
(word) w2#13 ← phi( main/(word) w2#16 )
(word) w1#7 ← phi( main/(word) w1#5 )
(word) w1#1 ← (word) w1#7
call incw2 call incw2
to:main::@2 to:main::@2
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
(word) w1#14 ← phi( main::@1/(word) w1#1 )
(word) w2#7 ← phi( main::@1/(word) w2#5 )
(word) w2#1 ← (word) w2#7
call incw1 call incw1
to:main::@3 to:main::@3
main::@3: scope:[main] from main::@2 main::@3: scope:[main] from main::@2
(word) w2#14 ← phi( main::@2/(word) w2#1 )
(word) w1#8 ← phi( main::@2/(word) w1#5 )
(word) w1#2 ← (word) w1#8
call incw2 call incw2
to:main::@4 to:main::@4
main::@4: scope:[main] from main::@3 main::@4: scope:[main] from main::@3
(word) w1#15 ← phi( main::@3/(word) w1#2 )
(word) w2#8 ← phi( main::@3/(word) w2#5 )
(word) w2#2 ← (word) w2#8
to:main::@return to:main::@return
main::@return: scope:[main] from main::@4 main::@return: scope:[main] from main::@4
(word) w2#9 ← phi( main::@4/(word) w2#2 )
(word) w1#9 ← phi( main::@4/(word) w1#15 )
(word) w1#3 ← (word) w1#9
(word) w2#3 ← (word) w2#9
return return
to:@return to:@return
incw1: scope:[incw1] from main main::@2 incw1: scope:[incw1] from main main::@2
(word) w1#10 ← phi( main/(word) w1#13 main::@2/(word) w1#14 )
(word) w1#4 ← ++ (word) w1#10
to:incw1::@return to:incw1::@return
incw1::@return: scope:[incw1] from incw1 incw1::@return: scope:[incw1] from incw1
(word) w1#11 ← phi( incw1/(word) w1#4 )
(word) w1#5 ← (word) w1#11
return return
to:@return to:@return
incw2: scope:[incw2] from main::@1 main::@3 incw2: scope:[incw2] from main::@1 main::@3
(word) w2#10 ← phi( main::@1/(word) w2#13 main::@3/(word) w2#14 )
(word) w2#4 ← ++ (word) w2#10
to:incw2::@return to:incw2::@return
incw2::@return: scope:[incw2] from incw2 incw2::@return: scope:[incw2] from incw2
(word) w2#11 ← phi( incw2/(word) w2#4 )
(word) w2#5 ← (word) w2#11
return return
to:@return to:@return
@3: scope:[] from @begin @3: scope:[] from @begin
(word) w2#15 ← phi( @begin/(word) w2#0 )
(word) w1#16 ← phi( @begin/(word) w1#0 )
call main call main
to:@4 to:@4
@4: scope:[] from @3 @4: scope:[] from @3
(word) w2#12 ← phi( @3/(word) w2#3 )
(word) w1#12 ← phi( @3/(word) w1#3 )
(word) w1#6 ← (word) w1#12
(word) w2#6 ← (word) w2#12
to:@end to:@end
@end: scope:[] from @4 @end: scope:[] from @4
@ -178,99 +142,12 @@ SYMBOL TABLE SSA
(label) main::@3 (label) main::@3
(label) main::@4 (label) main::@4
(label) main::@return (label) main::@return
(word) w1
(word) w1#0
(word) w1#1
(word) w1#10
(word) w1#11
(word) w1#12
(word) w1#13
(word) w1#14
(word) w1#15
(word) w1#16
(word) w1#2
(word) w1#3
(word) w1#4
(word) w1#5
(word) w1#6
(word) w1#7
(word) w1#8
(word) w1#9
(word) w2
(word) w2#0
(word) w2#1
(word) w2#10
(word) w2#11
(word) w2#12
(word) w2#13
(word) w2#14
(word) w2#15
(word) w2#16
(word) w2#2
(word) w2#3
(word) w2#4
(word) w2#5
(word) w2#6
(word) w2#7
(word) w2#8
(word) w2#9
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Not aliassing across scopes: w1#13 w1#16
Not aliassing across scopes: w2#16 w2#15
Not aliassing across scopes: w1#7 w1#5
Not aliassing across scopes: w2#7 w2#5
Not aliassing across scopes: w1#8 w1#5
Not aliassing across scopes: w2#8 w2#5
Not aliassing across scopes: w1#10 w1#13
Not aliassing across scopes: w2#10 w2#13
Not aliassing across scopes: w1#12 w1#3
Not aliassing across scopes: w2#12 w2#3
Alias (word) w2#13 = (word) w2#16
Alias (word) w1#1 = (word) w1#7 (word) w1#14
Alias (word) w2#1 = (word) w2#7 (word) w2#14
Alias (word) w1#15 = (word) w1#2 (word) w1#8 (word) w1#9 (word) w1#3
Alias (word) w2#2 = (word) w2#8 (word) w2#9 (word) w2#3
Alias (word) w1#11 = (word) w1#4 (word) w1#5
Alias (word) w2#11 = (word) w2#4 (word) w2#5
Alias (word) w1#0 = (word) w1#16
Alias (word) w2#0 = (word) w2#15
Alias (word) w1#12 = (word) w1#6
Alias (word) w2#12 = (word) w2#6
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: w1#13 w1#0
Not aliassing across scopes: w2#13 w2#0
Not aliassing across scopes: w1#1 w1#11
Not aliassing across scopes: w2#1 w2#11
Not aliassing across scopes: w1#15 w1#11
Not aliassing across scopes: w2#2 w2#11
Not aliassing across scopes: w1#10 w1#13
Not aliassing across scopes: w2#10 w2#13
Not aliassing across scopes: w1#12 w1#15
Not aliassing across scopes: w2#12 w2#2
Redundant Phi (word) w1#13 (word) w1#0
Redundant Phi (word) w2#13 (word) w2#0
Redundant Phi (word) w1#1 (word) w1#11
Redundant Phi (word) w2#1 (word) w2#11
Redundant Phi (word) w1#15 (word) w1#11
Redundant Phi (word) w2#2 (word) w2#11
Redundant Phi (word) w1#12 (word) w1#15
Redundant Phi (word) w2#12 (word) w2#2
Succesful SSA optimization Pass2RedundantPhiElimination
Constant (const word) w1#0 = 0
Constant (const word) w2#0 = 0
Succesful SSA optimization Pass2ConstantIdentification
Culled Empty Block (label) main::@4 Culled Empty Block (label) main::@4
Culled Empty Block (label) @4 Culled Empty Block (label) @4
Succesful SSA optimization Pass2CullEmptyBlocks Succesful SSA optimization Pass2CullEmptyBlocks
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const word) w1#0
Inlining constant with var siblings (const word) w1#0
Inlining constant with var siblings (const word) w2#0
Inlining constant with var siblings (const word) w2#0
Constant inlined w1#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined w2#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
@ -278,32 +155,27 @@ Adding NOP phi() at start of @3
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::@1 Adding NOP phi() at start of main::@1
CALL GRAPH
Calls in [] to main:2
Calls in [main] to incw1:5 incw2:7 incw1:9 incw2:11
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced [8] w1#17 ← w1#11
Coalesced [10] w2#17 ← w2#11
Coalesced down to 2 phi equivalence classes
Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2 Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@3 Adding NOP phi() at start of main::@3
Adding NOP phi() at start of incw2
Adding NOP phi() at start of incw1
CALL GRAPH
Calls in [] to main:2
Calls in [main] to incw1:5 incw2:7 incw1:9 incw2:11
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Created 0 initial phi equivalence classes
Propagating live ranges... Coalesced down to 0 phi equivalence classes
Propagating live ranges... Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Propagating live ranges... Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of incw2
Adding NOP phi() at start of incw1
Propagating live ranges... Propagating live ranges...
FINAL CONTROL FLOW GRAPH FINAL CONTROL FLOW GRAPH
@ -318,36 +190,34 @@ FINAL CONTROL FLOW GRAPH
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @3 main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
[5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] ) [5] call incw1 [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1: scope:[main] from main
[6] phi() [ w1#11 ] ( main:2 [ w1#11 ] ) [6] phi() [ ] ( main:2 [ ] )
[7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] ) [7] call incw2 [ ] ( main:2 [ ] )
to:main::@2 to:main::@2
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
[8] phi() [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] ) [8] phi() [ ] ( main:2 [ ] )
[9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] ) [9] call incw1 [ ] ( main:2 [ ] )
to:main::@3 to:main::@3
main::@3: scope:[main] from main::@2 main::@3: scope:[main] from main::@2
[10] phi() [ w2#11 ] ( main:2 [ w2#11 ] ) [10] phi() [ ] ( main:2 [ ] )
[11] call incw2 [ ] ( main:2 [ ] ) [11] call incw2 [ ] ( main:2 [ ] )
to:main::@return to:main::@return
main::@return: scope:[main] from main::@3 main::@return: scope:[main] from main::@3
[12] return [ ] ( main:2 [ ] ) [12] return [ ] ( main:2 [ ] )
to:@return to:@return
incw2: scope:[incw2] from main::@1 main::@3 incw2: scope:[incw2] from main::@1 main::@3
[13] (word) w2#10 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/(word) w2#11 ) [ w2#10 ] ( main:2::incw2:7 [ w1#11 w2#10 ] main:2::incw2:11 [ w2#10 ] ) [13] phi() [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
[14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
to:incw2::@return to:incw2::@return
incw2::@return: scope:[incw2] from incw2 incw2::@return: scope:[incw2] from incw2
[15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
to:@return to:@return
incw1: scope:[incw1] from main main::@2 incw1: scope:[incw1] from main main::@2
[16] (word) w1#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(word) w1#11 ) [ w1#10 ] ( main:2::incw1:5 [ w1#10 ] main:2::incw1:9 [ w2#11 w1#10 ] ) [15] phi() [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
[17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
to:incw1::@return to:incw1::@return
incw1::@return: scope:[incw1] from incw1 incw1::@return: scope:[incw1] from incw1
[18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
to:@return to:@return
DOMINATORS DOMINATORS
@ -377,21 +247,9 @@ VARIABLE REGISTER WEIGHTS
(void()) incw1() (void()) incw1()
(void()) incw2() (void()) incw2()
(void()) main() (void()) main()
(word) w1
(word) w1#10 4.0
(word) w1#11 0.6666666666666666
(word) w2
(word) w2#10 4.0
(word) w2#11 0.6666666666666666
Initial phi equivalence classes Initial phi equivalence classes
[ w2#10 w2#11 ]
[ w1#10 w1#11 ]
Complete equivalence classes Complete equivalence classes
[ w2#10 w2#11 ]
[ w1#10 w1#11 ]
Allocated zp ZP_WORD:2 [ w2#10 w2#11 ]
Allocated zp ZP_WORD:4 [ w1#10 w1#11 ]
INITIAL ASM INITIAL ASM
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -399,8 +257,6 @@ INITIAL ASM
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
//SEG1 Global Constants & labels //SEG1 Global Constants & labels
.label w1 = 4
.label w2 = 2
//SEG2 @begin //SEG2 @begin
bbegin: bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3] //SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
@ -419,96 +275,72 @@ bend_from_b3:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] ) //SEG10 [5] call incw1 [ ] ( main:2 [ ] )
//SEG11 [16] phi from main to incw1 [phi:main->incw1] //SEG11 [15] phi from main to incw1 [phi:main->incw1]
incw1_from_main: incw1_from_main:
//SEG12 [16] phi (word) w1#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->incw1#0] -- vwuz1=vbuc1
lda #<0
sta w1
lda #>0
sta w1+1
jsr incw1 jsr incw1
//SEG13 [6] phi from main to main::@1 [phi:main->main::@1] //SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
b1_from_main: b1_from_main:
jmp b1 jmp b1
//SEG14 main::@1 //SEG13 main::@1
b1: b1:
//SEG15 [7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] ) //SEG14 [7] call incw2 [ ] ( main:2 [ ] )
//SEG16 [13] phi from main::@1 to incw2 [phi:main::@1->incw2] //SEG15 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
incw2_from_b1: incw2_from_b1:
//SEG17 [13] phi (word) w2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->incw2#0] -- vwuz1=vbuc1
lda #<0
sta w2
lda #>0
sta w2+1
jsr incw2 jsr incw2
//SEG18 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] //SEG16 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1: b2_from_b1:
jmp b2 jmp b2
//SEG19 main::@2 //SEG17 main::@2
b2: b2:
//SEG20 [9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] ) //SEG18 [9] call incw1 [ ] ( main:2 [ ] )
//SEG21 [16] phi from main::@2 to incw1 [phi:main::@2->incw1] //SEG19 [15] phi from main::@2 to incw1 [phi:main::@2->incw1]
incw1_from_b2: incw1_from_b2:
//SEG22 [16] phi (word) w1#10 = (word) w1#11 [phi:main::@2->incw1#0] -- register_copy
jsr incw1 jsr incw1
//SEG23 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3] //SEG20 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
b3_from_b2: b3_from_b2:
jmp b3 jmp b3
//SEG24 main::@3 //SEG21 main::@3
b3: b3:
//SEG25 [11] call incw2 [ ] ( main:2 [ ] ) //SEG22 [11] call incw2 [ ] ( main:2 [ ] )
//SEG26 [13] phi from main::@3 to incw2 [phi:main::@3->incw2] //SEG23 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
incw2_from_b3: incw2_from_b3:
//SEG27 [13] phi (word) w2#10 = (word) w2#11 [phi:main::@3->incw2#0] -- register_copy
jsr incw2 jsr incw2
jmp breturn jmp breturn
//SEG28 main::@return //SEG24 main::@return
breturn: breturn:
//SEG29 [12] return [ ] ( main:2 [ ] ) //SEG25 [12] return [ ] ( main:2 [ ] )
rts rts
} }
//SEG30 incw2 //SEG26 incw2
incw2: { incw2: {
//SEG31 [14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) -- vwuz1=_inc_vwuz1
inc w2
bne !+
inc w2+1
!:
jmp breturn jmp breturn
//SEG32 incw2::@return //SEG27 incw2::@return
breturn: breturn:
//SEG33 [15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) //SEG28 [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
rts rts
} }
//SEG34 incw1 //SEG29 incw1
incw1: { incw1: {
//SEG35 [17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) -- vwuz1=_inc_vwuz1
inc w1
bne !+
inc w1+1
!:
jmp breturn jmp breturn
//SEG36 incw1::@return //SEG30 incw1::@return
breturn: breturn:
//SEG37 [18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) //SEG31 [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
rts rts
} }
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_WORD:2 [ w2#10 w2#11 ] : zp ZP_WORD:2 ,
Potential registers zp ZP_WORD:4 [ w1#10 w1#11 ] : zp ZP_WORD:4 ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [] 4.67: zp ZP_WORD:2 [ w2#10 w2#11 ] 4.67: zp ZP_WORD:4 [ w1#10 w1#11 ]
Uplift Scope [main] Uplift Scope [main]
Uplift Scope [incw1] Uplift Scope [incw1]
Uplift Scope [incw2] Uplift Scope [incw2]
Uplift Scope []
Uplifting [] best 116 combination zp ZP_WORD:2 [ w2#10 w2#11 ] zp ZP_WORD:4 [ w1#10 w1#11 ] Uplifting [main] best 126 combination
Uplifting [main] best 116 combination Uplifting [incw1] best 126 combination
Uplifting [incw1] best 116 combination Uplifting [incw2] best 126 combination
Uplifting [incw2] best 116 combination Uplifting [] best 126 combination
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -516,8 +348,6 @@ ASSEMBLER BEFORE OPTIMIZATION
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
//SEG1 Global Constants & labels //SEG1 Global Constants & labels
.label w1 = 4
.label w2 = 2
//SEG2 @begin //SEG2 @begin
bbegin: bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3] //SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
@ -536,79 +366,57 @@ bend_from_b3:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] ) //SEG10 [5] call incw1 [ ] ( main:2 [ ] )
//SEG11 [16] phi from main to incw1 [phi:main->incw1] //SEG11 [15] phi from main to incw1 [phi:main->incw1]
incw1_from_main: incw1_from_main:
//SEG12 [16] phi (word) w1#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->incw1#0] -- vwuz1=vbuc1
lda #<0
sta w1
lda #>0
sta w1+1
jsr incw1 jsr incw1
//SEG13 [6] phi from main to main::@1 [phi:main->main::@1] //SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
b1_from_main: b1_from_main:
jmp b1 jmp b1
//SEG14 main::@1 //SEG13 main::@1
b1: b1:
//SEG15 [7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] ) //SEG14 [7] call incw2 [ ] ( main:2 [ ] )
//SEG16 [13] phi from main::@1 to incw2 [phi:main::@1->incw2] //SEG15 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
incw2_from_b1: incw2_from_b1:
//SEG17 [13] phi (word) w2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->incw2#0] -- vwuz1=vbuc1
lda #<0
sta w2
lda #>0
sta w2+1
jsr incw2 jsr incw2
//SEG18 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] //SEG16 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1: b2_from_b1:
jmp b2 jmp b2
//SEG19 main::@2 //SEG17 main::@2
b2: b2:
//SEG20 [9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] ) //SEG18 [9] call incw1 [ ] ( main:2 [ ] )
//SEG21 [16] phi from main::@2 to incw1 [phi:main::@2->incw1] //SEG19 [15] phi from main::@2 to incw1 [phi:main::@2->incw1]
incw1_from_b2: incw1_from_b2:
//SEG22 [16] phi (word) w1#10 = (word) w1#11 [phi:main::@2->incw1#0] -- register_copy
jsr incw1 jsr incw1
//SEG23 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3] //SEG20 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
b3_from_b2: b3_from_b2:
jmp b3 jmp b3
//SEG24 main::@3 //SEG21 main::@3
b3: b3:
//SEG25 [11] call incw2 [ ] ( main:2 [ ] ) //SEG22 [11] call incw2 [ ] ( main:2 [ ] )
//SEG26 [13] phi from main::@3 to incw2 [phi:main::@3->incw2] //SEG23 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
incw2_from_b3: incw2_from_b3:
//SEG27 [13] phi (word) w2#10 = (word) w2#11 [phi:main::@3->incw2#0] -- register_copy
jsr incw2 jsr incw2
jmp breturn jmp breturn
//SEG28 main::@return //SEG24 main::@return
breturn: breturn:
//SEG29 [12] return [ ] ( main:2 [ ] ) //SEG25 [12] return [ ] ( main:2 [ ] )
rts rts
} }
//SEG30 incw2 //SEG26 incw2
incw2: { incw2: {
//SEG31 [14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) -- vwuz1=_inc_vwuz1
inc w2
bne !+
inc w2+1
!:
jmp breturn jmp breturn
//SEG32 incw2::@return //SEG27 incw2::@return
breturn: breturn:
//SEG33 [15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) //SEG28 [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
rts rts
} }
//SEG34 incw1 //SEG29 incw1
incw1: { incw1: {
//SEG35 [17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) -- vwuz1=_inc_vwuz1
inc w1
bne !+
inc w1+1
!:
jmp breturn jmp breturn
//SEG36 incw1::@return //SEG30 incw1::@return
breturn: breturn:
//SEG37 [18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) //SEG31 [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
rts rts
} }
@ -622,9 +430,6 @@ Removing instruction jmp breturn
Removing instruction jmp breturn Removing instruction jmp breturn
Removing instruction jmp breturn Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #>0
Removing instruction lda #>0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction bbegin: Removing instruction bbegin:
Removing instruction b3_from_bbegin: Removing instruction b3_from_bbegin:
Removing instruction main_from_b3: Removing instruction main_from_b3:
@ -660,27 +465,17 @@ FINAL SYMBOL TABLE
(label) main::@2 (label) main::@2
(label) main::@3 (label) main::@3
(label) main::@return (label) main::@return
(word) w1
(word) w1#10 w1 zp ZP_WORD:4 4.0
(word) w1#11 w1 zp ZP_WORD:4 0.6666666666666666
(word) w2
(word) w2#10 w2 zp ZP_WORD:2 4.0
(word) w2#11 w2 zp ZP_WORD:2 0.6666666666666666
zp ZP_WORD:2 [ w2#10 w2#11 ]
zp ZP_WORD:4 [ w1#10 w1#11 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 88 Score: 48
//SEG0 Basic Upstart //SEG0 Basic Upstart
.pc = $801 "Basic" .pc = $801 "Basic"
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
//SEG1 Global Constants & labels //SEG1 Global Constants & labels
.label w1 = 4
.label w2 = 2
//SEG2 @begin //SEG2 @begin
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3] //SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
//SEG4 @3 //SEG4 @3
@ -691,58 +486,38 @@ Score: 88
//SEG8 @end //SEG8 @end
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] ) //SEG10 [5] call incw1 [ ] ( main:2 [ ] )
//SEG11 [16] phi from main to incw1 [phi:main->incw1] //SEG11 [15] phi from main to incw1 [phi:main->incw1]
//SEG12 [16] phi (word) w1#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->incw1#0] -- vwuz1=vbuc1
lda #<0
sta w1
sta w1+1
jsr incw1 jsr incw1
//SEG13 [6] phi from main to main::@1 [phi:main->main::@1] //SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
//SEG14 main::@1 //SEG13 main::@1
//SEG15 [7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] ) //SEG14 [7] call incw2 [ ] ( main:2 [ ] )
//SEG16 [13] phi from main::@1 to incw2 [phi:main::@1->incw2] //SEG15 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
//SEG17 [13] phi (word) w2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->incw2#0] -- vwuz1=vbuc1
lda #<0
sta w2
sta w2+1
jsr incw2 jsr incw2
//SEG18 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] //SEG16 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG19 main::@2 //SEG17 main::@2
//SEG20 [9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] ) //SEG18 [9] call incw1 [ ] ( main:2 [ ] )
//SEG21 [16] phi from main::@2 to incw1 [phi:main::@2->incw1] //SEG19 [15] phi from main::@2 to incw1 [phi:main::@2->incw1]
//SEG22 [16] phi (word) w1#10 = (word) w1#11 [phi:main::@2->incw1#0] -- register_copy
jsr incw1 jsr incw1
//SEG23 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3] //SEG20 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
//SEG24 main::@3 //SEG21 main::@3
//SEG25 [11] call incw2 [ ] ( main:2 [ ] ) //SEG22 [11] call incw2 [ ] ( main:2 [ ] )
//SEG26 [13] phi from main::@3 to incw2 [phi:main::@3->incw2] //SEG23 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
//SEG27 [13] phi (word) w2#10 = (word) w2#11 [phi:main::@3->incw2#0] -- register_copy
jsr incw2 jsr incw2
//SEG28 main::@return //SEG24 main::@return
//SEG29 [12] return [ ] ( main:2 [ ] ) //SEG25 [12] return [ ] ( main:2 [ ] )
rts rts
} }
//SEG30 incw2 //SEG26 incw2
incw2: { incw2: {
//SEG31 [14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) -- vwuz1=_inc_vwuz1 //SEG27 incw2::@return
inc w2 //SEG28 [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
bne !+
inc w2+1
!:
//SEG32 incw2::@return
//SEG33 [15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
rts rts
} }
//SEG34 incw1 //SEG29 incw1
incw1: { incw1: {
//SEG35 [17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) -- vwuz1=_inc_vwuz1 //SEG30 incw1::@return
inc w1 //SEG31 [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
bne !+
inc w1+1
!:
//SEG36 incw1::@return
//SEG37 [18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
rts rts
} }

View File

@ -10,12 +10,4 @@
(label) main::@2 (label) main::@2
(label) main::@3 (label) main::@3
(label) main::@return (label) main::@return
(word) w1
(word) w1#10 w1 zp ZP_WORD:4 4.0
(word) w1#11 w1 zp ZP_WORD:4 0.6666666666666666
(word) w2
(word) w2#10 w2 zp ZP_WORD:2 4.0
(word) w2#11 w2 zp ZP_WORD:2 0.6666666666666666
zp ZP_WORD:2 [ w2#10 w2#11 ]
zp ZP_WORD:4 [ w1#10 w1#11 ]

View File

@ -3,7 +3,6 @@
.pc = $80d "Program" .pc = $80d "Program"
jsr main jsr main
main: { main: {
ldx #0
lda #$64 lda #$64
b1: b1:
sec sec
@ -14,11 +13,6 @@ main: {
b2: b2:
cmp #$32 cmp #$32
beq !+ beq !+
bcs b4
!: !:
dex
jmp b1
b4:
inx
jmp b1 jmp b1
} }

View File

@ -10,21 +10,17 @@
main: scope:[main] from @1 main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@4 main::@8 main::@1: scope:[main] from main main::@2 main::@4
[5] (byte) main::s#3 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/(byte) main::s#1 main::@8/(byte) main::s#2 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] ) [5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@2/(byte) main::i#1 main::@4/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@4/(byte) main::i#1 main::@8/(byte) main::i#1 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] ) [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
to:main::@return to:main::@return
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
[8] return [ ] ( main:2 [ ] ) [8] return [ ] ( main:2 [ ] )
to:@return to:@return
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
[9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@8
main::@8: scope:[main] from main::@2
[10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] )
to:main::@1 to:main::@1
main::@4: scope:[main] from main::@2 main::@4: scope:[main] from main::@2
[11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) [10] phi() [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1 to:main::@1

View File

@ -77,15 +77,18 @@ main::@return: scope:[main] from main::@3
to:@end to:@end
@end: scope:[] from @1 @end: scope:[] from @1
Eliminating unused variable (byte) main::s and assignment [1] (byte) main::s ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable main::s(null) and assignment [7] main::s(null) ← ++ main::s(null)
Eliminating unused variable main::s(null) and assignment [8] main::s(null) ← -- main::s(null)
Removing empty block main::@6 Removing empty block main::@6
Removing empty block main::@3 Removing empty block main::@3
Removing empty block main::@7 Removing empty block main::@7
Removing empty block main::@8
Removing empty block main::@5 Removing empty block main::@5
Removing empty block main::@9 Removing empty block main::@9
Removing empty block main::@10 Removing empty block main::@10
PROCEDURE MODIFY VARIABLE ANALYSIS PROCEDURE MODIFY VARIABLE ANALYSIS
Completing Phi functions...
Completing Phi functions... Completing Phi functions...
Completing Phi functions... Completing Phi functions...
@ -94,30 +97,20 @@ CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
to:@1 to:@1
main: scope:[main] from @1 main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 100 (byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 100
(byte) main::s#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@4 main::@8 main::@1: scope:[main] from main main::@2 main::@4
(byte) main::s#6 ← phi( main/(byte) main::s#0 main::@4/(byte) main::s#1 main::@8/(byte) main::s#2 ) (byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#3 main::@4/(byte) main::i#4 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@4/(byte) main::i#4 main::@8/(byte) main::i#5 )
(byte) main::i#1 ← -- (byte) main::i#2 (byte) main::i#1 ← -- (byte) main::i#2
(bool~) main::$0 ← (byte) main::i#1 > (byte/signed byte/word/signed word/dword/signed dword) 0 (bool~) main::$0 ← (byte) main::i#1 > (byte/signed byte/word/signed word/dword/signed dword) 0
if((bool~) main::$0) goto main::@2 if((bool~) main::$0) goto main::@2
to:main::@return to:main::@return
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
(byte) main::s#5 ← phi( main::@1/(byte) main::s#6 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#1 ) (byte) main::i#3 ← phi( main::@1/(byte) main::i#1 )
(bool~) main::$1 ← (byte) main::i#3 > (byte/signed byte/word/signed word/dword/signed dword) 50 (bool~) main::$1 ← (byte) main::i#3 > (byte/signed byte/word/signed word/dword/signed dword) 50
if((bool~) main::$1) goto main::@4 if((bool~) main::$1) goto main::@4
to:main::@8 to:main::@1
main::@4: scope:[main] from main::@2 main::@4: scope:[main] from main::@2
(byte) main::i#4 ← phi( main::@2/(byte) main::i#3 ) (byte) main::i#4 ← phi( main::@2/(byte) main::i#3 )
(byte) main::s#3 ← phi( main::@2/(byte) main::s#5 )
(byte) main::s#1 ← ++ (byte) main::s#3
to:main::@1
main::@8: scope:[main] from main::@2
(byte) main::i#5 ← phi( main::@2/(byte) main::i#3 )
(byte) main::s#4 ← phi( main::@2/(byte) main::s#5 )
(byte) main::s#2 ← -- (byte) main::s#4
to:main::@1 to:main::@1
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
return return
@ -140,7 +133,6 @@ SYMBOL TABLE SSA
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
(label) main::@4 (label) main::@4
(label) main::@8
(label) main::@return (label) main::@return
(byte) main::i (byte) main::i
(byte) main::i#0 (byte) main::i#0
@ -148,39 +140,26 @@ SYMBOL TABLE SSA
(byte) main::i#2 (byte) main::i#2
(byte) main::i#3 (byte) main::i#3
(byte) main::i#4 (byte) main::i#4
(byte) main::i#5
(byte) main::s
(byte) main::s#0
(byte) main::s#1
(byte) main::s#2
(byte) main::s#3
(byte) main::s#4
(byte) main::s#5
(byte) main::s#6
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) @2 Culled Empty Block (label) @2
Succesful SSA optimization Pass2CullEmptyBlocks Succesful SSA optimization Pass2CullEmptyBlocks
Alias (byte) main::i#1 = (byte) main::i#3 (byte) main::i#4 (byte) main::i#5 Alias (byte) main::i#1 = (byte) main::i#3 (byte) main::i#4
Alias (byte) main::s#3 = (byte) main::s#5 (byte) main::s#6 (byte) main::s#4
Succesful SSA optimization Pass2AliasElimination Succesful SSA optimization Pass2AliasElimination
Simple Condition (bool~) main::$0 if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 Simple Condition (bool~) main::$0 if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2
Simple Condition (bool~) main::$1 if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 Simple Condition (bool~) main::$1 if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4
Succesful SSA optimization Pass2ConditionalJumpSimplification Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) main::i#0 = 100 Constant (const byte) main::i#0 = 100
Constant (const byte) main::s#0 = 0
Succesful SSA optimization Pass2ConstantIdentification Succesful SSA optimization Pass2ConstantIdentification
Not culling empty block because it shares successor with its predecessor. (label) main::@4
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) main::i#0 Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::i#0 Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::s#0
Inlining constant with var siblings (const byte) main::s#0
Inlining constant with var siblings (const byte) main::s#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 100 Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 100
Constant inlined main::s#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@8 main::@4 Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@4
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@8 main::@4 Added new block during phi lifting main::@11(between main::@2 and main::@1)
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@11 main::@4
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
@ -190,23 +169,18 @@ Calls in [] to main:2
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Created 1 initial phi equivalence classes
Propagating live ranges... Coalesced [10] main::i#5 ← main::i#1
Propagating live ranges... Coalesced (already) [11] main::i#6 ← main::i#1
Created 2 initial phi equivalence classes Coalesced down to 1 phi equivalence classes
Coalesced [11] main::i#7 ← main::i#1 Culled Empty Block (label) main::@11
Coalesced [12] main::s#8 ← main::s#2 Not culling empty block because it shares successor with its predecessor. (label) main::@4
Coalesced (already) [14] main::i#6 ← main::i#1 Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@4
Coalesced [15] main::s#7 ← main::s#1
Coalesced down to 2 phi equivalence classes
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@8 main::@4
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
Propagating live ranges... Adding NOP phi() at start of main::@4
Propagating live ranges...
Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
@ -223,23 +197,19 @@ FINAL CONTROL FLOW GRAPH
main: scope:[main] from @1 main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@4 main::@8 main::@1: scope:[main] from main main::@2 main::@4
[5] (byte) main::s#3 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/(byte) main::s#1 main::@8/(byte) main::s#2 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] ) [5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@2/(byte) main::i#1 main::@4/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@4/(byte) main::i#1 main::@8/(byte) main::i#1 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] ) [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
to:main::@return to:main::@return
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
[8] return [ ] ( main:2 [ ] ) [8] return [ ] ( main:2 [ ] )
to:@return to:@return
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
[9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@8
main::@8: scope:[main] from main::@2
[10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] )
to:main::@1 to:main::@1
main::@4: scope:[main] from main::@2 main::@4: scope:[main] from main::@2
[11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) [10] phi() [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1 to:main::@1
DOMINATORS DOMINATORS
@ -250,42 +220,36 @@ main dominated by @1 @begin main
main::@1 dominated by @1 @begin main::@1 main main::@1 dominated by @1 @begin main::@1 main
main::@return dominated by main::@return @1 @begin main::@1 main main::@return dominated by main::@return @1 @begin main::@1 main
main::@2 dominated by @1 @begin main::@1 main::@2 main main::@2 dominated by @1 @begin main::@1 main::@2 main
main::@8 dominated by @1 @begin main::@8 main::@1 main::@2 main
main::@4 dominated by @1 @begin main::@1 main::@2 main main::@4 main::@4 dominated by @1 @begin main::@1 main::@2 main main::@4
NATURAL LOOPS NATURAL LOOPS
Found back edge: Loop head: main::@1 tails: main::@8 blocks: null Found back edge: Loop head: main::@1 tails: main::@2 blocks: null
Found back edge: Loop head: main::@1 tails: main::@4 blocks: null Found back edge: Loop head: main::@1 tails: main::@4 blocks: null
Populated: Loop head: main::@1 tails: main::@8 blocks: main::@8 main::@2 main::@1 Populated: Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Populated: Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1 Populated: Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1
Coalesced: Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4 Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4 Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1
NATURAL LOOPS WITH DEPTH NATURAL LOOPS WITH DEPTH
Found 0 loops in scope [] Found 0 loops in scope []
Found 1 loops in scope [main] Found 2 loops in scope [main]
Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4 Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4 depth: 1 Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 depth: 2
Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1 depth: 1
VARIABLE REGISTER WEIGHTS VARIABLE REGISTER WEIGHTS
(void()) main() (void()) main()
(byte) main::i (byte) main::i
(byte) main::i#1 11.0 (byte) main::i#1 103.75
(byte) main::i#2 33.0 (byte) main::i#2 213.0
(byte) main::s
(byte) main::s#1 22.0
(byte) main::s#2 22.0
(byte) main::s#3 11.0
Initial phi equivalence classes Initial phi equivalence classes
[ main::i#2 main::i#1 ] [ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Complete equivalence classes Complete equivalence classes
[ main::i#2 main::i#1 ] [ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ] Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::s#3 main::s#1 main::s#2 ]
INITIAL ASM INITIAL ASM
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -312,64 +276,54 @@ bend:
//SEG9 main //SEG9 main
main: { main: {
.label i = 2 .label i = 2
.label s = 3
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main: b1_from_main:
//SEG11 [5] phi (byte) main::s#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta s
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#1] -- vbuz1=vbuc1
lda #$64 lda #$64
sta i sta i
jmp b1 jmp b1
//SEG13 main::@1 //SEG12 main::@1
b1: b1:
//SEG14 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuz1=_dec_vbuz1 //SEG13 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_dec_vbuz1
dec i dec i
//SEG15 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuz1_gt_0_then_la1 //SEG14 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_gt_0_then_la1
lda i lda i
bne b2 bne b2
jmp breturn jmp breturn
//SEG16 main::@return //SEG15 main::@return
breturn: breturn:
//SEG17 [8] return [ ] ( main:2 [ ] ) //SEG16 [8] return [ ] ( main:2 [ ] )
rts rts
//SEG18 main::@2 //SEG17 main::@2
b2: b2:
//SEG19 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuz1_gt_vbuc1_then_la1 //SEG18 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_gt_vbuc1_then_la1
lda i lda i
cmp #$32 cmp #$32
beq !+ beq !+
bcs b4 bcs b4_from_b2
!: !:
jmp b8 //SEG19 [5] phi from main::@2 main::@4 to main::@1 [phi:main::@2/main::@4->main::@1]
//SEG20 main::@8 b1_from_b2:
b8:
//SEG21 [10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] ) -- vbuz1=_dec_vbuz1
dec s
//SEG22 [5] phi from main::@4 main::@8 to main::@1 [phi:main::@4/main::@8->main::@1]
b1_from_b4: b1_from_b4:
b1_from_b8: //SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2/main::@4->main::@1#0] -- register_copy
//SEG23 [5] phi (byte) main::s#3 = (byte) main::s#1 [phi:main::@4/main::@8->main::@1#0] -- register_copy
//SEG24 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4/main::@8->main::@1#1] -- register_copy
jmp b1 jmp b1
//SEG25 main::@4 //SEG21 [10] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
b4_from_b2:
jmp b4
//SEG22 main::@4
b4: b4:
//SEG26 [11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) -- vbuz1=_inc_vbuz1
inc s
jmp b1_from_b4 jmp b1_from_b4
} }
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::s#3 main::s#1 main::s#2 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [main] 55: zp ZP_BYTE:3 [ main::s#3 main::s#1 main::s#2 ] 44: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] Uplift Scope [main] 316.75: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope [] Uplift Scope []
Uplifting [main] best 403 combination reg byte x [ main::s#3 main::s#1 main::s#2 ] reg byte a [ main::i#2 main::i#1 ] Uplifting [main] best 2728 combination reg byte a [ main::i#2 main::i#1 ]
Uplifting [] best 403 combination Uplifting [] best 2728 combination
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -397,46 +351,39 @@ bend:
main: { main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main: b1_from_main:
//SEG11 [5] phi (byte) main::s#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#0] -- vbuaa=vbuc1
ldx #0
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#1] -- vbuaa=vbuc1
lda #$64 lda #$64
jmp b1 jmp b1
//SEG13 main::@1 //SEG12 main::@1
b1: b1:
//SEG14 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa=_dec_vbuaa //SEG13 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa=_dec_vbuaa
sec sec
sbc #1 sbc #1
//SEG15 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_0_then_la1 //SEG14 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_0_then_la1
cmp #0 cmp #0
bne b2 bne b2
jmp breturn jmp breturn
//SEG16 main::@return //SEG15 main::@return
breturn: breturn:
//SEG17 [8] return [ ] ( main:2 [ ] ) //SEG16 [8] return [ ] ( main:2 [ ] )
rts rts
//SEG18 main::@2 //SEG17 main::@2
b2: b2:
//SEG19 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1 //SEG18 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1
cmp #$32 cmp #$32
beq !+ beq !+
bcs b4 bcs b4_from_b2
!: !:
jmp b8 //SEG19 [5] phi from main::@2 main::@4 to main::@1 [phi:main::@2/main::@4->main::@1]
//SEG20 main::@8 b1_from_b2:
b8:
//SEG21 [10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] ) -- vbuxx=_dec_vbuxx
dex
//SEG22 [5] phi from main::@4 main::@8 to main::@1 [phi:main::@4/main::@8->main::@1]
b1_from_b4: b1_from_b4:
b1_from_b8: //SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2/main::@4->main::@1#0] -- register_copy
//SEG23 [5] phi (byte) main::s#3 = (byte) main::s#1 [phi:main::@4/main::@8->main::@1#0] -- register_copy
//SEG24 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4/main::@8->main::@1#1] -- register_copy
jmp b1 jmp b1
//SEG25 main::@4 //SEG21 [10] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
b4_from_b2:
jmp b4
//SEG22 main::@4
b4: b4:
//SEG26 [11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) -- vbuxx=_inc_vbuxx
inx
jmp b1_from_b4 jmp b1_from_b4
} }
@ -445,27 +392,33 @@ Removing instruction jmp b1
Removing instruction jmp bend Removing instruction jmp bend
Removing instruction jmp b1 Removing instruction jmp b1
Removing instruction jmp breturn Removing instruction jmp breturn
Removing instruction jmp b8 Removing instruction jmp b4
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1_from_b4 with b1_from_b8 Replacing label b4_from_b2 with b4
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_b4: Removing instruction b1_from_b2:
Removing instruction b4_from_b2:
Succesful ASM optimization Pass5RedundantLabelElimination Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b1: Removing instruction b1:
Removing instruction bend: Removing instruction bend:
Removing instruction b1_from_main: Removing instruction b1_from_main:
Removing instruction breturn: Removing instruction breturn:
Removing instruction b8:
Succesful ASM optimization Pass5UnusedLabelElimination Succesful ASM optimization Pass5UnusedLabelElimination
Skipping double jump to b1 in jmp b1_from_b8 Skipping double jump to b1_from_b4 in bcs b4
Skipping double jump to b1 in jmp b1_from_b4
Succesful ASM optimization Pass5DoubleJumpElimination Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label b1_from_b8 to b3 Relabelling long label b1_from_b4 to b3
Succesful ASM optimization Pass5RelabelLongLabels Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction bcs b3
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction b3: Removing instruction b3:
Removing instruction b4:
Succesful ASM optimization Pass5UnusedLabelElimination Succesful ASM optimization Pass5UnusedLabelElimination
Removing unreachable instruction jmp b1
Succesful ASM optimization Pass5UnreachableCodeElimination
FINAL SYMBOL TABLE FINAL SYMBOL TABLE
(label) @1 (label) @1
@ -475,22 +428,16 @@ FINAL SYMBOL TABLE
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
(label) main::@4 (label) main::@4
(label) main::@8
(label) main::@return (label) main::@return
(byte) main::i (byte) main::i
(byte) main::i#1 reg byte a 11.0 (byte) main::i#1 reg byte a 103.75
(byte) main::i#2 reg byte a 33.0 (byte) main::i#2 reg byte a 213.0
(byte) main::s
(byte) main::s#1 reg byte x 22.0
(byte) main::s#2 reg byte x 22.0
(byte) main::s#3 reg byte x 11.0
reg byte a [ main::i#2 main::i#1 ] reg byte a [ main::i#2 main::i#1 ]
reg byte x [ main::s#3 main::s#1 main::s#2 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 307 Score: 1812
//SEG0 Basic Upstart //SEG0 Basic Upstart
.pc = $801 "Basic" .pc = $801 "Basic"
@ -508,39 +455,29 @@ Score: 307
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1] //SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (byte) main::s#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 //SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#0] -- vbuaa=vbuc1
ldx #0
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#1] -- vbuaa=vbuc1
lda #$64 lda #$64
//SEG13 main::@1 //SEG12 main::@1
b1: b1:
//SEG14 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa=_dec_vbuaa //SEG13 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa=_dec_vbuaa
sec sec
sbc #1 sbc #1
//SEG15 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_0_then_la1 //SEG14 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_0_then_la1
cmp #0 cmp #0
bne b2 bne b2
//SEG16 main::@return //SEG15 main::@return
//SEG17 [8] return [ ] ( main:2 [ ] ) //SEG16 [8] return [ ] ( main:2 [ ] )
rts rts
//SEG18 main::@2 //SEG17 main::@2
b2: b2:
//SEG19 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1 //SEG18 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1
cmp #$32 cmp #$32
beq !+ beq !+
bcs b4
!: !:
//SEG20 main::@8 //SEG19 [5] phi from main::@2 main::@4 to main::@1 [phi:main::@2/main::@4->main::@1]
//SEG21 [10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] ) -- vbuxx=_dec_vbuxx //SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2/main::@4->main::@1#0] -- register_copy
dex
//SEG22 [5] phi from main::@4 main::@8 to main::@1 [phi:main::@4/main::@8->main::@1]
//SEG23 [5] phi (byte) main::s#3 = (byte) main::s#1 [phi:main::@4/main::@8->main::@1#0] -- register_copy
//SEG24 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4/main::@8->main::@1#1] -- register_copy
jmp b1
//SEG25 main::@4
b4:
//SEG26 [11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) -- vbuxx=_inc_vbuxx
inx
jmp b1 jmp b1
//SEG21 [10] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
//SEG22 main::@4
} }

View File

@ -5,15 +5,9 @@
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
(label) main::@4 (label) main::@4
(label) main::@8
(label) main::@return (label) main::@return
(byte) main::i (byte) main::i
(byte) main::i#1 reg byte a 11.0 (byte) main::i#1 reg byte a 103.75
(byte) main::i#2 reg byte a 33.0 (byte) main::i#2 reg byte a 213.0
(byte) main::s
(byte) main::s#1 reg byte x 22.0
(byte) main::s#2 reg byte x 22.0
(byte) main::s#3 reg byte x 11.0
reg byte a [ main::i#2 main::i#1 ] reg byte a [ main::i#2 main::i#1 ]
reg byte x [ main::s#3 main::s#1 main::s#2 ]

View File

@ -2,26 +2,18 @@
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
.label SCREEN = $400 .label SCREEN = $400
.label cnt = 2
jsr main jsr main
main: { main: {
ldx #0 ldx #0
ldy #0
txa
jsr inccnt jsr inccnt
sta SCREEN+0 sta SCREEN+0
lda cnt inx
clc
adc #1
jsr inccnt jsr inccnt
sta SCREEN+1 sta SCREEN+1
rts rts
} }
inccnt: { inccnt: {
clc
adc #1
sta cnt
iny
inx inx
txa
rts rts
} }

View File

@ -9,13 +9,13 @@
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @2 main: scope:[main] from @2
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
[5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
[6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ) [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1: scope:[main] from main
[7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ) [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
[8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] )
[9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] )
[10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] ) [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
[11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
to:main::@2 to:main::@2
@ -27,14 +27,10 @@ main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] ) [14] return [ ] ( main:2 [ ] )
to:@return to:@return
inccnt: scope:[inccnt] from main main::@1 inccnt: scope:[inccnt] from main main::@1
[15] (byte) cnt3#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt3#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] ) [15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 ] ( main:2::inccnt:5 [ cnt#11 ] main:2::inccnt:10 [ cnt#11 ] )
[15] (byte) cnt2#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt2#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] ) [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] )
[15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] ) [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
[16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] )
[17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] )
[18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] )
[19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
to:inccnt::@return to:inccnt::@return
inccnt::@return: scope:[inccnt] from inccnt inccnt::@return: scope:[inccnt] from inccnt
[20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
to:@return to:@return

View File

@ -79,15 +79,15 @@ inccnt::@1: scope:[inccnt] from
to:@end to:@end
@end: scope:[] from @2 @end: scope:[] from @2
Eliminating unused variable (byte) cnt2 and assignment [1] (byte) cnt2 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (byte) cnt3 and assignment [2] (byte) cnt3 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable cnt2(null) and assignment [11] cnt2(null) ← ++ cnt2(null)
Eliminating unused variable cnt3(null) and assignment [12] cnt3(null) ← ++ cnt3(null)
Removing empty block @1 Removing empty block @1
Removing empty block inccnt::@1 Removing empty block inccnt::@1
PROCEDURE MODIFY VARIABLE ANALYSIS PROCEDURE MODIFY VARIABLE ANALYSIS
main modifies cnt main modifies cnt
main modifies cnt2
main modifies cnt3
inccnt modifies cnt inccnt modifies cnt
inccnt modifies cnt2
inccnt modifies cnt3
Completing Phi functions... Completing Phi functions...
Completing Phi functions... Completing Phi functions...
@ -95,84 +95,54 @@ Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from @begin: scope:[] from
(byte) cnt#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 (byte) cnt#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) cnt2#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) cnt3#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte[256]) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024 (byte[256]) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
to:@2 to:@2
main: scope:[main] from @2 main: scope:[main] from @2
(byte) cnt3#13 ← phi( @2/(byte) cnt3#14 )
(byte) cnt2#13 ← phi( @2/(byte) cnt2#14 )
(byte) cnt#14 ← phi( @2/(byte) cnt#15 ) (byte) cnt#14 ← phi( @2/(byte) cnt#15 )
call inccnt call inccnt
(byte) inccnt::return#0 ← (byte) inccnt::return#3 (byte) inccnt::return#0 ← (byte) inccnt::return#3
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1: scope:[main] from main
(byte) cnt3#7 ← phi( main/(byte) cnt3#5 )
(byte) cnt2#7 ← phi( main/(byte) cnt2#5 )
(byte) cnt#8 ← phi( main/(byte) cnt#6 ) (byte) cnt#8 ← phi( main/(byte) cnt#6 )
(byte) inccnt::return#4 ← phi( main/(byte) inccnt::return#0 ) (byte) inccnt::return#4 ← phi( main/(byte) inccnt::return#0 )
(byte~) main::$0 ← (byte) inccnt::return#4 (byte~) main::$0 ← (byte) inccnt::return#4
(byte) cnt#1 ← (byte) cnt#8 (byte) cnt#1 ← (byte) cnt#8
(byte) cnt2#1 ← (byte) cnt2#7
(byte) cnt3#1 ← (byte) cnt3#7
*((byte[256]) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 *((byte[256]) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0
(byte) cnt#2 ← ++ (byte) cnt#1 (byte) cnt#2 ← ++ (byte) cnt#1
call inccnt call inccnt
(byte) inccnt::return#1 ← (byte) inccnt::return#3 (byte) inccnt::return#1 ← (byte) inccnt::return#3
to:main::@2 to:main::@2
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
(byte) cnt3#8 ← phi( main::@1/(byte) cnt3#5 )
(byte) cnt2#8 ← phi( main::@1/(byte) cnt2#5 )
(byte) cnt#9 ← phi( main::@1/(byte) cnt#6 ) (byte) cnt#9 ← phi( main::@1/(byte) cnt#6 )
(byte) inccnt::return#5 ← phi( main::@1/(byte) inccnt::return#1 ) (byte) inccnt::return#5 ← phi( main::@1/(byte) inccnt::return#1 )
(byte~) main::$1 ← (byte) inccnt::return#5 (byte~) main::$1 ← (byte) inccnt::return#5
(byte) cnt#3 ← (byte) cnt#9 (byte) cnt#3 ← (byte) cnt#9
(byte) cnt2#2 ← (byte) cnt2#8
(byte) cnt3#2 ← (byte) cnt3#8
*((byte[256]) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 *((byte[256]) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1
to:main::@return to:main::@return
main::@return: scope:[main] from main::@2 main::@return: scope:[main] from main::@2
(byte) cnt3#9 ← phi( main::@2/(byte) cnt3#2 )
(byte) cnt2#9 ← phi( main::@2/(byte) cnt2#2 )
(byte) cnt#10 ← phi( main::@2/(byte) cnt#3 ) (byte) cnt#10 ← phi( main::@2/(byte) cnt#3 )
(byte) cnt#4 ← (byte) cnt#10 (byte) cnt#4 ← (byte) cnt#10
(byte) cnt2#3 ← (byte) cnt2#9
(byte) cnt3#3 ← (byte) cnt3#9
return return
to:@return to:@return
inccnt: scope:[inccnt] from main main::@1 inccnt: scope:[inccnt] from main main::@1
(byte) cnt3#10 ← phi( main/(byte) cnt3#13 main::@1/(byte) cnt3#1 )
(byte) cnt2#10 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#1 )
(byte) cnt#11 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#2 ) (byte) cnt#11 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#2 )
(byte) cnt#5 ← ++ (byte) cnt#11 (byte) cnt#5 ← ++ (byte) cnt#11
(byte) cnt2#4 ← ++ (byte) cnt2#10
(byte) cnt3#4 ← ++ (byte) cnt3#10
(byte) inccnt::return#2 ← (byte) cnt#5 (byte) inccnt::return#2 ← (byte) cnt#5
to:inccnt::@return to:inccnt::@return
inccnt::@return: scope:[inccnt] from inccnt inccnt::@return: scope:[inccnt] from inccnt
(byte) cnt3#11 ← phi( inccnt/(byte) cnt3#4 )
(byte) cnt2#11 ← phi( inccnt/(byte) cnt2#4 )
(byte) cnt#12 ← phi( inccnt/(byte) cnt#5 ) (byte) cnt#12 ← phi( inccnt/(byte) cnt#5 )
(byte) inccnt::return#6 ← phi( inccnt/(byte) inccnt::return#2 ) (byte) inccnt::return#6 ← phi( inccnt/(byte) inccnt::return#2 )
(byte) inccnt::return#3 ← (byte) inccnt::return#6 (byte) inccnt::return#3 ← (byte) inccnt::return#6
(byte) cnt#6 ← (byte) cnt#12 (byte) cnt#6 ← (byte) cnt#12
(byte) cnt2#5 ← (byte) cnt2#11
(byte) cnt3#5 ← (byte) cnt3#11
return return
to:@return to:@return
@2: scope:[] from @begin @2: scope:[] from @begin
(byte) cnt3#14 ← phi( @begin/(byte) cnt3#0 )
(byte) cnt2#14 ← phi( @begin/(byte) cnt2#0 )
(byte) cnt#15 ← phi( @begin/(byte) cnt#0 ) (byte) cnt#15 ← phi( @begin/(byte) cnt#0 )
call main call main
to:@3 to:@3
@3: scope:[] from @2 @3: scope:[] from @2
(byte) cnt3#12 ← phi( @2/(byte) cnt3#3 )
(byte) cnt2#12 ← phi( @2/(byte) cnt2#3 )
(byte) cnt#13 ← phi( @2/(byte) cnt#4 ) (byte) cnt#13 ← phi( @2/(byte) cnt#4 )
(byte) cnt#7 ← (byte) cnt#13 (byte) cnt#7 ← (byte) cnt#13
(byte) cnt2#6 ← (byte) cnt2#12
(byte) cnt3#6 ← (byte) cnt3#12
to:@end to:@end
@end: scope:[] from @3 @end: scope:[] from @3
@ -200,38 +170,6 @@ SYMBOL TABLE SSA
(byte) cnt#7 (byte) cnt#7
(byte) cnt#8 (byte) cnt#8
(byte) cnt#9 (byte) cnt#9
(byte) cnt2
(byte) cnt2#0
(byte) cnt2#1
(byte) cnt2#10
(byte) cnt2#11
(byte) cnt2#12
(byte) cnt2#13
(byte) cnt2#14
(byte) cnt2#2
(byte) cnt2#3
(byte) cnt2#4
(byte) cnt2#5
(byte) cnt2#6
(byte) cnt2#7
(byte) cnt2#8
(byte) cnt2#9
(byte) cnt3
(byte) cnt3#0
(byte) cnt3#1
(byte) cnt3#10
(byte) cnt3#11
(byte) cnt3#12
(byte) cnt3#13
(byte) cnt3#14
(byte) cnt3#2
(byte) cnt3#3
(byte) cnt3#4
(byte) cnt3#5
(byte) cnt3#6
(byte) cnt3#7
(byte) cnt3#8
(byte) cnt3#9
(byte()) inccnt() (byte()) inccnt()
(label) inccnt::@return (label) inccnt::@return
(byte) inccnt::return (byte) inccnt::return
@ -251,80 +189,40 @@ SYMBOL TABLE SSA
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Not aliassing across scopes: cnt#14 cnt#15 Not aliassing across scopes: cnt#14 cnt#15
Not aliassing across scopes: cnt2#13 cnt2#14
Not aliassing across scopes: cnt3#13 cnt3#14
Not aliassing across scopes: inccnt::return#0 inccnt::return#3 Not aliassing across scopes: inccnt::return#0 inccnt::return#3
Not aliassing across scopes: cnt#8 cnt#6 Not aliassing across scopes: cnt#8 cnt#6
Not aliassing across scopes: cnt2#7 cnt2#5
Not aliassing across scopes: cnt3#7 cnt3#5
Not aliassing across scopes: main::$0 inccnt::return#4 Not aliassing across scopes: main::$0 inccnt::return#4
Not aliassing across scopes: inccnt::return#1 inccnt::return#3 Not aliassing across scopes: inccnt::return#1 inccnt::return#3
Not aliassing across scopes: cnt#9 cnt#6 Not aliassing across scopes: cnt#9 cnt#6
Not aliassing across scopes: cnt2#8 cnt2#5
Not aliassing across scopes: cnt3#8 cnt3#5
Not aliassing across scopes: main::$1 inccnt::return#5 Not aliassing across scopes: main::$1 inccnt::return#5
Not aliassing across scopes: cnt#11 cnt#14 Not aliassing across scopes: cnt#11 cnt#14
Not aliassing across scopes: cnt2#10 cnt2#13
Not aliassing across scopes: cnt3#10 cnt3#13
Not aliassing across scopes: inccnt::return#2 cnt#5 Not aliassing across scopes: inccnt::return#2 cnt#5
Not aliassing across scopes: cnt#13 cnt#4 Not aliassing across scopes: cnt#13 cnt#4
Not aliassing across scopes: cnt2#12 cnt2#3
Not aliassing across scopes: cnt3#12 cnt3#3
Alias (byte) inccnt::return#0 = (byte) inccnt::return#4 Alias (byte) inccnt::return#0 = (byte) inccnt::return#4
Alias (byte) cnt#1 = (byte) cnt#8 Alias (byte) cnt#1 = (byte) cnt#8
Alias (byte) cnt2#1 = (byte) cnt2#7
Alias (byte) cnt3#1 = (byte) cnt3#7
Alias (byte) inccnt::return#1 = (byte) inccnt::return#5 Alias (byte) inccnt::return#1 = (byte) inccnt::return#5
Alias (byte) cnt#10 = (byte) cnt#3 (byte) cnt#9 (byte) cnt#4 Alias (byte) cnt#10 = (byte) cnt#3 (byte) cnt#9 (byte) cnt#4
Alias (byte) cnt2#2 = (byte) cnt2#8 (byte) cnt2#9 (byte) cnt2#3
Alias (byte) cnt3#2 = (byte) cnt3#8 (byte) cnt3#9 (byte) cnt3#3
Alias (byte) inccnt::return#2 = (byte) inccnt::return#6 (byte) inccnt::return#3 Alias (byte) inccnt::return#2 = (byte) inccnt::return#6 (byte) inccnt::return#3
Alias (byte) cnt#12 = (byte) cnt#5 (byte) cnt#6 Alias (byte) cnt#12 = (byte) cnt#5 (byte) cnt#6
Alias (byte) cnt2#11 = (byte) cnt2#4 (byte) cnt2#5
Alias (byte) cnt3#11 = (byte) cnt3#4 (byte) cnt3#5
Alias (byte) cnt#0 = (byte) cnt#15 Alias (byte) cnt#0 = (byte) cnt#15
Alias (byte) cnt2#0 = (byte) cnt2#14
Alias (byte) cnt3#0 = (byte) cnt3#14
Alias (byte) cnt#13 = (byte) cnt#7 Alias (byte) cnt#13 = (byte) cnt#7
Alias (byte) cnt2#12 = (byte) cnt2#6
Alias (byte) cnt3#12 = (byte) cnt3#6
Succesful SSA optimization Pass2AliasElimination Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: cnt#14 cnt#0 Not aliassing across scopes: cnt#14 cnt#0
Not aliassing across scopes: cnt2#13 cnt2#0
Not aliassing across scopes: cnt3#13 cnt3#0
Not aliassing across scopes: inccnt::return#0 inccnt::return#2 Not aliassing across scopes: inccnt::return#0 inccnt::return#2
Not aliassing across scopes: cnt#1 cnt#12 Not aliassing across scopes: cnt#1 cnt#12
Not aliassing across scopes: cnt2#1 cnt2#11
Not aliassing across scopes: cnt3#1 cnt3#11
Not aliassing across scopes: main::$0 inccnt::return#0 Not aliassing across scopes: main::$0 inccnt::return#0
Not aliassing across scopes: inccnt::return#1 inccnt::return#2 Not aliassing across scopes: inccnt::return#1 inccnt::return#2
Not aliassing across scopes: cnt#10 cnt#12 Not aliassing across scopes: cnt#10 cnt#12
Not aliassing across scopes: cnt2#2 cnt2#11
Not aliassing across scopes: cnt3#2 cnt3#11
Not aliassing across scopes: main::$1 inccnt::return#1 Not aliassing across scopes: main::$1 inccnt::return#1
Not aliassing across scopes: cnt#11 cnt#14 Not aliassing across scopes: cnt#11 cnt#14
Not aliassing across scopes: cnt2#10 cnt2#13
Not aliassing across scopes: cnt3#10 cnt3#13
Not aliassing across scopes: inccnt::return#2 cnt#12 Not aliassing across scopes: inccnt::return#2 cnt#12
Not aliassing across scopes: cnt#13 cnt#10 Not aliassing across scopes: cnt#13 cnt#10
Not aliassing across scopes: cnt2#12 cnt2#2
Not aliassing across scopes: cnt3#12 cnt3#2
Redundant Phi (byte) cnt#14 (byte) cnt#0 Redundant Phi (byte) cnt#14 (byte) cnt#0
Redundant Phi (byte) cnt2#13 (byte) cnt2#0
Redundant Phi (byte) cnt3#13 (byte) cnt3#0
Redundant Phi (byte) cnt#1 (byte) cnt#12 Redundant Phi (byte) cnt#1 (byte) cnt#12
Redundant Phi (byte) cnt2#1 (byte) cnt2#11
Redundant Phi (byte) cnt3#1 (byte) cnt3#11
Redundant Phi (byte) cnt#10 (byte) cnt#12 Redundant Phi (byte) cnt#10 (byte) cnt#12
Redundant Phi (byte) cnt2#2 (byte) cnt2#11
Redundant Phi (byte) cnt3#2 (byte) cnt3#11
Redundant Phi (byte) cnt#13 (byte) cnt#10 Redundant Phi (byte) cnt#13 (byte) cnt#10
Redundant Phi (byte) cnt2#12 (byte) cnt2#2
Redundant Phi (byte) cnt3#12 (byte) cnt3#2
Succesful SSA optimization Pass2RedundantPhiElimination Succesful SSA optimization Pass2RedundantPhiElimination
Constant (const byte) cnt#0 = 0 Constant (const byte) cnt#0 = 0
Constant (const byte) cnt2#0 = 0
Constant (const byte) cnt3#0 = 0
Constant (const byte[256]) SCREEN#0 = ((byte*))1024 Constant (const byte[256]) SCREEN#0 = ((byte*))1024
Succesful SSA optimization Pass2ConstantIdentification Succesful SSA optimization Pass2ConstantIdentification
Consolidated array index constant in *(SCREEN#0+0) Consolidated array index constant in *(SCREEN#0+0)
@ -346,13 +244,7 @@ OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) cnt#0 Inlining constant with var siblings (const byte) cnt#0
Inlining constant with var siblings (const byte) cnt#0 Inlining constant with var siblings (const byte) cnt#0
Inlining constant with var siblings (const byte) cnt#0 Inlining constant with var siblings (const byte) cnt#0
Inlining constant with var siblings (const byte) cnt2#0
Inlining constant with var siblings (const byte) cnt2#0
Inlining constant with var siblings (const byte) cnt3#0
Inlining constant with var siblings (const byte) cnt3#0
Constant inlined cnt#0 = (byte/signed byte/word/signed word/dword/signed dword) 0 Constant inlined cnt#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined cnt3#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined cnt2#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return
@ -362,7 +254,7 @@ Adding NOP phi() at start of @end
Adding NOP phi() at start of main Adding NOP phi() at start of main
CALL GRAPH CALL GRAPH
Calls in [] to main:2 Calls in [] to main:2
Calls in [main] to inccnt:5 inccnt:13 Calls in [main] to inccnt:5 inccnt:11
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
@ -370,15 +262,9 @@ Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Created 1 initial phi equivalence classes
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 3 initial phi equivalence classes
Coalesced [10] cnt#16 ← cnt#2 Coalesced [10] cnt#16 ← cnt#2
Coalesced [11] cnt2#15 ← cnt2#11 Coalesced down to 1 phi equivalence classes
Coalesced [12] cnt3#15 ← cnt3#11
Coalesced down to 3 phi equivalence classes
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2 Adding NOP phi() at start of @2
@ -390,9 +276,6 @@ Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
FINAL CONTROL FLOW GRAPH FINAL CONTROL FLOW GRAPH
@begin: scope:[] from @begin: scope:[] from
@ -406,13 +289,13 @@ FINAL CONTROL FLOW GRAPH
[3] phi() [ ] ( ) [3] phi() [ ] ( )
main: scope:[main] from @2 main: scope:[main] from @2
[4] phi() [ ] ( main:2 [ ] ) [4] phi() [ ] ( main:2 [ ] )
[5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
[6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ) [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1: scope:[main] from main
[7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ) [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
[8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] )
[9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] )
[10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] ) [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
[11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
to:main::@2 to:main::@2
@ -424,16 +307,12 @@ main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] ) [14] return [ ] ( main:2 [ ] )
to:@return to:@return
inccnt: scope:[inccnt] from main main::@1 inccnt: scope:[inccnt] from main main::@1
[15] (byte) cnt3#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt3#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] ) [15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 ] ( main:2::inccnt:5 [ cnt#11 ] main:2::inccnt:10 [ cnt#11 ] )
[15] (byte) cnt2#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt2#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] ) [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] )
[15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] ) [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
[16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] )
[17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] )
[18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] )
[19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
to:inccnt::@return to:inccnt::@return
inccnt::@return: scope:[inccnt] from inccnt inccnt::@return: scope:[inccnt] from inccnt
[20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
to:@return to:@return
DOMINATORS DOMINATORS
@ -459,14 +338,8 @@ VARIABLE REGISTER WEIGHTS
(byte[256]) SCREEN (byte[256]) SCREEN
(byte) cnt (byte) cnt
(byte) cnt#11 4.0 (byte) cnt#11 4.0
(byte) cnt#12 0.6666666666666666 (byte) cnt#12 0.8571428571428571
(byte) cnt#2 4.0 (byte) cnt#2 4.0
(byte) cnt2
(byte) cnt2#10 2.0
(byte) cnt2#11 0.4444444444444444
(byte) cnt3
(byte) cnt3#10 1.3333333333333333
(byte) cnt3#11 0.5
(byte()) inccnt() (byte()) inccnt()
(byte) inccnt::return (byte) inccnt::return
(byte) inccnt::return#0 4.0 (byte) inccnt::return#0 4.0
@ -478,8 +351,6 @@ VARIABLE REGISTER WEIGHTS
Initial phi equivalence classes Initial phi equivalence classes
[ cnt#11 cnt#2 ] [ cnt#11 cnt#2 ]
[ cnt2#10 cnt2#11 ]
[ cnt3#10 cnt3#11 ]
Added variable inccnt::return#0 to zero page equivalence class [ inccnt::return#0 ] Added variable inccnt::return#0 to zero page equivalence class [ inccnt::return#0 ]
Added variable main::$0 to zero page equivalence class [ main::$0 ] Added variable main::$0 to zero page equivalence class [ main::$0 ]
Added variable inccnt::return#1 to zero page equivalence class [ inccnt::return#1 ] Added variable inccnt::return#1 to zero page equivalence class [ inccnt::return#1 ]
@ -488,8 +359,6 @@ Added variable cnt#12 to zero page equivalence class [ cnt#12 ]
Added variable inccnt::return#2 to zero page equivalence class [ inccnt::return#2 ] Added variable inccnt::return#2 to zero page equivalence class [ inccnt::return#2 ]
Complete equivalence classes Complete equivalence classes
[ cnt#11 cnt#2 ] [ cnt#11 cnt#2 ]
[ cnt2#10 cnt2#11 ]
[ cnt3#10 cnt3#11 ]
[ inccnt::return#0 ] [ inccnt::return#0 ]
[ main::$0 ] [ main::$0 ]
[ inccnt::return#1 ] [ inccnt::return#1 ]
@ -497,14 +366,12 @@ Complete equivalence classes
[ cnt#12 ] [ cnt#12 ]
[ inccnt::return#2 ] [ inccnt::return#2 ]
Allocated zp ZP_BYTE:2 [ cnt#11 cnt#2 ] Allocated zp ZP_BYTE:2 [ cnt#11 cnt#2 ]
Allocated zp ZP_BYTE:3 [ cnt2#10 cnt2#11 ] Allocated zp ZP_BYTE:3 [ inccnt::return#0 ]
Allocated zp ZP_BYTE:4 [ cnt3#10 cnt3#11 ] Allocated zp ZP_BYTE:4 [ main::$0 ]
Allocated zp ZP_BYTE:5 [ inccnt::return#0 ] Allocated zp ZP_BYTE:5 [ inccnt::return#1 ]
Allocated zp ZP_BYTE:6 [ main::$0 ] Allocated zp ZP_BYTE:6 [ main::$1 ]
Allocated zp ZP_BYTE:7 [ inccnt::return#1 ] Allocated zp ZP_BYTE:7 [ cnt#12 ]
Allocated zp ZP_BYTE:8 [ main::$1 ] Allocated zp ZP_BYTE:8 [ inccnt::return#2 ]
Allocated zp ZP_BYTE:9 [ cnt#12 ]
Allocated zp ZP_BYTE:10 [ inccnt::return#2 ]
INITIAL ASM INITIAL ASM
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -514,9 +381,7 @@ INITIAL ASM
//SEG1 Global Constants & labels //SEG1 Global Constants & labels
.label SCREEN = $400 .label SCREEN = $400
.label cnt = 2 .label cnt = 2
.label cnt2 = 3 .label cnt_12 = 7
.label cnt3 = 4
.label cnt_12 = 9
//SEG2 @begin //SEG2 @begin
bbegin: bbegin:
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2] //SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
@ -535,108 +400,90 @@ bend_from_b2:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
.label _0 = 6 .label _0 = 4
.label _1 = 8 .label _1 = 6
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) //SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
//SEG11 [15] phi from main to inccnt [phi:main->inccnt] //SEG11 [15] phi from main to inccnt [phi:main->inccnt]
inccnt_from_main: inccnt_from_main:
//SEG12 [15] phi (byte) cnt3#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuz1=vbuc1 //SEG12 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuz1=vbuc1
lda #0
sta cnt3
//SEG13 [15] phi (byte) cnt2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#1] -- vbuz1=vbuc1
lda #0
sta cnt2
//SEG14 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#2] -- vbuz1=vbuc1
lda #0 lda #0
sta cnt sta cnt
jsr inccnt jsr inccnt
//SEG15 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=vbuz2 //SEG13 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] ) -- vbuz1=vbuz2
lda inccnt.return_2 lda inccnt.return_2
sta inccnt.return sta inccnt.return
jmp b1 jmp b1
//SEG16 main::@1 //SEG14 main::@1
b1: b1:
//SEG17 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=vbuz2 //SEG15 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] ) -- vbuz1=vbuz2
lda inccnt.return lda inccnt.return
sta _0 sta _0
//SEG18 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) -- _deref_pbuc1=vbuz1 //SEG16 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] ) -- _deref_pbuc1=vbuz1
lda _0 lda _0
sta SCREEN+0 sta SCREEN+0
//SEG19 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) -- vbuz1=_inc_vbuz2 //SEG17 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuz1=_inc_vbuz2
ldy cnt_12 ldy cnt_12
iny iny
sty cnt sty cnt
//SEG20 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] ) //SEG18 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt] //SEG19 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
inccnt_from_b1: inccnt_from_b1:
//SEG22 [15] phi (byte) cnt3#10 = (byte) cnt3#11 [phi:main::@1->inccnt#0] -- register_copy //SEG20 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#0] -- register_copy
//SEG23 [15] phi (byte) cnt2#10 = (byte) cnt2#11 [phi:main::@1->inccnt#1] -- register_copy
//SEG24 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#2] -- register_copy
jsr inccnt jsr inccnt
//SEG25 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) -- vbuz1=vbuz2 //SEG21 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) -- vbuz1=vbuz2
lda inccnt.return_2 lda inccnt.return_2
sta inccnt.return_1 sta inccnt.return_1
jmp b2 jmp b2
//SEG26 main::@2 //SEG22 main::@2
b2: b2:
//SEG27 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] ) -- vbuz1=vbuz2 //SEG23 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] ) -- vbuz1=vbuz2
lda inccnt.return_1 lda inccnt.return_1
sta _1 sta _1
//SEG28 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1 //SEG24 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1
lda _1 lda _1
sta SCREEN+1 sta SCREEN+1
jmp breturn jmp breturn
//SEG29 main::@return //SEG25 main::@return
breturn: breturn:
//SEG30 [14] return [ ] ( main:2 [ ] ) //SEG26 [14] return [ ] ( main:2 [ ] )
rts rts
} }
//SEG31 inccnt //SEG27 inccnt
inccnt: { inccnt: {
.label return = 5 .label return = 3
.label return_1 = 7 .label return_1 = 5
.label return_2 = $a .label return_2 = 8
//SEG32 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] ) -- vbuz1=_inc_vbuz2 //SEG28 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] ) -- vbuz1=_inc_vbuz2
ldy cnt ldy cnt
iny iny
sty cnt_12 sty cnt_12
//SEG33 [17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] ) -- vbuz1=_inc_vbuz1 //SEG29 [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] ) -- vbuz1=vbuz2
inc cnt2
//SEG34 [18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=_inc_vbuz1
inc cnt3
//SEG35 [19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=vbuz2
lda cnt_12 lda cnt_12
sta return_2 sta return_2
jmp breturn jmp breturn
//SEG36 inccnt::@return //SEG30 inccnt::@return
breturn: breturn:
//SEG37 [20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) //SEG31 [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
rts rts
} }
REGISTER UPLIFT POTENTIAL REGISTERS REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_BYTE:2 [ cnt#11 cnt#2 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:2 [ cnt#11 cnt#2 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ cnt2#10 cnt2#11 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:3 [ inccnt::return#0 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ cnt3#10 cnt3#11 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:4 [ main::$0 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:5 [ inccnt::return#0 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:5 [ inccnt::return#1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:6 [ main::$0 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:6 [ main::$1 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:7 [ inccnt::return#1 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:7 [ cnt#12 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:8 [ main::$1 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:8 [ inccnt::return#2 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:9 [ cnt#12 ] : zp ZP_BYTE:9 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:10 [ inccnt::return#2 ] : zp ZP_BYTE:10 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [] 8: zp ZP_BYTE:2 [ cnt#11 cnt#2 ] 2.44: zp ZP_BYTE:3 [ cnt2#10 cnt2#11 ] 1.83: zp ZP_BYTE:4 [ cnt3#10 cnt3#11 ] 0.67: zp ZP_BYTE:9 [ cnt#12 ] Uplift Scope [inccnt] 4: zp ZP_BYTE:3 [ inccnt::return#0 ] 4: zp ZP_BYTE:5 [ inccnt::return#1 ] 1.5: zp ZP_BYTE:8 [ inccnt::return#2 ]
Uplift Scope [inccnt] 4: zp ZP_BYTE:5 [ inccnt::return#0 ] 4: zp ZP_BYTE:7 [ inccnt::return#1 ] 1.5: zp ZP_BYTE:10 [ inccnt::return#2 ] Uplift Scope [] 8: zp ZP_BYTE:2 [ cnt#11 cnt#2 ] 0.86: zp ZP_BYTE:7 [ cnt#12 ]
Uplift Scope [main] 4: zp ZP_BYTE:6 [ main::$0 ] 4: zp ZP_BYTE:8 [ main::$1 ] Uplift Scope [main] 4: zp ZP_BYTE:4 [ main::$0 ] 4: zp ZP_BYTE:6 [ main::$1 ]
Uplifting [] best 116 combination reg byte a [ cnt#11 cnt#2 ] reg byte y [ cnt2#10 cnt2#11 ] reg byte x [ cnt3#10 cnt3#11 ] zp ZP_BYTE:9 [ cnt#12 ] Uplifting [inccnt] best 92 combination reg byte a [ inccnt::return#0 ] reg byte a [ inccnt::return#1 ] reg byte a [ inccnt::return#2 ]
Limited combination testing to 100 combinations of 256 possible. Uplifting [] best 76 combination reg byte x [ cnt#11 cnt#2 ] reg byte x [ cnt#12 ]
Uplifting [inccnt] best 95 combination reg byte a [ inccnt::return#0 ] reg byte a [ inccnt::return#1 ] reg byte a [ inccnt::return#2 ] Uplifting [main] best 64 combination reg byte a [ main::$0 ] reg byte a [ main::$1 ]
Uplifting [main] best 83 combination reg byte a [ main::$0 ] reg byte a [ main::$1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:9 [ cnt#12 ]
Uplifting [] best 83 combination zp ZP_BYTE:9 [ cnt#12 ]
Allocated (was zp ZP_BYTE:9) zp ZP_BYTE:2 [ cnt#12 ]
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -645,7 +492,6 @@ ASSEMBLER BEFORE OPTIMIZATION
.pc = $80d "Program" .pc = $80d "Program"
//SEG1 Global Constants & labels //SEG1 Global Constants & labels
.label SCREEN = $400 .label SCREEN = $400
.label cnt = 2
//SEG2 @begin //SEG2 @begin
bbegin: bbegin:
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2] //SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
@ -664,67 +510,53 @@ bend_from_b2:
bend: bend:
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) //SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
//SEG11 [15] phi from main to inccnt [phi:main->inccnt] //SEG11 [15] phi from main to inccnt [phi:main->inccnt]
inccnt_from_main: inccnt_from_main:
//SEG12 [15] phi (byte) cnt3#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1 //SEG12 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1
ldx #0 ldx #0
//SEG13 [15] phi (byte) cnt2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#1] -- vbuyy=vbuc1
ldy #0
//SEG14 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#2] -- vbuaa=vbuc1
lda #0
jsr inccnt jsr inccnt
//SEG15 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ) //SEG13 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
// (byte) inccnt::return#0 = (byte) inccnt::return#2 // register copy reg byte a // (byte) inccnt::return#0 = (byte) inccnt::return#2 // register copy reg byte a
jmp b1 jmp b1
//SEG16 main::@1 //SEG14 main::@1
b1: b1:
//SEG17 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ) //SEG15 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a // (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
//SEG18 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) -- _deref_pbuc1=vbuaa //SEG16 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+0 sta SCREEN+0
//SEG19 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) -- vbuaa=_inc_vbuz1 //SEG17 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuxx=_inc_vbuxx
lda cnt inx
clc //SEG18 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
adc #1 //SEG19 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
//SEG20 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
inccnt_from_b1: inccnt_from_b1:
//SEG22 [15] phi (byte) cnt3#10 = (byte) cnt3#11 [phi:main::@1->inccnt#0] -- register_copy //SEG20 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#0] -- register_copy
//SEG23 [15] phi (byte) cnt2#10 = (byte) cnt2#11 [phi:main::@1->inccnt#1] -- register_copy
//SEG24 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#2] -- register_copy
jsr inccnt jsr inccnt
//SEG25 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) //SEG21 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
// (byte) inccnt::return#1 = (byte) inccnt::return#2 // register copy reg byte a // (byte) inccnt::return#1 = (byte) inccnt::return#2 // register copy reg byte a
jmp b2 jmp b2
//SEG26 main::@2 //SEG22 main::@2
b2: b2:
//SEG27 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] ) //SEG23 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] )
// (byte~) main::$1 = (byte) inccnt::return#1 // register copy reg byte a // (byte~) main::$1 = (byte) inccnt::return#1 // register copy reg byte a
//SEG28 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa //SEG24 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+1 sta SCREEN+1
jmp breturn jmp breturn
//SEG29 main::@return //SEG25 main::@return
breturn: breturn:
//SEG30 [14] return [ ] ( main:2 [ ] ) //SEG26 [14] return [ ] ( main:2 [ ] )
rts rts
} }
//SEG31 inccnt //SEG27 inccnt
inccnt: { inccnt: {
//SEG32 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] ) -- vbuz1=_inc_vbuaa //SEG28 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] ) -- vbuxx=_inc_vbuxx
clc
adc #1
sta cnt
//SEG33 [17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG34 [18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG35 [19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuaa=vbuz1 //SEG29 [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] ) -- vbuaa=vbuxx
lda cnt txa
jmp breturn jmp breturn
//SEG36 inccnt::@return //SEG30 inccnt::@return
breturn: breturn:
//SEG37 [20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) //SEG31 [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
rts rts
} }
@ -736,9 +568,6 @@ Removing instruction jmp b2
Removing instruction jmp breturn Removing instruction jmp breturn
Removing instruction jmp breturn Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination Succesful ASM optimization Pass5NextJumpElimination
Replacing instruction lda #0 with TXA
Removing instruction lda cnt
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction bbegin: Removing instruction bbegin:
Removing instruction b2_from_bbegin: Removing instruction b2_from_bbegin:
Removing instruction main_from_b2: Removing instruction main_from_b2:
@ -761,15 +590,9 @@ FINAL SYMBOL TABLE
(byte[256]) SCREEN (byte[256]) SCREEN
(const byte[256]) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024 (const byte[256]) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024
(byte) cnt (byte) cnt
(byte) cnt#11 reg byte a 4.0 (byte) cnt#11 reg byte x 4.0
(byte) cnt#12 cnt zp ZP_BYTE:2 0.6666666666666666 (byte) cnt#12 reg byte x 0.8571428571428571
(byte) cnt#2 reg byte a 4.0 (byte) cnt#2 reg byte x 4.0
(byte) cnt2
(byte) cnt2#10 reg byte y 2.0
(byte) cnt2#11 reg byte y 0.4444444444444444
(byte) cnt3
(byte) cnt3#10 reg byte x 1.3333333333333333
(byte) cnt3#11 reg byte x 0.5
(byte()) inccnt() (byte()) inccnt()
(label) inccnt::@return (label) inccnt::@return
(byte) inccnt::return (byte) inccnt::return
@ -783,19 +606,17 @@ FINAL SYMBOL TABLE
(label) main::@2 (label) main::@2
(label) main::@return (label) main::@return
reg byte a [ cnt#11 cnt#2 ] reg byte x [ cnt#11 cnt#2 ]
reg byte y [ cnt2#10 cnt2#11 ]
reg byte x [ cnt3#10 cnt3#11 ]
reg byte a [ inccnt::return#0 ] reg byte a [ inccnt::return#0 ]
reg byte a [ main::$0 ] reg byte a [ main::$0 ]
reg byte a [ inccnt::return#1 ] reg byte a [ inccnt::return#1 ]
reg byte a [ main::$1 ] reg byte a [ main::$1 ]
zp ZP_BYTE:2 [ cnt#12 ] reg byte x [ cnt#12 ]
reg byte a [ inccnt::return#2 ] reg byte a [ inccnt::return#2 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 62 Score: 46
//SEG0 Basic Upstart //SEG0 Basic Upstart
.pc = $801 "Basic" .pc = $801 "Basic"
@ -803,7 +624,6 @@ Score: 62
.pc = $80d "Program" .pc = $80d "Program"
//SEG1 Global Constants & labels //SEG1 Global Constants & labels
.label SCREEN = $400 .label SCREEN = $400
.label cnt = 2
//SEG2 @begin //SEG2 @begin
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2] //SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
//SEG4 @2 //SEG4 @2
@ -814,56 +634,43 @@ Score: 62
//SEG8 @end //SEG8 @end
//SEG9 main //SEG9 main
main: { main: {
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) //SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
//SEG11 [15] phi from main to inccnt [phi:main->inccnt] //SEG11 [15] phi from main to inccnt [phi:main->inccnt]
//SEG12 [15] phi (byte) cnt3#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1 //SEG12 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1
ldx #0 ldx #0
//SEG13 [15] phi (byte) cnt2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#1] -- vbuyy=vbuc1
ldy #0
//SEG14 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#2] -- vbuaa=vbuc1
txa
jsr inccnt jsr inccnt
//SEG15 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ) //SEG13 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
// (byte) inccnt::return#0 = (byte) inccnt::return#2 // register copy reg byte a // (byte) inccnt::return#0 = (byte) inccnt::return#2 // register copy reg byte a
//SEG16 main::@1 //SEG14 main::@1
//SEG17 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ) //SEG15 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a // (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
//SEG18 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) -- _deref_pbuc1=vbuaa //SEG16 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+0 sta SCREEN+0
//SEG19 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) -- vbuaa=_inc_vbuz1 //SEG17 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuxx=_inc_vbuxx
lda cnt inx
clc //SEG18 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
adc #1 //SEG19 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
//SEG20 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] ) //SEG20 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#0] -- register_copy
//SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
//SEG22 [15] phi (byte) cnt3#10 = (byte) cnt3#11 [phi:main::@1->inccnt#0] -- register_copy
//SEG23 [15] phi (byte) cnt2#10 = (byte) cnt2#11 [phi:main::@1->inccnt#1] -- register_copy
//SEG24 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#2] -- register_copy
jsr inccnt jsr inccnt
//SEG25 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) //SEG21 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
// (byte) inccnt::return#1 = (byte) inccnt::return#2 // register copy reg byte a // (byte) inccnt::return#1 = (byte) inccnt::return#2 // register copy reg byte a
//SEG26 main::@2 //SEG22 main::@2
//SEG27 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] ) //SEG23 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] )
// (byte~) main::$1 = (byte) inccnt::return#1 // register copy reg byte a // (byte~) main::$1 = (byte) inccnt::return#1 // register copy reg byte a
//SEG28 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa //SEG24 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+1 sta SCREEN+1
//SEG29 main::@return //SEG25 main::@return
//SEG30 [14] return [ ] ( main:2 [ ] ) //SEG26 [14] return [ ] ( main:2 [ ] )
rts rts
} }
//SEG31 inccnt //SEG27 inccnt
inccnt: { inccnt: {
//SEG32 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] ) -- vbuz1=_inc_vbuaa //SEG28 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] ) -- vbuxx=_inc_vbuxx
clc
adc #1
sta cnt
//SEG33 [17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG34 [18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG35 [19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuaa=vbuz1 //SEG29 [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] ) -- vbuaa=vbuxx
//SEG36 inccnt::@return txa
//SEG37 [20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) //SEG30 inccnt::@return
//SEG31 [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
rts rts
} }

View File

@ -4,15 +4,9 @@
(byte[256]) SCREEN (byte[256]) SCREEN
(const byte[256]) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024 (const byte[256]) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024
(byte) cnt (byte) cnt
(byte) cnt#11 reg byte a 4.0 (byte) cnt#11 reg byte x 4.0
(byte) cnt#12 cnt zp ZP_BYTE:2 0.6666666666666666 (byte) cnt#12 reg byte x 0.8571428571428571
(byte) cnt#2 reg byte a 4.0 (byte) cnt#2 reg byte x 4.0
(byte) cnt2
(byte) cnt2#10 reg byte y 2.0
(byte) cnt2#11 reg byte y 0.4444444444444444
(byte) cnt3
(byte) cnt3#10 reg byte x 1.3333333333333333
(byte) cnt3#11 reg byte x 0.5
(byte()) inccnt() (byte()) inccnt()
(label) inccnt::@return (label) inccnt::@return
(byte) inccnt::return (byte) inccnt::return
@ -26,12 +20,10 @@
(label) main::@2 (label) main::@2
(label) main::@return (label) main::@return
reg byte a [ cnt#11 cnt#2 ] reg byte x [ cnt#11 cnt#2 ]
reg byte y [ cnt2#10 cnt2#11 ]
reg byte x [ cnt3#10 cnt3#11 ]
reg byte a [ inccnt::return#0 ] reg byte a [ inccnt::return#0 ]
reg byte a [ main::$0 ] reg byte a [ main::$0 ]
reg byte a [ inccnt::return#1 ] reg byte a [ inccnt::return#1 ]
reg byte a [ main::$1 ] reg byte a [ main::$1 ]
zp ZP_BYTE:2 [ cnt#12 ] reg byte x [ cnt#12 ]
reg byte a [ inccnt::return#2 ] reg byte a [ inccnt::return#2 ]

View File

@ -33,21 +33,12 @@ lvaluevar: {
jmp b1 jmp b1
} }
rvaluevar: { rvaluevar: {
.label screen = 2
lda #<$400
sta screen
lda #>$400
sta screen+1
ldx #2 ldx #2
b1: b1:
cpx #$a cpx #$a
bcc b2 bcc b2
rts rts
b2: b2:
inc screen
bne !+
inc screen+1
!:
inx inx
jmp b1 jmp b1
} }

View File

@ -46,42 +46,40 @@ rvaluevar: scope:[rvaluevar] from main::@2
[20] phi() [ ] ( main:2::rvaluevar:9 [ ] ) [20] phi() [ ] ( main:2::rvaluevar:9 [ ] )
to:rvaluevar::@1 to:rvaluevar::@1
rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2 rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2
[21] (byte*) rvaluevar::screen#2 ← phi( rvaluevar/((byte*))(word/signed word/dword/signed dword) 1024 rvaluevar::@2/(byte*) rvaluevar::screen#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) [21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
[21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
[22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
to:rvaluevar::@return to:rvaluevar::@return
rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1 rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
[23] return [ ] ( main:2::rvaluevar:9 [ ] ) [23] return [ ] ( main:2::rvaluevar:9 [ ] )
to:@return to:@return
rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1 rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
[24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] )
[25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] )
to:rvaluevar::@1 to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1 rvalue: scope:[rvalue] from main::@1
[26] phi() [ ] ( main:2::rvalue:7 [ ] ) [25] phi() [ ] ( main:2::rvalue:7 [ ] )
to:rvalue::@1 to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2 rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[27] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) [26] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
to:rvalue::@return to:rvalue::@return
rvalue::@return: scope:[rvalue] from rvalue::@1 rvalue::@return: scope:[rvalue] from rvalue::@1
[29] return [ ] ( main:2::rvalue:7 [ ] ) [28] return [ ] ( main:2::rvalue:7 [ ] )
to:@return to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1 rvalue::@2: scope:[rvalue] from rvalue::@1
[30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
to:rvalue::@1 to:rvalue::@1
lvalue: scope:[lvalue] from main lvalue: scope:[lvalue] from main
[31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] )
[32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] )
to:lvalue::@1 to:lvalue::@1
lvalue::@1: scope:[lvalue] from lvalue lvalue::@2 lvalue::@1: scope:[lvalue] from lvalue lvalue::@2
[33] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) [32] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
to:lvalue::@return to:lvalue::@return
lvalue::@return: scope:[lvalue] from lvalue::@1 lvalue::@return: scope:[lvalue] from lvalue::@1
[35] return [ ] ( main:2::lvalue:5 [ ] ) [34] return [ ] ( main:2::lvalue:5 [ ] )
to:@return to:@return
lvalue::@2: scope:[lvalue] from lvalue::@1 lvalue::@2: scope:[lvalue] from lvalue::@1
[36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] )
to:lvalue::@1 to:lvalue::@1

View File

@ -273,7 +273,13 @@ Eliminating unused variable - keeping the call (void~) main::$0
Eliminating unused variable - keeping the call (void~) main::$1 Eliminating unused variable - keeping the call (void~) main::$1
Eliminating unused variable - keeping the call (void~) main::$2 Eliminating unused variable - keeping the call (void~) main::$2
Eliminating unused variable - keeping the call (void~) main::$3 Eliminating unused variable - keeping the call (void~) main::$3
Eliminating unused variable (byte) rvalue::b and assignment [15] (byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN)
Eliminating unused variable rvalue::b(null) and assignment [16] rvalue::b(null) ← *((byte[1024]) rvalue::SCREEN + (byte/signed byte/word/signed word/dword/signed dword) 1)
Eliminating unused variable rvalue::b(null) and assignment [20] rvalue::b(null) ← *((byte[1024]) rvalue::SCREEN + (byte) rvalue::i)
Eliminating unused variable (byte) rvaluevar::b and assignment [36] (byte) rvaluevar::b ← *((byte*) rvaluevar::screen) Eliminating unused variable (byte) rvaluevar::b and assignment [36] (byte) rvaluevar::b ← *((byte*) rvaluevar::screen)
Eliminating unused variable (byte[1024]) rvalue::SCREEN and assignment [14] (byte[1024]) rvalue::SCREEN ← ((byte*)) (word/signed word/dword/signed dword) 1024
Eliminating unused variable (byte*) rvaluevar::screen and assignment [29] (byte*) rvaluevar::screen ← ((byte*)) (word/signed word/dword/signed dword) 1024
Eliminating unused variable rvaluevar::screen(null) and assignment [33] rvaluevar::screen(null) ← ++ rvaluevar::screen(null)
Removing empty block @1 Removing empty block @1
Removing empty block lvalue::@4 Removing empty block lvalue::@4
Removing empty block lvalue::@3 Removing empty block lvalue::@3
@ -339,9 +345,6 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
return return
to:@return to:@return
rvalue: scope:[rvalue] from main::@1 rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 2 (byte) rvalue::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 2
to:rvalue::@1 to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2 rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
@ -351,7 +354,6 @@ rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
to:rvalue::@return to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1 rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::i#3 ← phi( rvalue::@1/(byte) rvalue::i#2 ) (byte) rvalue::i#3 ← phi( rvalue::@1/(byte) rvalue::i#2 )
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#3)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#3 (byte) rvalue::i#1 ← ++ (byte) rvalue::i#3
to:rvalue::@1 to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1 rvalue::@return: scope:[rvalue] from rvalue::@1
@ -381,19 +383,15 @@ lvaluevar::@return: scope:[lvaluevar] from lvaluevar::@1
return return
to:@return to:@return
rvaluevar: scope:[rvaluevar] from main::@2 rvaluevar: scope:[rvaluevar] from main::@2
(byte*) rvaluevar::screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte) rvaluevar::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 2 (byte) rvaluevar::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 2
to:rvaluevar::@1 to:rvaluevar::@1
rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2 rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2
(byte*) rvaluevar::screen#3 ← phi( rvaluevar/(byte*) rvaluevar::screen#0 rvaluevar::@2/(byte*) rvaluevar::screen#1 )
(byte) rvaluevar::i#2 ← phi( rvaluevar/(byte) rvaluevar::i#0 rvaluevar::@2/(byte) rvaluevar::i#1 ) (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte) rvaluevar::i#0 rvaluevar::@2/(byte) rvaluevar::i#1 )
(bool~) rvaluevar::$0 ← (byte) rvaluevar::i#2 < (byte/signed byte/word/signed word/dword/signed dword) 10 (bool~) rvaluevar::$0 ← (byte) rvaluevar::i#2 < (byte/signed byte/word/signed word/dword/signed dword) 10
if((bool~) rvaluevar::$0) goto rvaluevar::@2 if((bool~) rvaluevar::$0) goto rvaluevar::@2
to:rvaluevar::@return to:rvaluevar::@return
rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1 rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
(byte) rvaluevar::i#3 ← phi( rvaluevar::@1/(byte) rvaluevar::i#2 ) (byte) rvaluevar::i#3 ← phi( rvaluevar::@1/(byte) rvaluevar::i#2 )
(byte*) rvaluevar::screen#2 ← phi( rvaluevar::@1/(byte*) rvaluevar::screen#3 )
(byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2
(byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#3 (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#3
to:rvaluevar::@1 to:rvaluevar::@1
rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1 rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
@ -453,12 +451,6 @@ SYMBOL TABLE SSA
(label) rvalue::@1 (label) rvalue::@1
(label) rvalue::@2 (label) rvalue::@2
(label) rvalue::@return (label) rvalue::@return
(byte[1024]) rvalue::SCREEN
(byte[1024]) rvalue::SCREEN#0
(byte) rvalue::b
(byte) rvalue::b#0
(byte) rvalue::b#1
(byte) rvalue::b#2
(byte) rvalue::i (byte) rvalue::i
(byte) rvalue::i#0 (byte) rvalue::i#0
(byte) rvalue::i#1 (byte) rvalue::i#1
@ -474,11 +466,6 @@ SYMBOL TABLE SSA
(byte) rvaluevar::i#1 (byte) rvaluevar::i#1
(byte) rvaluevar::i#2 (byte) rvaluevar::i#2
(byte) rvaluevar::i#3 (byte) rvaluevar::i#3
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#0
(byte*) rvaluevar::screen#1
(byte*) rvaluevar::screen#2
(byte*) rvaluevar::screen#3
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) main::@4 Culled Empty Block (label) main::@4
@ -489,7 +476,6 @@ Alias (byte) rvalue::i#2 = (byte) rvalue::i#3
Alias (byte) lvaluevar::b#1 = (byte) lvaluevar::b#2 Alias (byte) lvaluevar::b#1 = (byte) lvaluevar::b#2
Alias (byte*) lvaluevar::screen#2 = (byte*) lvaluevar::screen#3 Alias (byte*) lvaluevar::screen#2 = (byte*) lvaluevar::screen#3
Alias (byte) lvaluevar::i#2 = (byte) lvaluevar::i#3 Alias (byte) lvaluevar::i#2 = (byte) lvaluevar::i#3
Alias (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#3
Alias (byte) rvaluevar::i#2 = (byte) rvaluevar::i#3 Alias (byte) rvaluevar::i#2 = (byte) rvaluevar::i#3
Succesful SSA optimization Pass2AliasElimination Succesful SSA optimization Pass2AliasElimination
Self Phi Eliminated (byte) lvaluevar::b#1 Self Phi Eliminated (byte) lvaluevar::b#1
@ -503,23 +489,14 @@ Simple Condition (bool~) rvaluevar::$0 if((byte) rvaluevar::i#2<(byte/signed byt
Succesful SSA optimization Pass2ConditionalJumpSimplification Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte[1024]) lvalue::SCREEN#0 = ((byte*))1024 Constant (const byte[1024]) lvalue::SCREEN#0 = ((byte*))1024
Constant (const byte) lvalue::i#0 = 2 Constant (const byte) lvalue::i#0 = 2
Constant (const byte[1024]) rvalue::SCREEN#0 = ((byte*))1024
Constant (const byte) rvalue::i#0 = 2 Constant (const byte) rvalue::i#0 = 2
Constant (const byte*) lvaluevar::screen#0 = ((byte*))1024 Constant (const byte*) lvaluevar::screen#0 = ((byte*))1024
Constant (const byte) lvaluevar::b#0 = 4 Constant (const byte) lvaluevar::b#0 = 4
Constant (const byte) lvaluevar::i#0 = 2 Constant (const byte) lvaluevar::i#0 = 2
Constant (const byte*) rvaluevar::screen#0 = ((byte*))1024
Constant (const byte) rvaluevar::i#0 = 2 Constant (const byte) rvaluevar::i#0 = 2
Succesful SSA optimization Pass2ConstantIdentification Succesful SSA optimization Pass2ConstantIdentification
Consolidated array index constant in *(lvalue::SCREEN#0+1) Consolidated array index constant in *(lvalue::SCREEN#0+1)
Consolidated array index constant in *(rvalue::SCREEN#0+1)
Succesful SSA optimization Pass2ConstantAdditionElimination Succesful SSA optimization Pass2ConstantAdditionElimination
Eliminating unused variable (byte) rvalue::b#0 and assignment [12] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0)
Eliminating unused variable (byte) rvalue::b#1 and assignment [13] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1)
Eliminating unused variable (byte) rvalue::b#2 and assignment [16] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
Succesful SSA optimization PassNEliminateUnusedVars
Eliminating unused constant (const byte[1024]) rvalue::SCREEN#0
Succesful SSA optimization PassNEliminateUnusedVars
OPTIMIZING CONTROL FLOW GRAPH OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) lvalue::i#0 Inlining constant with var siblings (const byte) lvalue::i#0
Inlining constant with var siblings (const byte) lvalue::i#0 Inlining constant with var siblings (const byte) lvalue::i#0
@ -529,14 +506,11 @@ Inlining constant with var siblings (const byte*) lvaluevar::screen#0
Inlining constant with var siblings (const byte*) lvaluevar::screen#0 Inlining constant with var siblings (const byte*) lvaluevar::screen#0
Inlining constant with var siblings (const byte) lvaluevar::i#0 Inlining constant with var siblings (const byte) lvaluevar::i#0
Inlining constant with var siblings (const byte) lvaluevar::i#0 Inlining constant with var siblings (const byte) lvaluevar::i#0
Inlining constant with var siblings (const byte*) rvaluevar::screen#0
Inlining constant with var siblings (const byte*) rvaluevar::screen#0
Inlining constant with var siblings (const byte) rvaluevar::i#0 Inlining constant with var siblings (const byte) rvaluevar::i#0
Inlining constant with var siblings (const byte) rvaluevar::i#0 Inlining constant with var siblings (const byte) rvaluevar::i#0
Constant inlined lvalue::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined rvaluevar::screen#0 = ((byte*))(word/signed word/dword/signed dword) 1024
Constant inlined rvalue::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2 Constant inlined rvalue::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined lvaluevar::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2 Constant inlined lvaluevar::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined lvalue::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined lvaluevar::screen#0 = ((byte*))(word/signed word/dword/signed dword) 1024 Constant inlined lvaluevar::screen#0 = ((byte*))(word/signed word/dword/signed dword) 1024
Constant inlined rvaluevar::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2 Constant inlined rvaluevar::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Succesful SSA optimization Pass2ConstantInlining Succesful SSA optimization Pass2ConstantInlining
@ -560,14 +534,13 @@ Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Propagating live ranges... Propagating live ranges...
Created 6 initial phi equivalence classes Created 5 initial phi equivalence classes
Coalesced [20] lvaluevar::i#4 ← lvaluevar::i#1 Coalesced [20] lvaluevar::i#4 ← lvaluevar::i#1
Coalesced [21] lvaluevar::screen#4 ← lvaluevar::screen#1 Coalesced [21] lvaluevar::screen#4 ← lvaluevar::screen#1
Coalesced [28] rvaluevar::i#4 ← rvaluevar::i#1 Coalesced [27] rvaluevar::i#4 ← rvaluevar::i#1
Coalesced [29] rvaluevar::screen#4 ← rvaluevar::screen#1 Coalesced [33] rvalue::i#4 ← rvalue::i#1
Coalesced [35] rvalue::i#4 ← rvalue::i#1 Coalesced [41] lvalue::i#4 ← lvalue::i#1
Coalesced [43] lvalue::i#4 ← lvalue::i#1 Coalesced down to 5 phi equivalence classes
Coalesced down to 6 phi equivalence classes
Block Sequence Planned @begin @5 @end main main::@1 main::@2 main::@3 main::@return lvaluevar lvaluevar::@1 lvaluevar::@return lvaluevar::@2 rvaluevar rvaluevar::@1 rvaluevar::@return rvaluevar::@2 rvalue rvalue::@1 rvalue::@return rvalue::@2 lvalue lvalue::@1 lvalue::@return lvalue::@2 Block Sequence Planned @begin @5 @end main main::@1 main::@2 main::@3 main::@return lvaluevar lvaluevar::@1 lvaluevar::@return lvaluevar::@2 rvaluevar rvaluevar::@1 rvaluevar::@return rvaluevar::@2 rvalue rvalue::@1 rvalue::@return rvalue::@2 lvalue lvalue::@1 lvalue::@return lvalue::@2
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @5 Adding NOP phi() at start of @5
@ -633,44 +606,42 @@ rvaluevar: scope:[rvaluevar] from main::@2
[20] phi() [ ] ( main:2::rvaluevar:9 [ ] ) [20] phi() [ ] ( main:2::rvaluevar:9 [ ] )
to:rvaluevar::@1 to:rvaluevar::@1
rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2 rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2
[21] (byte*) rvaluevar::screen#2 ← phi( rvaluevar/((byte*))(word/signed word/dword/signed dword) 1024 rvaluevar::@2/(byte*) rvaluevar::screen#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) [21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
[21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
[22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
to:rvaluevar::@return to:rvaluevar::@return
rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1 rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
[23] return [ ] ( main:2::rvaluevar:9 [ ] ) [23] return [ ] ( main:2::rvaluevar:9 [ ] )
to:@return to:@return
rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1 rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
[24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] )
[25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] )
to:rvaluevar::@1 to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1 rvalue: scope:[rvalue] from main::@1
[26] phi() [ ] ( main:2::rvalue:7 [ ] ) [25] phi() [ ] ( main:2::rvalue:7 [ ] )
to:rvalue::@1 to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2 rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[27] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) [26] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
to:rvalue::@return to:rvalue::@return
rvalue::@return: scope:[rvalue] from rvalue::@1 rvalue::@return: scope:[rvalue] from rvalue::@1
[29] return [ ] ( main:2::rvalue:7 [ ] ) [28] return [ ] ( main:2::rvalue:7 [ ] )
to:@return to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1 rvalue::@2: scope:[rvalue] from rvalue::@1
[30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
to:rvalue::@1 to:rvalue::@1
lvalue: scope:[lvalue] from main lvalue: scope:[lvalue] from main
[31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] )
[32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] )
to:lvalue::@1 to:lvalue::@1
lvalue::@1: scope:[lvalue] from lvalue lvalue::@2 lvalue::@1: scope:[lvalue] from lvalue lvalue::@2
[33] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) [32] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
to:lvalue::@return to:lvalue::@return
lvalue::@return: scope:[lvalue] from lvalue::@1 lvalue::@return: scope:[lvalue] from lvalue::@1
[35] return [ ] ( main:2::lvalue:5 [ ] ) [34] return [ ] ( main:2::lvalue:5 [ ] )
to:@return to:@return
lvalue::@2: scope:[lvalue] from lvalue::@1 lvalue::@2: scope:[lvalue] from lvalue::@1
[36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] )
to:lvalue::@1 to:lvalue::@1
DOMINATORS DOMINATORS
@ -746,39 +717,31 @@ VARIABLE REGISTER WEIGHTS
(byte*) lvaluevar::screen#2 11.0 (byte*) lvaluevar::screen#2 11.0
(void()) main() (void()) main()
(void()) rvalue() (void()) rvalue()
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::i (byte) rvalue::i
(byte) rvalue::i#1 22.0 (byte) rvalue::i#1 22.0
(byte) rvalue::i#2 16.5 (byte) rvalue::i#2 16.5
(void()) rvaluevar() (void()) rvaluevar()
(byte) rvaluevar::i (byte) rvaluevar::i
(byte) rvaluevar::i#1 22.0 (byte) rvaluevar::i#1 22.0
(byte) rvaluevar::i#2 11.0 (byte) rvaluevar::i#2 16.5
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 11.0
(byte*) rvaluevar::screen#2 11.0
Initial phi equivalence classes Initial phi equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ] [ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ] [ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ] [ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ] [ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ] [ lvalue::i#2 lvalue::i#1 ]
Complete equivalence classes Complete equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ] [ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ] [ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ] [ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ] [ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ] [ lvalue::i#2 lvalue::i#1 ]
Allocated zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] Allocated zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Allocated zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] Allocated zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Allocated zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ] Allocated zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
Allocated zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] Allocated zp ZP_BYTE:6 [ rvalue::i#2 rvalue::i#1 ]
Allocated zp ZP_BYTE:8 [ rvalue::i#2 rvalue::i#1 ] Allocated zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ]
Allocated zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ]
INITIAL ASM INITIAL ASM
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -812,7 +775,7 @@ main: {
//SEG12 main::@1 //SEG12 main::@1
b1: b1:
//SEG13 [7] call rvalue [ ] ( main:2 [ ] ) //SEG13 [7] call rvalue [ ] ( main:2 [ ] )
//SEG14 [26] phi from main::@1 to rvalue [phi:main::@1->rvalue] //SEG14 [25] phi from main::@1 to rvalue [phi:main::@1->rvalue]
rvalue_from_b1: rvalue_from_b1:
jsr rvalue jsr rvalue
//SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] //SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
@ -887,112 +850,100 @@ lvaluevar: {
} }
//SEG40 rvaluevar //SEG40 rvaluevar
rvaluevar: { rvaluevar: {
.label screen = 6
.label i = 5 .label i = 5
//SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1] //SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1]
b1_from_rvaluevar: b1_from_rvaluevar:
//SEG42 [21] phi (byte*) rvaluevar::screen#2 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:rvaluevar->rvaluevar::@1#0] -- pbuz1=pbuc1 //SEG42 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#0] -- vbuz1=vbuc1
lda #<$400
sta screen
lda #>$400
sta screen+1
//SEG43 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#1] -- vbuz1=vbuc1
lda #2 lda #2
sta i sta i
jmp b1 jmp b1
//SEG44 rvaluevar::@1 //SEG43 rvaluevar::@1
b1: b1:
//SEG45 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) -- vbuz1_lt_vbuc1_then_la1 //SEG44 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i lda i
cmp #$a cmp #$a
bcc b2 bcc b2
jmp breturn jmp breturn
//SEG46 rvaluevar::@return //SEG45 rvaluevar::@return
breturn: breturn:
//SEG47 [23] return [ ] ( main:2::rvaluevar:9 [ ] ) //SEG46 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
rts rts
//SEG48 rvaluevar::@2 //SEG47 rvaluevar::@2
b2: b2:
//SEG49 [24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) -- pbuz1=_inc_pbuz1 //SEG48 [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] ) -- vbuz1=_inc_vbuz1
inc screen
bne !+
inc screen+1
!:
//SEG50 [25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] ) -- vbuz1=_inc_vbuz1
inc i inc i
//SEG51 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1] //SEG49 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
b1_from_b2: b1_from_b2:
//SEG52 [21] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy //SEG50 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
//SEG53 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#1] -- register_copy
jmp b1 jmp b1
} }
//SEG54 rvalue //SEG51 rvalue
rvalue: { rvalue: {
.label i = 8 .label i = 6
//SEG55 [27] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1] //SEG52 [26] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
b1_from_rvalue: b1_from_rvalue:
//SEG56 [27] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuz1=vbuc1 //SEG53 [26] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuz1=vbuc1
lda #2 lda #2
sta i sta i
jmp b1 jmp b1
//SEG57 rvalue::@1 //SEG54 rvalue::@1
b1: b1:
//SEG58 [28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1 //SEG55 [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i lda i
cmp #$a cmp #$a
bcc b2 bcc b2
jmp breturn jmp breturn
//SEG59 rvalue::@return //SEG56 rvalue::@return
breturn: breturn:
//SEG60 [29] return [ ] ( main:2::rvalue:7 [ ] ) //SEG57 [28] return [ ] ( main:2::rvalue:7 [ ] )
rts rts
//SEG61 rvalue::@2 //SEG58 rvalue::@2
b2: b2:
//SEG62 [30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuz1=_inc_vbuz1 //SEG59 [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i inc i
//SEG63 [27] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1] //SEG60 [26] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
b1_from_b2: b1_from_b2:
//SEG64 [27] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy //SEG61 [26] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
jmp b1 jmp b1
} }
//SEG65 lvalue //SEG62 lvalue
lvalue: { lvalue: {
.label SCREEN = $400 .label SCREEN = $400
.label i = 9 .label i = 7
//SEG66 [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2 //SEG63 [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #1 lda #1
sta SCREEN sta SCREEN
//SEG67 [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2 //SEG64 [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #2 lda #2
sta SCREEN+1 sta SCREEN+1
//SEG68 [33] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1] //SEG65 [32] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
b1_from_lvalue: b1_from_lvalue:
//SEG69 [33] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuz1=vbuc1 //SEG66 [32] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuz1=vbuc1
lda #2 lda #2
sta i sta i
jmp b1 jmp b1
//SEG70 lvalue::@1 //SEG67 lvalue::@1
b1: b1:
//SEG71 [34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1 //SEG68 [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i lda i
cmp #$a cmp #$a
bcc b2 bcc b2
jmp breturn jmp breturn
//SEG72 lvalue::@return //SEG69 lvalue::@return
breturn: breturn:
//SEG73 [35] return [ ] ( main:2::lvalue:5 [ ] ) //SEG70 [34] return [ ] ( main:2::lvalue:5 [ ] )
rts rts
//SEG74 lvalue::@2 //SEG71 lvalue::@2
b2: b2:
//SEG75 [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuc2 //SEG72 [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuc2
ldy i ldy i
lda #3 lda #3
sta SCREEN,y sta SCREEN,y
//SEG76 [37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuz1=_inc_vbuz1 //SEG73 [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i inc i
//SEG77 [33] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1] //SEG74 [32] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
b1_from_b2: b1_from_b2:
//SEG78 [33] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy //SEG75 [32] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
jmp b1 jmp b1
} }
@ -1000,37 +951,35 @@ REGISTER UPLIFT POTENTIAL REGISTERS
Statement [17] *((byte*) lvaluevar::screen#2) ← (const byte) lvaluevar::b#0 [ lvaluevar::i#2 lvaluevar::screen#2 ] ( main:2::lvaluevar:11 [ lvaluevar::i#2 lvaluevar::screen#2 ] ) always clobbers reg byte a reg byte y Statement [17] *((byte*) lvaluevar::screen#2) ← (const byte) lvaluevar::b#0 [ lvaluevar::i#2 lvaluevar::screen#2 ] ( main:2::lvaluevar:11 [ lvaluevar::i#2 lvaluevar::screen#2 ] ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Statement [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a Statement [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a Statement [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a Statement [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ]
Statement [17] *((byte*) lvaluevar::screen#2) ← (const byte) lvaluevar::b#0 [ lvaluevar::i#2 lvaluevar::screen#2 ] ( main:2::lvaluevar:11 [ lvaluevar::i#2 lvaluevar::screen#2 ] ) always clobbers reg byte a reg byte y Statement [17] *((byte*) lvaluevar::screen#2) ← (const byte) lvaluevar::b#0 [ lvaluevar::i#2 lvaluevar::screen#2 ] ( main:2::lvaluevar:11 [ lvaluevar::i#2 lvaluevar::screen#2 ] ) always clobbers reg byte a reg byte y
Statement [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a Statement [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a Statement [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a Statement [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] : zp ZP_BYTE:2 , reg byte x , Potential registers zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] : zp ZP_BYTE:2 , reg byte x ,
Potential registers zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] : zp ZP_WORD:3 , Potential registers zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] : zp ZP_WORD:3 ,
Potential registers zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] : zp ZP_WORD:6 , Potential registers zp ZP_BYTE:6 [ rvalue::i#2 rvalue::i#1 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:8 [ rvalue::i#2 rvalue::i#1 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ] : zp ZP_BYTE:7 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ] : zp ZP_BYTE:9 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES REGISTER UPLIFT SCOPES
Uplift Scope [rvaluevar] 33: zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ] 22: zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
Uplift Scope [lvaluevar] 30.25: zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] 22: zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] Uplift Scope [lvaluevar] 30.25: zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] 22: zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Uplift Scope [rvalue] 38.5: zp ZP_BYTE:8 [ rvalue::i#2 rvalue::i#1 ] Uplift Scope [rvalue] 38.5: zp ZP_BYTE:6 [ rvalue::i#2 rvalue::i#1 ]
Uplift Scope [lvalue] 36.67: zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ] Uplift Scope [rvaluevar] 38.5: zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
Uplift Scope [lvalue] 36.67: zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ]
Uplift Scope [main] Uplift Scope [main]
Uplift Scope [] Uplift Scope []
Uplifting [rvaluevar] best 1710 combination reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ] zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] Uplifting [lvaluevar] best 1485 combination reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Uplifting [lvaluevar] best 1620 combination reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] Uplifting [rvalue] best 1395 combination reg byte x [ rvalue::i#2 rvalue::i#1 ]
Uplifting [rvalue] best 1530 combination reg byte x [ rvalue::i#2 rvalue::i#1 ] Uplifting [rvaluevar] best 1305 combination reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ]
Uplifting [lvalue] best 1410 combination reg byte x [ lvalue::i#2 lvalue::i#1 ] Uplifting [lvalue] best 1185 combination reg byte x [ lvalue::i#2 lvalue::i#1 ]
Uplifting [main] best 1410 combination Uplifting [main] best 1185 combination
Uplifting [] best 1410 combination Uplifting [] best 1185 combination
Coalescing zero page register [ zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] ] with [ zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] ] Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 rvaluevar::screen#2 rvaluevar::screen#1 ]
ASSEMBLER BEFORE OPTIMIZATION ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart //SEG0 Basic Upstart
@ -1064,7 +1013,7 @@ main: {
//SEG12 main::@1 //SEG12 main::@1
b1: b1:
//SEG13 [7] call rvalue [ ] ( main:2 [ ] ) //SEG13 [7] call rvalue [ ] ( main:2 [ ] )
//SEG14 [26] phi from main::@1 to rvalue [phi:main::@1->rvalue] //SEG14 [25] phi from main::@1 to rvalue [phi:main::@1->rvalue]
rvalue_from_b1: rvalue_from_b1:
jsr rvalue jsr rvalue
//SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] //SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
@ -1136,102 +1085,90 @@ lvaluevar: {
} }
//SEG40 rvaluevar //SEG40 rvaluevar
rvaluevar: { rvaluevar: {
.label screen = 2
//SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1] //SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1]
b1_from_rvaluevar: b1_from_rvaluevar:
//SEG42 [21] phi (byte*) rvaluevar::screen#2 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:rvaluevar->rvaluevar::@1#0] -- pbuz1=pbuc1 //SEG42 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#0] -- vbuxx=vbuc1
lda #<$400
sta screen
lda #>$400
sta screen+1
//SEG43 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#1] -- vbuxx=vbuc1
ldx #2 ldx #2
jmp b1 jmp b1
//SEG44 rvaluevar::@1 //SEG43 rvaluevar::@1
b1: b1:
//SEG45 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) -- vbuxx_lt_vbuc1_then_la1 //SEG44 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a cpx #$a
bcc b2 bcc b2
jmp breturn jmp breturn
//SEG46 rvaluevar::@return //SEG45 rvaluevar::@return
breturn: breturn:
//SEG47 [23] return [ ] ( main:2::rvaluevar:9 [ ] ) //SEG46 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
rts rts
//SEG48 rvaluevar::@2 //SEG47 rvaluevar::@2
b2: b2:
//SEG49 [24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) -- pbuz1=_inc_pbuz1 //SEG48 [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] ) -- vbuxx=_inc_vbuxx
inc screen
bne !+
inc screen+1
!:
//SEG50 [25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG51 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1] //SEG49 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
b1_from_b2: b1_from_b2:
//SEG52 [21] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy //SEG50 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
//SEG53 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#1] -- register_copy
jmp b1 jmp b1
} }
//SEG54 rvalue //SEG51 rvalue
rvalue: { rvalue: {
//SEG55 [27] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1] //SEG52 [26] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
b1_from_rvalue: b1_from_rvalue:
//SEG56 [27] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1 //SEG53 [26] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1
ldx #2 ldx #2
jmp b1 jmp b1
//SEG57 rvalue::@1 //SEG54 rvalue::@1
b1: b1:
//SEG58 [28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1 //SEG55 [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a cpx #$a
bcc b2 bcc b2
jmp breturn jmp breturn
//SEG59 rvalue::@return //SEG56 rvalue::@return
breturn: breturn:
//SEG60 [29] return [ ] ( main:2::rvalue:7 [ ] ) //SEG57 [28] return [ ] ( main:2::rvalue:7 [ ] )
rts rts
//SEG61 rvalue::@2 //SEG58 rvalue::@2
b2: b2:
//SEG62 [30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx //SEG59 [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG63 [27] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1] //SEG60 [26] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
b1_from_b2: b1_from_b2:
//SEG64 [27] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy //SEG61 [26] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
jmp b1 jmp b1
} }
//SEG65 lvalue //SEG62 lvalue
lvalue: { lvalue: {
.label SCREEN = $400 .label SCREEN = $400
//SEG66 [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2 //SEG63 [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #1 lda #1
sta SCREEN sta SCREEN
//SEG67 [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2 //SEG64 [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #2 lda #2
sta SCREEN+1 sta SCREEN+1
//SEG68 [33] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1] //SEG65 [32] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
b1_from_lvalue: b1_from_lvalue:
//SEG69 [33] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1 //SEG66 [32] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1
ldx #2 ldx #2
jmp b1 jmp b1
//SEG70 lvalue::@1 //SEG67 lvalue::@1
b1: b1:
//SEG71 [34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1 //SEG68 [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a cpx #$a
bcc b2 bcc b2
jmp breturn jmp breturn
//SEG72 lvalue::@return //SEG69 lvalue::@return
breturn: breturn:
//SEG73 [35] return [ ] ( main:2::lvalue:5 [ ] ) //SEG70 [34] return [ ] ( main:2::lvalue:5 [ ] )
rts rts
//SEG74 lvalue::@2 //SEG71 lvalue::@2
b2: b2:
//SEG75 [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2 //SEG72 [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
lda #3 lda #3
sta SCREEN,x sta SCREEN,x
//SEG76 [37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx //SEG73 [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG77 [33] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1] //SEG74 [32] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
b1_from_b2: b1_from_b2:
//SEG78 [33] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy //SEG75 [32] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
jmp b1 jmp b1
} }
@ -1317,8 +1254,6 @@ FINAL SYMBOL TABLE
(label) rvalue::@1 (label) rvalue::@1
(label) rvalue::@2 (label) rvalue::@2
(label) rvalue::@return (label) rvalue::@return
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::i (byte) rvalue::i
(byte) rvalue::i#1 reg byte x 22.0 (byte) rvalue::i#1 reg byte x 22.0
(byte) rvalue::i#2 reg byte x 16.5 (byte) rvalue::i#2 reg byte x 16.5
@ -1328,20 +1263,17 @@ FINAL SYMBOL TABLE
(label) rvaluevar::@return (label) rvaluevar::@return
(byte) rvaluevar::i (byte) rvaluevar::i
(byte) rvaluevar::i#1 reg byte x 22.0 (byte) rvaluevar::i#1 reg byte x 22.0
(byte) rvaluevar::i#2 reg byte x 11.0 (byte) rvaluevar::i#2 reg byte x 16.5
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 screen zp ZP_WORD:2 11.0
(byte*) rvaluevar::screen#2 screen zp ZP_WORD:2 11.0
reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ]
zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 rvaluevar::screen#2 rvaluevar::screen#1 ] zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ] reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ]
reg byte x [ rvalue::i#2 rvalue::i#1 ] reg byte x [ rvalue::i#2 rvalue::i#1 ]
reg byte x [ lvalue::i#2 lvalue::i#1 ] reg byte x [ lvalue::i#2 lvalue::i#1 ]
FINAL ASSEMBLER FINAL ASSEMBLER
Score: 1152 Score: 927
//SEG0 Basic Upstart //SEG0 Basic Upstart
.pc = $801 "Basic" .pc = $801 "Basic"
@ -1363,7 +1295,7 @@ main: {
//SEG11 [6] phi from main to main::@1 [phi:main->main::@1] //SEG11 [6] phi from main to main::@1 [phi:main->main::@1]
//SEG12 main::@1 //SEG12 main::@1
//SEG13 [7] call rvalue [ ] ( main:2 [ ] ) //SEG13 [7] call rvalue [ ] ( main:2 [ ] )
//SEG14 [26] phi from main::@1 to rvalue [phi:main::@1->rvalue] //SEG14 [25] phi from main::@1 to rvalue [phi:main::@1->rvalue]
jsr rvalue jsr rvalue
//SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] //SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG16 main::@2 //SEG16 main::@2
@ -1419,87 +1351,75 @@ lvaluevar: {
} }
//SEG40 rvaluevar //SEG40 rvaluevar
rvaluevar: { rvaluevar: {
.label screen = 2
//SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1] //SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1]
//SEG42 [21] phi (byte*) rvaluevar::screen#2 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:rvaluevar->rvaluevar::@1#0] -- pbuz1=pbuc1 //SEG42 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#0] -- vbuxx=vbuc1
lda #<$400
sta screen
lda #>$400
sta screen+1
//SEG43 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#1] -- vbuxx=vbuc1
ldx #2 ldx #2
//SEG44 rvaluevar::@1 //SEG43 rvaluevar::@1
b1: b1:
//SEG45 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) -- vbuxx_lt_vbuc1_then_la1 //SEG44 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a cpx #$a
bcc b2 bcc b2
//SEG46 rvaluevar::@return //SEG45 rvaluevar::@return
//SEG47 [23] return [ ] ( main:2::rvaluevar:9 [ ] ) //SEG46 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
rts rts
//SEG48 rvaluevar::@2 //SEG47 rvaluevar::@2
b2: b2:
//SEG49 [24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) -- pbuz1=_inc_pbuz1 //SEG48 [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] ) -- vbuxx=_inc_vbuxx
inc screen
bne !+
inc screen+1
!:
//SEG50 [25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG51 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1] //SEG49 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
//SEG52 [21] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy //SEG50 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
//SEG53 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#1] -- register_copy
jmp b1 jmp b1
} }
//SEG54 rvalue //SEG51 rvalue
rvalue: { rvalue: {
//SEG55 [27] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1] //SEG52 [26] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
//SEG56 [27] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1 //SEG53 [26] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1
ldx #2 ldx #2
//SEG57 rvalue::@1 //SEG54 rvalue::@1
b1: b1:
//SEG58 [28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1 //SEG55 [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a cpx #$a
bcc b2 bcc b2
//SEG59 rvalue::@return //SEG56 rvalue::@return
//SEG60 [29] return [ ] ( main:2::rvalue:7 [ ] ) //SEG57 [28] return [ ] ( main:2::rvalue:7 [ ] )
rts rts
//SEG61 rvalue::@2 //SEG58 rvalue::@2
b2: b2:
//SEG62 [30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx //SEG59 [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG63 [27] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1] //SEG60 [26] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
//SEG64 [27] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy //SEG61 [26] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
jmp b1 jmp b1
} }
//SEG65 lvalue //SEG62 lvalue
lvalue: { lvalue: {
.label SCREEN = $400 .label SCREEN = $400
//SEG66 [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2 //SEG63 [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #1 lda #1
sta SCREEN sta SCREEN
//SEG67 [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2 //SEG64 [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #2 lda #2
sta SCREEN+1 sta SCREEN+1
//SEG68 [33] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1] //SEG65 [32] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
//SEG69 [33] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1 //SEG66 [32] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1
tax tax
//SEG70 lvalue::@1 //SEG67 lvalue::@1
b1: b1:
//SEG71 [34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1 //SEG68 [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a cpx #$a
bcc b2 bcc b2
//SEG72 lvalue::@return //SEG69 lvalue::@return
//SEG73 [35] return [ ] ( main:2::lvalue:5 [ ] ) //SEG70 [34] return [ ] ( main:2::lvalue:5 [ ] )
rts rts
//SEG74 lvalue::@2 //SEG71 lvalue::@2
b2: b2:
//SEG75 [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2 //SEG72 [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
lda #3 lda #3
sta SCREEN,x sta SCREEN,x
//SEG76 [37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx //SEG73 [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG77 [33] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1] //SEG74 [32] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
//SEG78 [33] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy //SEG75 [32] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
jmp b1 jmp b1
} }

View File

@ -31,8 +31,6 @@
(label) rvalue::@1 (label) rvalue::@1
(label) rvalue::@2 (label) rvalue::@2
(label) rvalue::@return (label) rvalue::@return
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::i (byte) rvalue::i
(byte) rvalue::i#1 reg byte x 22.0 (byte) rvalue::i#1 reg byte x 22.0
(byte) rvalue::i#2 reg byte x 16.5 (byte) rvalue::i#2 reg byte x 16.5
@ -42,13 +40,10 @@
(label) rvaluevar::@return (label) rvaluevar::@return
(byte) rvaluevar::i (byte) rvaluevar::i
(byte) rvaluevar::i#1 reg byte x 22.0 (byte) rvaluevar::i#1 reg byte x 22.0
(byte) rvaluevar::i#2 reg byte x 11.0 (byte) rvaluevar::i#2 reg byte x 16.5
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 screen zp ZP_WORD:2 11.0
(byte*) rvaluevar::screen#2 screen zp ZP_WORD:2 11.0
reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ]
zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 rvaluevar::screen#2 rvaluevar::screen#1 ] zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ] reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ]
reg byte x [ rvalue::i#2 rvalue::i#1 ] reg byte x [ rvalue::i#2 rvalue::i#1 ]
reg byte x [ lvalue::i#2 lvalue::i#1 ] reg byte x [ lvalue::i#2 lvalue::i#1 ]

View File

@ -272,7 +272,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[135] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [135] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[135] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [135] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[135] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [135] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[135] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [135] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[136] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) [136] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[137] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ) [137] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[138] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ) [138] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
@ -292,10 +292,10 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
[146] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::wavelength#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) [146] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::wavelength#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3 to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5 divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[147] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ) [147] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[147] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ) [147] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[148] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) [148] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[149] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) [149] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3 divr16u::@return: scope:[divr16u] from divr16u::@3
[150] return [ divr16u::return#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 ] ) [150] return [ divr16u::return#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 ] )

File diff suppressed because one or more lines are too long

View File

@ -38,10 +38,10 @@
(word) divr16u::rem (word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:2 8.25 (word) divr16u::rem#0 rem zp ZP_WORD:2 8.25
(word) divr16u::rem#1 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#1 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#10 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#2 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#2 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#4 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#4 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#5 rem zp ZP_WORD:2 11.0 (word) divr16u::rem#5 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#9 rem zp ZP_WORD:2 11.0
(word) divr16u::return (word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:14 7.000000000000001 (word) divr16u::return#0 return zp ZP_WORD:14 7.000000000000001
(word) divr16u::return#2 return zp ZP_WORD:14 4.0 (word) divr16u::return#2 return zp ZP_WORD:14 4.0
@ -165,7 +165,6 @@
(byte*) print_str::str#0 str zp ZP_WORD:2 202.0 (byte*) print_str::str#0 str zp ZP_WORD:2 202.0
(byte*) print_str::str#3 str zp ZP_WORD:2 101.5 (byte*) print_str::str#3 str zp ZP_WORD:2 101.5
(byte*) print_str::str#5 str zp ZP_WORD:2 2.0 (byte*) print_str::str#5 str zp ZP_WORD:2 2.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x) (signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 $6 zp ZP_WORD:9 4.0 (word~) sin8s::$6 $6 zp ZP_WORD:9 4.0
(label) sin8s::@1 (label) sin8s::@1
@ -238,7 +237,7 @@
(word) sin8s_gen::x#2 x zp ZP_WORD:2 4.714285714285714 (word) sin8s_gen::x#2 x zp ZP_WORD:2 4.714285714285714
reg byte x [ main::i#2 main::i#1 ] reg byte x [ main::i#2 main::i#1 ]
zp ZP_WORD:2 [ print_str::str#3 print_str::str#5 print_str::str#0 print_cls::sc#2 print_cls::sc#1 sin8s_gen::x#2 sin8s_gen::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] zp ZP_WORD:2 [ print_str::str#3 print_str::str#5 print_str::str#0 print_cls::sc#2 print_cls::sc#1 sin8s_gen::x#2 sin8s_gen::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
zp ZP_BYTE:4 [ print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#0 main::sb#0 sin8s::isUpper#10 ] zp ZP_BYTE:4 [ print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#0 main::sb#0 sin8s::isUpper#10 ]
reg byte a [ print_char::ch#3 print_char::ch#1 print_char::ch#2 ] reg byte a [ print_char::ch#3 print_char::ch#1 print_char::ch#2 ]
zp ZP_WORD:5 [ print_char_cursor#27 print_char_cursor#37 print_char_cursor#44 print_char_cursor#41 print_char_cursor#42 print_char_cursor#19 print_char_cursor#10 print_char_cursor#1 sin8s_gen::sintab#2 sin8s_gen::sintab#0 divr16u::dividend#2 divr16u::dividend#0 ] zp ZP_WORD:5 [ print_char_cursor#27 print_char_cursor#37 print_char_cursor#44 print_char_cursor#41 print_char_cursor#42 print_char_cursor#19 print_char_cursor#10 print_char_cursor#1 sin8s_gen::sintab#2 sin8s_gen::sintab#0 divr16u::dividend#2 divr16u::dividend#0 ]

View File

@ -390,7 +390,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[194] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) [195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[196] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ) [196] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[197] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ) [197] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
@ -410,10 +410,10 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
[205] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::tabsize#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) [205] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::tabsize#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3 to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5 divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ) [206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[206] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ) [206] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3 divr16u::@return: scope:[divr16u] from divr16u::@3
[209] return [ divr16u::return#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 ] ) [209] return [ divr16u::return#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 ] )

View File

@ -2354,6 +2354,8 @@ Removing unused procedure divr8u
Removing unused procedure mulu16_sel Removing unused procedure mulu16_sel
Removing unused procedure mul16u Removing unused procedure mul16u
Eliminating unused variable (byte) rem8u and assignment [0] (byte) rem8u ← (byte/signed byte/word/signed word/dword/signed dword) 0 Eliminating unused variable (byte) rem8u and assignment [0] (byte) rem8u ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (word) rem16u and assignment [1] (word) rem16u ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable rem16u(null) and assignment [26] rem16u(null) ← (word) divr16u::rem
Eliminating unused variable (signed byte) rem8s and assignment [34] (signed byte) rem8s ← (byte/signed byte/word/signed word/dword/signed dword) 0 Eliminating unused variable (signed byte) rem8s and assignment [34] (signed byte) rem8s ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (signed word) rem16s and assignment [35] (signed word) rem16s ← (byte/signed byte/word/signed word/dword/signed dword) 0 Eliminating unused variable (signed word) rem16s and assignment [35] (signed word) rem16s ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (byte~) mul8su::$5 and assignment [62] (byte~) mul8su::$5 ← > (word) mul8su::m Eliminating unused variable (byte~) mul8su::$5 and assignment [62] (byte~) mul8su::$5 ← > (word) mul8su::m
@ -2401,6 +2403,7 @@ Creating constant string variable for inline (const string) sin8u_table::str6 "
Creating constant string variable for inline (const string) sin8u_table::str7 " scaled: @" Creating constant string variable for inline (const string) sin8u_table::str7 " scaled: @"
Creating constant string variable for inline (const string) sin8u_table::str8 " trans: @" Creating constant string variable for inline (const string) sin8u_table::str8 " trans: @"
Removing empty block @1 Removing empty block @1
Removing empty block @2
Removing empty block divr16u::@7 Removing empty block divr16u::@7
Removing empty block @3 Removing empty block @3
Removing empty block div16u::@1 Removing empty block div16u::@1
@ -2446,8 +2449,6 @@ Removing empty block @34
Removing empty block @35 Removing empty block @35
Removing empty block sin8u_table::@2 Removing empty block sin8u_table::@2
PROCEDURE MODIFY VARIABLE ANALYSIS PROCEDURE MODIFY VARIABLE ANALYSIS
divr16u modifies rem16u
div16u modifies rem16u
print_str modifies print_char_cursor print_str modifies print_char_cursor
print_ln modifies print_line_cursor print_ln modifies print_line_cursor
print_ln modifies print_char_cursor print_ln modifies print_char_cursor
@ -2460,8 +2461,6 @@ print_cls modifies print_line_cursor
print_cls modifies print_char_cursor print_cls modifies print_char_cursor
main modifies print_line_cursor main modifies print_line_cursor
main modifies print_char_cursor main modifies print_char_cursor
main modifies rem16u
sin8u_table modifies rem16u
sin8u_table modifies print_char_cursor sin8u_table modifies print_char_cursor
sin8u_table modifies print_line_cursor sin8u_table modifies print_line_cursor
@ -2492,14 +2491,11 @@ Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from @begin: scope:[] from
to:@2
@2: scope:[] from @begin
(word) rem16u#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:@13 to:@13
divr16u: scope:[divr16u] from div16u divr16u: scope:[divr16u] from div16u
(word) divr16u::divisor#5 ← phi( div16u/(word) divr16u::divisor#0 ) (word) divr16u::divisor#5 ← phi( div16u/(word) divr16u::divisor#0 )
(word) divr16u::dividend#4 ← phi( div16u/(word) divr16u::dividend#1 ) (word) divr16u::dividend#4 ← phi( div16u/(word) divr16u::dividend#1 )
(word) divr16u::rem#9 ← phi( div16u/(word) divr16u::rem#3 ) (word) divr16u::rem#8 ← phi( div16u/(word) divr16u::rem#3 )
(word) divr16u::quotient#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 (word) divr16u::quotient#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) divr16u::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 (byte) divr16u::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:divr16u::@1 to:divr16u::@1
@ -2508,7 +2504,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
(word) divr16u::divisor#3 ← phi( divr16u/(word) divr16u::divisor#5 divr16u::@3/(word) divr16u::divisor#6 ) (word) divr16u::divisor#3 ← phi( divr16u/(word) divr16u::divisor#5 divr16u::@3/(word) divr16u::divisor#6 )
(word) divr16u::quotient#6 ← phi( divr16u/(word) divr16u::quotient#0 divr16u::@3/(word) divr16u::quotient#8 ) (word) divr16u::quotient#6 ← phi( divr16u/(word) divr16u::quotient#0 divr16u::@3/(word) divr16u::quotient#8 )
(word) divr16u::dividend#2 ← phi( divr16u/(word) divr16u::dividend#4 divr16u::@3/(word) divr16u::dividend#5 ) (word) divr16u::dividend#2 ← phi( divr16u/(word) divr16u::dividend#4 divr16u::@3/(word) divr16u::dividend#5 )
(word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#9 divr16u::@3/(word) divr16u::rem#10 ) (word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#8 divr16u::@3/(word) divr16u::rem#9 )
(word~) divr16u::$0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 (word~) divr16u::$0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1
(word) divr16u::rem#0 ← (word~) divr16u::$0 (word) divr16u::rem#0 ← (word~) divr16u::$0
(byte~) divr16u::$1 ← > (word) divr16u::dividend#2 (byte~) divr16u::$1 ← > (word) divr16u::dividend#2
@ -2544,7 +2540,7 @@ divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
(word) divr16u::divisor#6 ← phi( divr16u::@2/(word) divr16u::divisor#1 divr16u::@5/(word) divr16u::divisor#2 ) (word) divr16u::divisor#6 ← phi( divr16u::@2/(word) divr16u::divisor#1 divr16u::@5/(word) divr16u::divisor#2 )
(word) divr16u::quotient#8 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) (word) divr16u::quotient#8 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 )
(word) divr16u::dividend#5 ← phi( divr16u::@2/(word) divr16u::dividend#0 divr16u::@5/(word) divr16u::dividend#7 ) (word) divr16u::dividend#5 ← phi( divr16u::@2/(word) divr16u::dividend#0 divr16u::@5/(word) divr16u::dividend#7 )
(word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 )
(byte) divr16u::i#2 ← phi( divr16u::@2/(byte) divr16u::i#3 divr16u::@5/(byte) divr16u::i#4 ) (byte) divr16u::i#2 ← phi( divr16u::@2/(byte) divr16u::i#3 divr16u::@5/(byte) divr16u::i#4 )
(byte) divr16u::i#1 ← (byte) divr16u::i#2 + rangenext(0,15) (byte) divr16u::i#1 ← (byte) divr16u::i#2 + rangenext(0,15)
(bool~) divr16u::$11 ← (byte) divr16u::i#1 != rangelast(0,15) (bool~) divr16u::$11 ← (byte) divr16u::i#1 != rangelast(0,15)
@ -2562,19 +2558,14 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
to:divr16u::@3 to:divr16u::@3
divr16u::@6: scope:[divr16u] from divr16u::@3 divr16u::@6: scope:[divr16u] from divr16u::@3
(word) divr16u::quotient#5 ← phi( divr16u::@3/(word) divr16u::quotient#8 ) (word) divr16u::quotient#5 ← phi( divr16u::@3/(word) divr16u::quotient#8 )
(word) divr16u::rem#8 ← phi( divr16u::@3/(word) divr16u::rem#10 )
(word) rem16u#1 ← (word) divr16u::rem#8
(word) divr16u::return#0 ← (word) divr16u::quotient#5 (word) divr16u::return#0 ← (word) divr16u::quotient#5
to:divr16u::@return to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@6 divr16u::@return: scope:[divr16u] from divr16u::@6
(word) rem16u#10 ← phi( divr16u::@6/(word) rem16u#1 )
(word) divr16u::return#3 ← phi( divr16u::@6/(word) divr16u::return#0 ) (word) divr16u::return#3 ← phi( divr16u::@6/(word) divr16u::return#0 )
(word) divr16u::return#1 ← (word) divr16u::return#3 (word) divr16u::return#1 ← (word) divr16u::return#3
(word) rem16u#2 ← (word) rem16u#10
return return
to:@return to:@return
div16u: scope:[div16u] from sin8u_table div16u: scope:[div16u] from sin8u_table
(word) rem16u#18 ← phi( sin8u_table/(word) rem16u#20 )
(word) div16u::divisor#1 ← phi( sin8u_table/(word) div16u::divisor#0 ) (word) div16u::divisor#1 ← phi( sin8u_table/(word) div16u::divisor#0 )
(word) div16u::dividend#1 ← phi( sin8u_table/(word) div16u::dividend#0 ) (word) div16u::dividend#1 ← phi( sin8u_table/(word) div16u::dividend#0 )
(word) divr16u::dividend#1 ← (word) div16u::dividend#1 (word) divr16u::dividend#1 ← (word) div16u::dividend#1
@ -2584,17 +2575,13 @@ div16u: scope:[div16u] from sin8u_table
(word) divr16u::return#2 ← (word) divr16u::return#1 (word) divr16u::return#2 ← (word) divr16u::return#1
to:div16u::@2 to:div16u::@2
div16u::@2: scope:[div16u] from div16u div16u::@2: scope:[div16u] from div16u
(word) rem16u#11 ← phi( div16u/(word) rem16u#2 )
(word) divr16u::return#4 ← phi( div16u/(word) divr16u::return#2 ) (word) divr16u::return#4 ← phi( div16u/(word) divr16u::return#2 )
(word~) div16u::$0 ← (word) divr16u::return#4 (word~) div16u::$0 ← (word) divr16u::return#4
(word) rem16u#3 ← (word) rem16u#11
(word) div16u::return#0 ← (word~) div16u::$0 (word) div16u::return#0 ← (word~) div16u::$0
to:div16u::@return to:div16u::@return
div16u::@return: scope:[div16u] from div16u::@2 div16u::@return: scope:[div16u] from div16u::@2
(word) rem16u#12 ← phi( div16u::@2/(word) rem16u#3 )
(word) div16u::return#3 ← phi( div16u::@2/(word) div16u::return#0 ) (word) div16u::return#3 ← phi( div16u::@2/(word) div16u::return#0 )
(word) div16u::return#1 ← (word) div16u::return#3 (word) div16u::return#1 ← (word) div16u::return#3
(word) rem16u#4 ← (word) rem16u#12
return return
to:@return to:@return
mul8u: scope:[mul8u] from mul8su mulu8_sel mul8u: scope:[mul8u] from mul8su mulu8_sel
@ -2683,8 +2670,7 @@ mul8su::@return: scope:[mul8su] from mul8su::@1
(signed word) mul8su::return#1 ← (signed word) mul8su::return#3 (signed word) mul8su::return#1 ← (signed word) mul8su::return#3
return return
to:@return to:@return
@13: scope:[] from @2 @13: scope:[] from @begin
(word) rem16u#28 ← phi( @2/(word) rem16u#0 )
(word) PI2_u4f12#0 ← (word/signed word/dword/signed dword) 25736 (word) PI2_u4f12#0 ← (word/signed word/dword/signed dword) 25736
(word) PI_u4f12#0 ← (word/signed word/dword/signed dword) 12868 (word) PI_u4f12#0 ← (word/signed word/dword/signed dword) 12868
(word) PI_HALF_u4f12#0 ← (word/signed word/dword/signed dword) 6434 (word) PI_HALF_u4f12#0 ← (word/signed word/dword/signed dword) 6434
@ -2846,7 +2832,6 @@ mulu8_sel::@return: scope:[mulu8_sel] from mulu8_sel::@2
return return
to:@return to:@return
@20: scope:[] from @13 @20: scope:[] from @13
(word) rem16u#26 ← phi( @13/(word) rem16u#28 )
(byte*) print_screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024 (byte*) print_screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) print_line_cursor#0 ← (byte*) print_screen#0 (byte*) print_line_cursor#0 ← (byte*) print_screen#0
(byte*) print_char_cursor#0 ← (byte*) print_line_cursor#0 (byte*) print_char_cursor#0 ← (byte*) print_line_cursor#0
@ -2994,7 +2979,6 @@ print_word::@return: scope:[print_word] from print_word::@2
to:@return to:@return
@30: scope:[] from @20 @30: scope:[] from @20
(byte*) print_screen#6 ← phi( @20/(byte*) print_screen#0 ) (byte*) print_screen#6 ← phi( @20/(byte*) print_screen#0 )
(word) rem16u#25 ← phi( @20/(word) rem16u#26 )
(byte*) print_char_cursor#107 ← phi( @20/(byte*) print_char_cursor#0 ) (byte*) print_char_cursor#107 ← phi( @20/(byte*) print_char_cursor#0 )
(byte*) print_line_cursor#30 ← phi( @20/(byte*) print_line_cursor#0 ) (byte*) print_line_cursor#30 ← phi( @20/(byte*) print_line_cursor#0 )
(byte[]) print_hextab#0 ← (const string) $0 (byte[]) print_hextab#0 ← (const string) $0
@ -3060,7 +3044,6 @@ print_cls::@return: scope:[print_cls] from print_cls::@2
return return
to:@return to:@return
main: scope:[main] from @36 main: scope:[main] from @36
(word) rem16u#23 ← phi( @36/(word) rem16u#22 )
(byte*) print_char_cursor#98 ← phi( @36/(byte*) print_char_cursor#101 ) (byte*) print_char_cursor#98 ← phi( @36/(byte*) print_char_cursor#101 )
(byte*) print_line_cursor#24 ← phi( @36/(byte*) print_line_cursor#27 ) (byte*) print_line_cursor#24 ← phi( @36/(byte*) print_line_cursor#27 )
(byte*) print_screen#4 ← phi( @36/(byte*) print_screen#5 ) (byte*) print_screen#4 ← phi( @36/(byte*) print_screen#5 )
@ -3069,7 +3052,6 @@ main: scope:[main] from @36
call print_cls call print_cls
to:main::@1 to:main::@1
main::@1: scope:[main] from main main::@1: scope:[main] from main
(word) rem16u#19 ← phi( main/(word) rem16u#23 )
(word) main::tabsize#1 ← phi( main/(word) main::tabsize#0 ) (word) main::tabsize#1 ← phi( main/(word) main::tabsize#0 )
(byte*) print_char_cursor#65 ← phi( main/(byte*) print_char_cursor#20 ) (byte*) print_char_cursor#65 ← phi( main/(byte*) print_char_cursor#20 )
(byte*) print_line_cursor#16 ← phi( main/(byte*) print_line_cursor#4 ) (byte*) print_line_cursor#16 ← phi( main/(byte*) print_line_cursor#4 )
@ -3084,25 +3066,20 @@ main::@1: scope:[main] from main
main::@2: scope:[main] from main::@1 main::@2: scope:[main] from main::@1
(byte*) print_line_cursor#17 ← phi( main::@1/(byte*) print_line_cursor#10 ) (byte*) print_line_cursor#17 ← phi( main::@1/(byte*) print_line_cursor#10 )
(byte*) print_char_cursor#66 ← phi( main::@1/(byte*) print_char_cursor#44 ) (byte*) print_char_cursor#66 ← phi( main::@1/(byte*) print_char_cursor#44 )
(word) rem16u#13 ← phi( main::@1/(word) rem16u#8 )
(word) rem16u#5 ← (word) rem16u#13
(byte*) print_char_cursor#22 ← (byte*) print_char_cursor#66 (byte*) print_char_cursor#22 ← (byte*) print_char_cursor#66
(byte*) print_line_cursor#6 ← (byte*) print_line_cursor#17 (byte*) print_line_cursor#6 ← (byte*) print_line_cursor#17
to:main::@return to:main::@return
main::@return: scope:[main] from main::@2 main::@return: scope:[main] from main::@2
(word) rem16u#14 ← phi( main::@2/(word) rem16u#5 )
(byte*) print_char_cursor#67 ← phi( main::@2/(byte*) print_char_cursor#22 ) (byte*) print_char_cursor#67 ← phi( main::@2/(byte*) print_char_cursor#22 )
(byte*) print_line_cursor#18 ← phi( main::@2/(byte*) print_line_cursor#6 ) (byte*) print_line_cursor#18 ← phi( main::@2/(byte*) print_line_cursor#6 )
(byte*) print_line_cursor#7 ← (byte*) print_line_cursor#18 (byte*) print_line_cursor#7 ← (byte*) print_line_cursor#18
(byte*) print_char_cursor#23 ← (byte*) print_char_cursor#67 (byte*) print_char_cursor#23 ← (byte*) print_char_cursor#67
(word) rem16u#6 ← (word) rem16u#14
return return
to:@return to:@return
sin8u_table: scope:[sin8u_table] from main::@1 sin8u_table: scope:[sin8u_table] from main::@1
(byte*) sin8u_table::sintab#26 ← phi( main::@1/(byte*) sin8u_table::sintab#0 ) (byte*) sin8u_table::sintab#26 ← phi( main::@1/(byte*) sin8u_table::sintab#0 )
(byte*) print_line_cursor#49 ← phi( main::@1/(byte*) print_line_cursor#5 ) (byte*) print_line_cursor#49 ← phi( main::@1/(byte*) print_line_cursor#5 )
(byte*) print_char_cursor#105 ← phi( main::@1/(byte*) print_char_cursor#21 ) (byte*) print_char_cursor#105 ← phi( main::@1/(byte*) print_char_cursor#21 )
(word) rem16u#20 ← phi( main::@1/(word) rem16u#19 )
(word) sin8u_table::tabsize#1 ← phi( main::@1/(word) sin8u_table::tabsize#0 ) (word) sin8u_table::tabsize#1 ← phi( main::@1/(word) sin8u_table::tabsize#0 )
(byte) sin8u_table::min#1 ← phi( main::@1/(byte) sin8u_table::min#0 ) (byte) sin8u_table::min#1 ← phi( main::@1/(byte) sin8u_table::min#0 )
(byte) sin8u_table::max#1 ← phi( main::@1/(byte) sin8u_table::max#0 ) (byte) sin8u_table::max#1 ← phi( main::@1/(byte) sin8u_table::max#0 )
@ -3129,16 +3106,13 @@ sin8u_table::@3: scope:[sin8u_table] from sin8u_table
(byte) sin8u_table::max#7 ← phi( sin8u_table/(byte) sin8u_table::max#1 ) (byte) sin8u_table::max#7 ← phi( sin8u_table/(byte) sin8u_table::max#1 )
(byte) sin8u_table::min#5 ← phi( sin8u_table/(byte) sin8u_table::min#1 ) (byte) sin8u_table::min#5 ← phi( sin8u_table/(byte) sin8u_table::min#1 )
(byte*) print_char_cursor#99 ← phi( sin8u_table/(byte*) print_char_cursor#105 ) (byte*) print_char_cursor#99 ← phi( sin8u_table/(byte*) print_char_cursor#105 )
(word) rem16u#15 ← phi( sin8u_table/(word) rem16u#4 )
(word) div16u::return#4 ← phi( sin8u_table/(word) div16u::return#2 ) (word) div16u::return#4 ← phi( sin8u_table/(word) div16u::return#2 )
(word~) sin8u_table::$6 ← (word) div16u::return#4 (word~) sin8u_table::$6 ← (word) div16u::return#4
(word) rem16u#7 ← (word) rem16u#15
(word) sin8u_table::step#0 ← (word~) sin8u_table::$6 (word) sin8u_table::step#0 ← (word~) sin8u_table::$6
(byte*) print_str::str#1 ← (const string) sin8u_table::str (byte*) print_str::str#1 ← (const string) sin8u_table::str
call print_str call print_str
to:sin8u_table::@4 to:sin8u_table::@4
sin8u_table::@4: scope:[sin8u_table] from sin8u_table::@3 sin8u_table::@4: scope:[sin8u_table] from sin8u_table::@3
(word) rem16u#48 ← phi( sin8u_table::@3/(word) rem16u#7 )
(word) sin8u_table::tabsize#24 ← phi( sin8u_table::@3/(word) sin8u_table::tabsize#25 ) (word) sin8u_table::tabsize#24 ← phi( sin8u_table::@3/(word) sin8u_table::tabsize#25 )
(byte*) sin8u_table::sintab#24 ← phi( sin8u_table::@3/(byte*) sin8u_table::sintab#25 ) (byte*) sin8u_table::sintab#24 ← phi( sin8u_table::@3/(byte*) sin8u_table::sintab#25 )
(byte*) print_line_cursor#45 ← phi( sin8u_table::@3/(byte*) print_line_cursor#47 ) (byte*) print_line_cursor#45 ← phi( sin8u_table::@3/(byte*) print_line_cursor#47 )
@ -3153,7 +3127,6 @@ sin8u_table::@4: scope:[sin8u_table] from sin8u_table::@3
call print_word call print_word
to:sin8u_table::@5 to:sin8u_table::@5
sin8u_table::@5: scope:[sin8u_table] from sin8u_table::@4 sin8u_table::@5: scope:[sin8u_table] from sin8u_table::@4
(word) rem16u#47 ← phi( sin8u_table::@4/(word) rem16u#48 )
(word) sin8u_table::tabsize#23 ← phi( sin8u_table::@4/(word) sin8u_table::tabsize#24 ) (word) sin8u_table::tabsize#23 ← phi( sin8u_table::@4/(word) sin8u_table::tabsize#24 )
(word) sin8u_table::step#23 ← phi( sin8u_table::@4/(word) sin8u_table::step#1 ) (word) sin8u_table::step#23 ← phi( sin8u_table::@4/(word) sin8u_table::step#1 )
(byte*) sin8u_table::sintab#23 ← phi( sin8u_table::@4/(byte*) sin8u_table::sintab#24 ) (byte*) sin8u_table::sintab#23 ← phi( sin8u_table::@4/(byte*) sin8u_table::sintab#24 )
@ -3168,7 +3141,6 @@ sin8u_table::@5: scope:[sin8u_table] from sin8u_table::@4
call print_str call print_str
to:sin8u_table::@6 to:sin8u_table::@6
sin8u_table::@6: scope:[sin8u_table] from sin8u_table::@5 sin8u_table::@6: scope:[sin8u_table] from sin8u_table::@5
(word) rem16u#46 ← phi( sin8u_table::@5/(word) rem16u#47 )
(word) sin8u_table::tabsize#22 ← phi( sin8u_table::@5/(word) sin8u_table::tabsize#23 ) (word) sin8u_table::tabsize#22 ← phi( sin8u_table::@5/(word) sin8u_table::tabsize#23 )
(word) sin8u_table::step#22 ← phi( sin8u_table::@5/(word) sin8u_table::step#23 ) (word) sin8u_table::step#22 ← phi( sin8u_table::@5/(word) sin8u_table::step#23 )
(byte*) sin8u_table::sintab#21 ← phi( sin8u_table::@5/(byte*) sin8u_table::sintab#23 ) (byte*) sin8u_table::sintab#21 ← phi( sin8u_table::@5/(byte*) sin8u_table::sintab#23 )
@ -3183,7 +3155,6 @@ sin8u_table::@6: scope:[sin8u_table] from sin8u_table::@5
call print_byte call print_byte
to:sin8u_table::@7 to:sin8u_table::@7
sin8u_table::@7: scope:[sin8u_table] from sin8u_table::@6 sin8u_table::@7: scope:[sin8u_table] from sin8u_table::@6
(word) rem16u#45 ← phi( sin8u_table::@6/(word) rem16u#46 )
(word) sin8u_table::tabsize#21 ← phi( sin8u_table::@6/(word) sin8u_table::tabsize#22 ) (word) sin8u_table::tabsize#21 ← phi( sin8u_table::@6/(word) sin8u_table::tabsize#22 )
(word) sin8u_table::step#21 ← phi( sin8u_table::@6/(word) sin8u_table::step#22 ) (word) sin8u_table::step#21 ← phi( sin8u_table::@6/(word) sin8u_table::step#22 )
(byte*) sin8u_table::sintab#19 ← phi( sin8u_table::@6/(byte*) sin8u_table::sintab#21 ) (byte*) sin8u_table::sintab#19 ← phi( sin8u_table::@6/(byte*) sin8u_table::sintab#21 )
@ -3197,7 +3168,6 @@ sin8u_table::@7: scope:[sin8u_table] from sin8u_table::@6
call print_str call print_str
to:sin8u_table::@8 to:sin8u_table::@8
sin8u_table::@8: scope:[sin8u_table] from sin8u_table::@7 sin8u_table::@8: scope:[sin8u_table] from sin8u_table::@7
(word) rem16u#44 ← phi( sin8u_table::@7/(word) rem16u#45 )
(word) sin8u_table::tabsize#20 ← phi( sin8u_table::@7/(word) sin8u_table::tabsize#21 ) (word) sin8u_table::tabsize#20 ← phi( sin8u_table::@7/(word) sin8u_table::tabsize#21 )
(word) sin8u_table::step#20 ← phi( sin8u_table::@7/(word) sin8u_table::step#21 ) (word) sin8u_table::step#20 ← phi( sin8u_table::@7/(word) sin8u_table::step#21 )
(byte*) sin8u_table::sintab#17 ← phi( sin8u_table::@7/(byte*) sin8u_table::sintab#19 ) (byte*) sin8u_table::sintab#17 ← phi( sin8u_table::@7/(byte*) sin8u_table::sintab#19 )
@ -3211,7 +3181,6 @@ sin8u_table::@8: scope:[sin8u_table] from sin8u_table::@7
call print_byte call print_byte
to:sin8u_table::@9 to:sin8u_table::@9
sin8u_table::@9: scope:[sin8u_table] from sin8u_table::@8 sin8u_table::@9: scope:[sin8u_table] from sin8u_table::@8
(word) rem16u#43 ← phi( sin8u_table::@8/(word) rem16u#44 )
(word) sin8u_table::tabsize#19 ← phi( sin8u_table::@8/(word) sin8u_table::tabsize#20 ) (word) sin8u_table::tabsize#19 ← phi( sin8u_table::@8/(word) sin8u_table::tabsize#20 )
(word) sin8u_table::step#19 ← phi( sin8u_table::@8/(word) sin8u_table::step#20 ) (word) sin8u_table::step#19 ← phi( sin8u_table::@8/(word) sin8u_table::step#20 )
(byte*) sin8u_table::sintab#15 ← phi( sin8u_table::@8/(byte*) sin8u_table::sintab#17 ) (byte*) sin8u_table::sintab#15 ← phi( sin8u_table::@8/(byte*) sin8u_table::sintab#17 )
@ -3224,7 +3193,6 @@ sin8u_table::@9: scope:[sin8u_table] from sin8u_table::@8
call print_str call print_str
to:sin8u_table::@10 to:sin8u_table::@10
sin8u_table::@10: scope:[sin8u_table] from sin8u_table::@9 sin8u_table::@10: scope:[sin8u_table] from sin8u_table::@9
(word) rem16u#42 ← phi( sin8u_table::@9/(word) rem16u#43 )
(word) sin8u_table::tabsize#18 ← phi( sin8u_table::@9/(word) sin8u_table::tabsize#19 ) (word) sin8u_table::tabsize#18 ← phi( sin8u_table::@9/(word) sin8u_table::tabsize#19 )
(word) sin8u_table::step#18 ← phi( sin8u_table::@9/(word) sin8u_table::step#19 ) (word) sin8u_table::step#18 ← phi( sin8u_table::@9/(word) sin8u_table::step#19 )
(byte*) sin8u_table::sintab#13 ← phi( sin8u_table::@9/(byte*) sin8u_table::sintab#15 ) (byte*) sin8u_table::sintab#13 ← phi( sin8u_table::@9/(byte*) sin8u_table::sintab#15 )
@ -3237,7 +3205,6 @@ sin8u_table::@10: scope:[sin8u_table] from sin8u_table::@9
call print_byte call print_byte
to:sin8u_table::@11 to:sin8u_table::@11
sin8u_table::@11: scope:[sin8u_table] from sin8u_table::@10 sin8u_table::@11: scope:[sin8u_table] from sin8u_table::@10
(word) rem16u#41 ← phi( sin8u_table::@10/(word) rem16u#42 )
(word) sin8u_table::tabsize#17 ← phi( sin8u_table::@10/(word) sin8u_table::tabsize#18 ) (word) sin8u_table::tabsize#17 ← phi( sin8u_table::@10/(word) sin8u_table::tabsize#18 )
(word) sin8u_table::step#17 ← phi( sin8u_table::@10/(word) sin8u_table::step#18 ) (word) sin8u_table::step#17 ← phi( sin8u_table::@10/(word) sin8u_table::step#18 )
(byte*) sin8u_table::sintab#11 ← phi( sin8u_table::@10/(byte*) sin8u_table::sintab#13 ) (byte*) sin8u_table::sintab#11 ← phi( sin8u_table::@10/(byte*) sin8u_table::sintab#13 )
@ -3250,7 +3217,6 @@ sin8u_table::@11: scope:[sin8u_table] from sin8u_table::@10
call print_str call print_str
to:sin8u_table::@12 to:sin8u_table::@12
sin8u_table::@12: scope:[sin8u_table] from sin8u_table::@11 sin8u_table::@12: scope:[sin8u_table] from sin8u_table::@11
(word) rem16u#40 ← phi( sin8u_table::@11/(word) rem16u#41 )
(word) sin8u_table::tabsize#16 ← phi( sin8u_table::@11/(word) sin8u_table::tabsize#17 ) (word) sin8u_table::tabsize#16 ← phi( sin8u_table::@11/(word) sin8u_table::tabsize#17 )
(word) sin8u_table::step#16 ← phi( sin8u_table::@11/(word) sin8u_table::step#17 ) (word) sin8u_table::step#16 ← phi( sin8u_table::@11/(word) sin8u_table::step#17 )
(byte*) sin8u_table::sintab#9 ← phi( sin8u_table::@11/(byte*) sin8u_table::sintab#11 ) (byte*) sin8u_table::sintab#9 ← phi( sin8u_table::@11/(byte*) sin8u_table::sintab#11 )
@ -3263,7 +3229,6 @@ sin8u_table::@12: scope:[sin8u_table] from sin8u_table::@11
call print_byte call print_byte
to:sin8u_table::@13 to:sin8u_table::@13
sin8u_table::@13: scope:[sin8u_table] from sin8u_table::@12 sin8u_table::@13: scope:[sin8u_table] from sin8u_table::@12
(word) rem16u#39 ← phi( sin8u_table::@12/(word) rem16u#40 )
(word) sin8u_table::tabsize#15 ← phi( sin8u_table::@12/(word) sin8u_table::tabsize#16 ) (word) sin8u_table::tabsize#15 ← phi( sin8u_table::@12/(word) sin8u_table::tabsize#16 )
(word) sin8u_table::step#15 ← phi( sin8u_table::@12/(word) sin8u_table::step#16 ) (word) sin8u_table::step#15 ← phi( sin8u_table::@12/(word) sin8u_table::step#16 )
(byte*) sin8u_table::sintab#7 ← phi( sin8u_table::@12/(byte*) sin8u_table::sintab#9 ) (byte*) sin8u_table::sintab#7 ← phi( sin8u_table::@12/(byte*) sin8u_table::sintab#9 )
@ -3275,7 +3240,6 @@ sin8u_table::@13: scope:[sin8u_table] from sin8u_table::@12
call print_ln call print_ln
to:sin8u_table::@14 to:sin8u_table::@14
sin8u_table::@14: scope:[sin8u_table] from sin8u_table::@13 sin8u_table::@14: scope:[sin8u_table] from sin8u_table::@13
(word) rem16u#38 ← phi( sin8u_table::@13/(word) rem16u#39 )
(word) sin8u_table::tabsize#14 ← phi( sin8u_table::@13/(word) sin8u_table::tabsize#15 ) (word) sin8u_table::tabsize#14 ← phi( sin8u_table::@13/(word) sin8u_table::tabsize#15 )
(word) sin8u_table::step#14 ← phi( sin8u_table::@13/(word) sin8u_table::step#15 ) (word) sin8u_table::step#14 ← phi( sin8u_table::@13/(word) sin8u_table::step#15 )
(byte*) sin8u_table::sintab#5 ← phi( sin8u_table::@13/(byte*) sin8u_table::sintab#7 ) (byte*) sin8u_table::sintab#5 ← phi( sin8u_table::@13/(byte*) sin8u_table::sintab#7 )
@ -3289,7 +3253,6 @@ sin8u_table::@14: scope:[sin8u_table] from sin8u_table::@13
(word) sin8u_table::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 (word) sin8u_table::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:sin8u_table::@1 to:sin8u_table::@1
sin8u_table::@1: scope:[sin8u_table] from sin8u_table::@14 sin8u_table::@25 sin8u_table::@1: scope:[sin8u_table] from sin8u_table::@14 sin8u_table::@25
(word) rem16u#37 ← phi( sin8u_table::@14/(word) rem16u#38 sin8u_table::@25/(word) rem16u#21 )
(word) sin8u_table::tabsize#13 ← phi( sin8u_table::@14/(word) sin8u_table::tabsize#14 sin8u_table::@25/(word) sin8u_table::tabsize#2 ) (word) sin8u_table::tabsize#13 ← phi( sin8u_table::@14/(word) sin8u_table::tabsize#14 sin8u_table::@25/(word) sin8u_table::tabsize#2 )
(word) sin8u_table::i#13 ← phi( sin8u_table::@14/(word) sin8u_table::i#0 sin8u_table::@25/(word) sin8u_table::i#1 ) (word) sin8u_table::i#13 ← phi( sin8u_table::@14/(word) sin8u_table::i#0 sin8u_table::@25/(word) sin8u_table::i#1 )
(word) sin8u_table::step#13 ← phi( sin8u_table::@14/(word) sin8u_table::step#14 sin8u_table::@25/(word) sin8u_table::step#2 ) (word) sin8u_table::step#13 ← phi( sin8u_table::@14/(word) sin8u_table::step#14 sin8u_table::@25/(word) sin8u_table::step#2 )
@ -3304,7 +3267,6 @@ sin8u_table::@1: scope:[sin8u_table] from sin8u_table::@14 sin8u_table::@25
(signed byte) sin8s::return#2 ← (signed byte) sin8s::return#1 (signed byte) sin8s::return#2 ← (signed byte) sin8s::return#1
to:sin8u_table::@15 to:sin8u_table::@15
sin8u_table::@15: scope:[sin8u_table] from sin8u_table::@1 sin8u_table::@15: scope:[sin8u_table] from sin8u_table::@1
(word) rem16u#36 ← phi( sin8u_table::@1/(word) rem16u#37 )
(word) sin8u_table::tabsize#12 ← phi( sin8u_table::@1/(word) sin8u_table::tabsize#13 ) (word) sin8u_table::tabsize#12 ← phi( sin8u_table::@1/(word) sin8u_table::tabsize#13 )
(word) sin8u_table::i#12 ← phi( sin8u_table::@1/(word) sin8u_table::i#13 ) (word) sin8u_table::i#12 ← phi( sin8u_table::@1/(word) sin8u_table::i#13 )
(word) sin8u_table::step#12 ← phi( sin8u_table::@1/(word) sin8u_table::step#13 ) (word) sin8u_table::step#12 ← phi( sin8u_table::@1/(word) sin8u_table::step#13 )
@ -3325,7 +3287,6 @@ sin8u_table::@15: scope:[sin8u_table] from sin8u_table::@1
to:sin8u_table::@16 to:sin8u_table::@16
sin8u_table::@16: scope:[sin8u_table] from sin8u_table::@15 sin8u_table::@16: scope:[sin8u_table] from sin8u_table::@15
(byte) sin8u_table::amplitude#24 ← phi( sin8u_table::@15/(byte) sin8u_table::amplitude#2 ) (byte) sin8u_table::amplitude#24 ← phi( sin8u_table::@15/(byte) sin8u_table::amplitude#2 )
(word) rem16u#35 ← phi( sin8u_table::@15/(word) rem16u#36 )
(word) sin8u_table::tabsize#11 ← phi( sin8u_table::@15/(word) sin8u_table::tabsize#12 ) (word) sin8u_table::tabsize#11 ← phi( sin8u_table::@15/(word) sin8u_table::tabsize#12 )
(word) sin8u_table::i#11 ← phi( sin8u_table::@15/(word) sin8u_table::i#12 ) (word) sin8u_table::i#11 ← phi( sin8u_table::@15/(word) sin8u_table::i#12 )
(word) sin8u_table::step#11 ← phi( sin8u_table::@15/(word) sin8u_table::step#12 ) (word) sin8u_table::step#11 ← phi( sin8u_table::@15/(word) sin8u_table::step#12 )
@ -3350,7 +3311,6 @@ sin8u_table::@17: scope:[sin8u_table] from sin8u_table::@16
(byte*) sin8u_table::sintab#22 ← phi( sin8u_table::@16/(byte*) sin8u_table::sintab#1 ) (byte*) sin8u_table::sintab#22 ← phi( sin8u_table::@16/(byte*) sin8u_table::sintab#1 )
(byte) sin8u_table::mid#24 ← phi( sin8u_table::@16/(byte) sin8u_table::mid#2 ) (byte) sin8u_table::mid#24 ← phi( sin8u_table::@16/(byte) sin8u_table::mid#2 )
(byte) sin8u_table::amplitude#23 ← phi( sin8u_table::@16/(byte) sin8u_table::amplitude#24 ) (byte) sin8u_table::amplitude#23 ← phi( sin8u_table::@16/(byte) sin8u_table::amplitude#24 )
(word) rem16u#34 ← phi( sin8u_table::@16/(word) rem16u#35 )
(word) sin8u_table::tabsize#10 ← phi( sin8u_table::@16/(word) sin8u_table::tabsize#11 ) (word) sin8u_table::tabsize#10 ← phi( sin8u_table::@16/(word) sin8u_table::tabsize#11 )
(word) sin8u_table::i#10 ← phi( sin8u_table::@16/(word) sin8u_table::i#11 ) (word) sin8u_table::i#10 ← phi( sin8u_table::@16/(word) sin8u_table::i#11 )
(word) sin8u_table::step#10 ← phi( sin8u_table::@16/(word) sin8u_table::step#11 ) (word) sin8u_table::step#10 ← phi( sin8u_table::@16/(word) sin8u_table::step#11 )
@ -3368,7 +3328,6 @@ sin8u_table::@18: scope:[sin8u_table] from sin8u_table::@17
(byte*) sin8u_table::sintab#20 ← phi( sin8u_table::@17/(byte*) sin8u_table::sintab#22 ) (byte*) sin8u_table::sintab#20 ← phi( sin8u_table::@17/(byte*) sin8u_table::sintab#22 )
(byte) sin8u_table::mid#23 ← phi( sin8u_table::@17/(byte) sin8u_table::mid#24 ) (byte) sin8u_table::mid#23 ← phi( sin8u_table::@17/(byte) sin8u_table::mid#24 )
(byte) sin8u_table::amplitude#22 ← phi( sin8u_table::@17/(byte) sin8u_table::amplitude#23 ) (byte) sin8u_table::amplitude#22 ← phi( sin8u_table::@17/(byte) sin8u_table::amplitude#23 )
(word) rem16u#33 ← phi( sin8u_table::@17/(word) rem16u#34 )
(word) sin8u_table::tabsize#9 ← phi( sin8u_table::@17/(word) sin8u_table::tabsize#10 ) (word) sin8u_table::tabsize#9 ← phi( sin8u_table::@17/(word) sin8u_table::tabsize#10 )
(word) sin8u_table::i#9 ← phi( sin8u_table::@17/(word) sin8u_table::i#10 ) (word) sin8u_table::i#9 ← phi( sin8u_table::@17/(word) sin8u_table::i#10 )
(word) sin8u_table::step#9 ← phi( sin8u_table::@17/(word) sin8u_table::step#10 ) (word) sin8u_table::step#9 ← phi( sin8u_table::@17/(word) sin8u_table::step#10 )
@ -3386,7 +3345,6 @@ sin8u_table::@19: scope:[sin8u_table] from sin8u_table::@18
(byte*) sin8u_table::sintab#18 ← phi( sin8u_table::@18/(byte*) sin8u_table::sintab#20 ) (byte*) sin8u_table::sintab#18 ← phi( sin8u_table::@18/(byte*) sin8u_table::sintab#20 )
(byte) sin8u_table::mid#22 ← phi( sin8u_table::@18/(byte) sin8u_table::mid#23 ) (byte) sin8u_table::mid#22 ← phi( sin8u_table::@18/(byte) sin8u_table::mid#23 )
(byte) sin8u_table::amplitude#21 ← phi( sin8u_table::@18/(byte) sin8u_table::amplitude#22 ) (byte) sin8u_table::amplitude#21 ← phi( sin8u_table::@18/(byte) sin8u_table::amplitude#22 )
(word) rem16u#32 ← phi( sin8u_table::@18/(word) rem16u#33 )
(word) sin8u_table::tabsize#8 ← phi( sin8u_table::@18/(word) sin8u_table::tabsize#9 ) (word) sin8u_table::tabsize#8 ← phi( sin8u_table::@18/(word) sin8u_table::tabsize#9 )
(word) sin8u_table::i#8 ← phi( sin8u_table::@18/(word) sin8u_table::i#9 ) (word) sin8u_table::i#8 ← phi( sin8u_table::@18/(word) sin8u_table::i#9 )
(word) sin8u_table::step#8 ← phi( sin8u_table::@18/(word) sin8u_table::step#9 ) (word) sin8u_table::step#8 ← phi( sin8u_table::@18/(word) sin8u_table::step#9 )
@ -3404,7 +3362,6 @@ sin8u_table::@20: scope:[sin8u_table] from sin8u_table::@19
(byte*) sin8u_table::sintab#16 ← phi( sin8u_table::@19/(byte*) sin8u_table::sintab#18 ) (byte*) sin8u_table::sintab#16 ← phi( sin8u_table::@19/(byte*) sin8u_table::sintab#18 )
(byte) sin8u_table::mid#20 ← phi( sin8u_table::@19/(byte) sin8u_table::mid#22 ) (byte) sin8u_table::mid#20 ← phi( sin8u_table::@19/(byte) sin8u_table::mid#22 )
(byte) sin8u_table::amplitude#20 ← phi( sin8u_table::@19/(byte) sin8u_table::amplitude#21 ) (byte) sin8u_table::amplitude#20 ← phi( sin8u_table::@19/(byte) sin8u_table::amplitude#21 )
(word) rem16u#31 ← phi( sin8u_table::@19/(word) rem16u#32 )
(word) sin8u_table::tabsize#7 ← phi( sin8u_table::@19/(word) sin8u_table::tabsize#8 ) (word) sin8u_table::tabsize#7 ← phi( sin8u_table::@19/(word) sin8u_table::tabsize#8 )
(word) sin8u_table::i#7 ← phi( sin8u_table::@19/(word) sin8u_table::i#8 ) (word) sin8u_table::i#7 ← phi( sin8u_table::@19/(word) sin8u_table::i#8 )
(word) sin8u_table::step#7 ← phi( sin8u_table::@19/(word) sin8u_table::step#8 ) (word) sin8u_table::step#7 ← phi( sin8u_table::@19/(word) sin8u_table::step#8 )
@ -3421,7 +3378,6 @@ sin8u_table::@21: scope:[sin8u_table] from sin8u_table::@20
(byte*) sin8u_table::sintab#14 ← phi( sin8u_table::@20/(byte*) sin8u_table::sintab#16 ) (byte*) sin8u_table::sintab#14 ← phi( sin8u_table::@20/(byte*) sin8u_table::sintab#16 )
(byte) sin8u_table::mid#18 ← phi( sin8u_table::@20/(byte) sin8u_table::mid#20 ) (byte) sin8u_table::mid#18 ← phi( sin8u_table::@20/(byte) sin8u_table::mid#20 )
(byte) sin8u_table::amplitude#18 ← phi( sin8u_table::@20/(byte) sin8u_table::amplitude#20 ) (byte) sin8u_table::amplitude#18 ← phi( sin8u_table::@20/(byte) sin8u_table::amplitude#20 )
(word) rem16u#30 ← phi( sin8u_table::@20/(word) rem16u#31 )
(word) sin8u_table::tabsize#6 ← phi( sin8u_table::@20/(word) sin8u_table::tabsize#7 ) (word) sin8u_table::tabsize#6 ← phi( sin8u_table::@20/(word) sin8u_table::tabsize#7 )
(word) sin8u_table::i#6 ← phi( sin8u_table::@20/(word) sin8u_table::i#7 ) (word) sin8u_table::i#6 ← phi( sin8u_table::@20/(word) sin8u_table::i#7 )
(word) sin8u_table::step#6 ← phi( sin8u_table::@20/(word) sin8u_table::step#7 ) (word) sin8u_table::step#6 ← phi( sin8u_table::@20/(word) sin8u_table::step#7 )
@ -3438,7 +3394,6 @@ sin8u_table::@22: scope:[sin8u_table] from sin8u_table::@21
(byte*) sin8u_table::sintab#12 ← phi( sin8u_table::@21/(byte*) sin8u_table::sintab#14 ) (byte*) sin8u_table::sintab#12 ← phi( sin8u_table::@21/(byte*) sin8u_table::sintab#14 )
(byte) sin8u_table::mid#16 ← phi( sin8u_table::@21/(byte) sin8u_table::mid#18 ) (byte) sin8u_table::mid#16 ← phi( sin8u_table::@21/(byte) sin8u_table::mid#18 )
(byte) sin8u_table::amplitude#16 ← phi( sin8u_table::@21/(byte) sin8u_table::amplitude#18 ) (byte) sin8u_table::amplitude#16 ← phi( sin8u_table::@21/(byte) sin8u_table::amplitude#18 )
(word) rem16u#29 ← phi( sin8u_table::@21/(word) rem16u#30 )
(word) sin8u_table::tabsize#5 ← phi( sin8u_table::@21/(word) sin8u_table::tabsize#6 ) (word) sin8u_table::tabsize#5 ← phi( sin8u_table::@21/(word) sin8u_table::tabsize#6 )
(word) sin8u_table::i#5 ← phi( sin8u_table::@21/(word) sin8u_table::i#6 ) (word) sin8u_table::i#5 ← phi( sin8u_table::@21/(word) sin8u_table::i#6 )
(word) sin8u_table::step#5 ← phi( sin8u_table::@21/(word) sin8u_table::step#6 ) (word) sin8u_table::step#5 ← phi( sin8u_table::@21/(word) sin8u_table::step#6 )
@ -3454,7 +3409,6 @@ sin8u_table::@23: scope:[sin8u_table] from sin8u_table::@22
(byte*) sin8u_table::sintab#10 ← phi( sin8u_table::@22/(byte*) sin8u_table::sintab#12 ) (byte*) sin8u_table::sintab#10 ← phi( sin8u_table::@22/(byte*) sin8u_table::sintab#12 )
(byte) sin8u_table::mid#14 ← phi( sin8u_table::@22/(byte) sin8u_table::mid#16 ) (byte) sin8u_table::mid#14 ← phi( sin8u_table::@22/(byte) sin8u_table::mid#16 )
(byte) sin8u_table::amplitude#13 ← phi( sin8u_table::@22/(byte) sin8u_table::amplitude#16 ) (byte) sin8u_table::amplitude#13 ← phi( sin8u_table::@22/(byte) sin8u_table::amplitude#16 )
(word) rem16u#27 ← phi( sin8u_table::@22/(word) rem16u#29 )
(word) sin8u_table::tabsize#4 ← phi( sin8u_table::@22/(word) sin8u_table::tabsize#5 ) (word) sin8u_table::tabsize#4 ← phi( sin8u_table::@22/(word) sin8u_table::tabsize#5 )
(word) sin8u_table::i#4 ← phi( sin8u_table::@22/(word) sin8u_table::i#5 ) (word) sin8u_table::i#4 ← phi( sin8u_table::@22/(word) sin8u_table::i#5 )
(word) sin8u_table::step#4 ← phi( sin8u_table::@22/(word) sin8u_table::step#5 ) (word) sin8u_table::step#4 ← phi( sin8u_table::@22/(word) sin8u_table::step#5 )
@ -3470,7 +3424,6 @@ sin8u_table::@24: scope:[sin8u_table] from sin8u_table::@23
(byte*) sin8u_table::sintab#8 ← phi( sin8u_table::@23/(byte*) sin8u_table::sintab#10 ) (byte*) sin8u_table::sintab#8 ← phi( sin8u_table::@23/(byte*) sin8u_table::sintab#10 )
(byte) sin8u_table::mid#12 ← phi( sin8u_table::@23/(byte) sin8u_table::mid#14 ) (byte) sin8u_table::mid#12 ← phi( sin8u_table::@23/(byte) sin8u_table::mid#14 )
(byte) sin8u_table::amplitude#10 ← phi( sin8u_table::@23/(byte) sin8u_table::amplitude#13 ) (byte) sin8u_table::amplitude#10 ← phi( sin8u_table::@23/(byte) sin8u_table::amplitude#13 )
(word) rem16u#24 ← phi( sin8u_table::@23/(word) rem16u#27 )
(word) sin8u_table::tabsize#3 ← phi( sin8u_table::@23/(word) sin8u_table::tabsize#4 ) (word) sin8u_table::tabsize#3 ← phi( sin8u_table::@23/(word) sin8u_table::tabsize#4 )
(word) sin8u_table::i#3 ← phi( sin8u_table::@23/(word) sin8u_table::i#4 ) (word) sin8u_table::i#3 ← phi( sin8u_table::@23/(word) sin8u_table::i#4 )
(word) sin8u_table::step#3 ← phi( sin8u_table::@23/(word) sin8u_table::step#4 ) (word) sin8u_table::step#3 ← phi( sin8u_table::@23/(word) sin8u_table::step#4 )
@ -3484,7 +3437,6 @@ sin8u_table::@25: scope:[sin8u_table] from sin8u_table::@24
(byte*) sin8u_table::sintab#6 ← phi( sin8u_table::@24/(byte*) sin8u_table::sintab#8 ) (byte*) sin8u_table::sintab#6 ← phi( sin8u_table::@24/(byte*) sin8u_table::sintab#8 )
(byte) sin8u_table::mid#9 ← phi( sin8u_table::@24/(byte) sin8u_table::mid#12 ) (byte) sin8u_table::mid#9 ← phi( sin8u_table::@24/(byte) sin8u_table::mid#12 )
(byte) sin8u_table::amplitude#7 ← phi( sin8u_table::@24/(byte) sin8u_table::amplitude#10 ) (byte) sin8u_table::amplitude#7 ← phi( sin8u_table::@24/(byte) sin8u_table::amplitude#10 )
(word) rem16u#21 ← phi( sin8u_table::@24/(word) rem16u#24 )
(word) sin8u_table::tabsize#2 ← phi( sin8u_table::@24/(word) sin8u_table::tabsize#3 ) (word) sin8u_table::tabsize#2 ← phi( sin8u_table::@24/(word) sin8u_table::tabsize#3 )
(word) sin8u_table::i#2 ← phi( sin8u_table::@24/(word) sin8u_table::i#3 ) (word) sin8u_table::i#2 ← phi( sin8u_table::@24/(word) sin8u_table::i#3 )
(word) sin8u_table::step#2 ← phi( sin8u_table::@24/(word) sin8u_table::step#3 ) (word) sin8u_table::step#2 ← phi( sin8u_table::@24/(word) sin8u_table::step#3 )
@ -3502,33 +3454,27 @@ sin8u_table::@25: scope:[sin8u_table] from sin8u_table::@24
sin8u_table::@return: scope:[sin8u_table] from sin8u_table::@25 sin8u_table::@return: scope:[sin8u_table] from sin8u_table::@25
(byte*) print_line_cursor#21 ← phi( sin8u_table::@25/(byte*) print_line_cursor#9 ) (byte*) print_line_cursor#21 ← phi( sin8u_table::@25/(byte*) print_line_cursor#9 )
(byte*) print_char_cursor#88 ← phi( sin8u_table::@25/(byte*) print_char_cursor#43 ) (byte*) print_char_cursor#88 ← phi( sin8u_table::@25/(byte*) print_char_cursor#43 )
(word) rem16u#16 ← phi( sin8u_table::@25/(word) rem16u#21 )
(word) rem16u#8 ← (word) rem16u#16
(byte*) print_char_cursor#44 ← (byte*) print_char_cursor#88 (byte*) print_char_cursor#44 ← (byte*) print_char_cursor#88
(byte*) print_line_cursor#10 ← (byte*) print_line_cursor#21 (byte*) print_line_cursor#10 ← (byte*) print_line_cursor#21
return return
to:@return to:@return
@36: scope:[] from @30 @36: scope:[] from @30
(byte*) print_screen#5 ← phi( @30/(byte*) print_screen#6 ) (byte*) print_screen#5 ← phi( @30/(byte*) print_screen#6 )
(word) rem16u#22 ← phi( @30/(word) rem16u#25 )
(byte*) print_char_cursor#101 ← phi( @30/(byte*) print_char_cursor#107 ) (byte*) print_char_cursor#101 ← phi( @30/(byte*) print_char_cursor#107 )
(byte*) print_line_cursor#27 ← phi( @30/(byte*) print_line_cursor#30 ) (byte*) print_line_cursor#27 ← phi( @30/(byte*) print_line_cursor#30 )
call main call main
to:@37 to:@37
@37: scope:[] from @36 @37: scope:[] from @36
(word) rem16u#17 ← phi( @36/(word) rem16u#6 )
(byte*) print_char_cursor#89 ← phi( @36/(byte*) print_char_cursor#23 ) (byte*) print_char_cursor#89 ← phi( @36/(byte*) print_char_cursor#23 )
(byte*) print_line_cursor#22 ← phi( @36/(byte*) print_line_cursor#7 ) (byte*) print_line_cursor#22 ← phi( @36/(byte*) print_line_cursor#7 )
(byte*) print_line_cursor#11 ← (byte*) print_line_cursor#22 (byte*) print_line_cursor#11 ← (byte*) print_line_cursor#22
(byte*) print_char_cursor#45 ← (byte*) print_char_cursor#89 (byte*) print_char_cursor#45 ← (byte*) print_char_cursor#89
(word) rem16u#9 ← (word) rem16u#17
to:@end to:@end
@end: scope:[] from @37 @end: scope:[] from @37
SYMBOL TABLE SSA SYMBOL TABLE SSA
(const string) $0 = (string) "0123456789abcdef" (const string) $0 = (string) "0123456789abcdef"
(label) @13 (label) @13
(label) @2
(label) @20 (label) @20
(label) @30 (label) @30
(label) @36 (label) @36
@ -3615,7 +3561,6 @@ SYMBOL TABLE SSA
(word) divr16u::rem (word) divr16u::rem
(word) divr16u::rem#0 (word) divr16u::rem#0
(word) divr16u::rem#1 (word) divr16u::rem#1
(word) divr16u::rem#10
(word) divr16u::rem#2 (word) divr16u::rem#2
(word) divr16u::rem#3 (word) divr16u::rem#3
(word) divr16u::rem#4 (word) divr16u::rem#4
@ -4043,56 +3988,6 @@ SYMBOL TABLE SSA
(word) print_word::w#2 (word) print_word::w#2
(word) print_word::w#3 (word) print_word::w#3
(word) print_word::w#4 (word) print_word::w#4
(word) rem16u
(word) rem16u#0
(word) rem16u#1
(word) rem16u#10
(word) rem16u#11
(word) rem16u#12
(word) rem16u#13
(word) rem16u#14
(word) rem16u#15
(word) rem16u#16
(word) rem16u#17
(word) rem16u#18
(word) rem16u#19
(word) rem16u#2
(word) rem16u#20
(word) rem16u#21
(word) rem16u#22
(word) rem16u#23
(word) rem16u#24
(word) rem16u#25
(word) rem16u#26
(word) rem16u#27
(word) rem16u#28
(word) rem16u#29
(word) rem16u#3
(word) rem16u#30
(word) rem16u#31
(word) rem16u#32
(word) rem16u#33
(word) rem16u#34
(word) rem16u#35
(word) rem16u#36
(word) rem16u#37
(word) rem16u#38
(word) rem16u#39
(word) rem16u#4
(word) rem16u#40
(word) rem16u#41
(word) rem16u#42
(word) rem16u#43
(word) rem16u#44
(word) rem16u#45
(word) rem16u#46
(word) rem16u#47
(word) rem16u#48
(word) rem16u#5
(word) rem16u#6
(word) rem16u#7
(word) rem16u#8
(word) rem16u#9
(signed byte()) sin8s((word) sin8s::x) (signed byte()) sin8s((word) sin8s::x)
(bool~) sin8s::$0 (bool~) sin8s::$0
(bool~) sin8s::$1 (bool~) sin8s::$1
@ -4457,17 +4352,14 @@ Inversing boolean not (bool~) sin8s::$20 ← (byte) sin8s::isUpper#2 == (byte/si
Inversing boolean not (bool~) print_sword::$1 ← (signed word) print_sword::w#2 >= (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) print_sword::$0 ← (signed word) print_sword::w#2 < (byte/signed byte/word/signed word/dword/signed dword) 0 Inversing boolean not (bool~) print_sword::$1 ← (signed word) print_sword::w#2 >= (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) print_sword::$0 ← (signed word) print_sword::w#2 < (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not (bool~) print_sbyte::$1 ← (signed byte) print_sbyte::b#2 >= (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) print_sbyte::$0 ← (signed byte) print_sbyte::b#2 < (byte/signed byte/word/signed word/dword/signed dword) 0 Inversing boolean not (bool~) print_sbyte::$1 ← (signed byte) print_sbyte::b#2 >= (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) print_sbyte::$0 ← (signed byte) print_sbyte::b#2 < (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2UnaryNotSimplification Succesful SSA optimization Pass2UnaryNotSimplification
Not aliassing across scopes: divr16u::rem#9 divr16u::rem#3 Not aliassing across scopes: divr16u::rem#8 divr16u::rem#3
Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1 Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1
Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0 Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0
Not aliassing across scopes: rem16u#1 divr16u::rem#8
Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0 Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0
Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0 Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0
Not aliassing across scopes: rem16u#18 rem16u#20
Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1 Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1
Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1 Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1
Not aliassing across scopes: divr16u::return#2 divr16u::return#1 Not aliassing across scopes: divr16u::return#2 divr16u::return#1
Not aliassing across scopes: rem16u#11 rem16u#2
Not aliassing across scopes: div16u::$0 divr16u::return#4 Not aliassing across scopes: div16u::$0 divr16u::return#4
Not aliassing across scopes: mul8u::b#2 mul8u::b#0 Not aliassing across scopes: mul8u::b#2 mul8u::b#0
Not aliassing across scopes: mul8u::a#6 mul8u::a#1 Not aliassing across scopes: mul8u::a#6 mul8u::a#1
@ -4530,25 +4422,21 @@ Not aliassing across scopes: print_cls::sc#0 print_screen#1
Not aliassing across scopes: print_screen#4 print_screen#5 Not aliassing across scopes: print_screen#4 print_screen#5
Not aliassing across scopes: print_line_cursor#24 print_line_cursor#27 Not aliassing across scopes: print_line_cursor#24 print_line_cursor#27
Not aliassing across scopes: print_char_cursor#98 print_char_cursor#101 Not aliassing across scopes: print_char_cursor#98 print_char_cursor#101
Not aliassing across scopes: rem16u#23 rem16u#22
Not aliassing across scopes: print_line_cursor#16 print_line_cursor#4 Not aliassing across scopes: print_line_cursor#16 print_line_cursor#4
Not aliassing across scopes: print_char_cursor#65 print_char_cursor#20 Not aliassing across scopes: print_char_cursor#65 print_char_cursor#20
Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0 Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0
Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#1 Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#1
Not aliassing across scopes: rem16u#13 rem16u#8
Not aliassing across scopes: print_char_cursor#66 print_char_cursor#44 Not aliassing across scopes: print_char_cursor#66 print_char_cursor#44
Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10 Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10
Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0 Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0
Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0 Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0
Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0 Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0
Not aliassing across scopes: rem16u#20 rem16u#19
Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21 Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21
Not aliassing across scopes: print_line_cursor#49 print_line_cursor#5 Not aliassing across scopes: print_line_cursor#49 print_line_cursor#5
Not aliassing across scopes: sin8u_table::sintab#26 sin8u_table::sintab#0 Not aliassing across scopes: sin8u_table::sintab#26 sin8u_table::sintab#0
Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0 Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0
Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1 Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1
Not aliassing across scopes: div16u::return#2 div16u::return#1 Not aliassing across scopes: div16u::return#2 div16u::return#1
Not aliassing across scopes: rem16u#15 rem16u#4
Not aliassing across scopes: sin8u_table::$6 div16u::return#4 Not aliassing across scopes: sin8u_table::$6 div16u::return#4
Not aliassing across scopes: print_char_cursor#68 print_char_cursor#2 Not aliassing across scopes: print_char_cursor#68 print_char_cursor#2
Not aliassing across scopes: print_word::w#1 sin8u_table::step#1 Not aliassing across scopes: print_word::w#1 sin8u_table::step#1
@ -4589,7 +4477,6 @@ Not aliassing across scopes: print_line_cursor#20 print_line_cursor#2
Not aliassing across scopes: print_char_cursor#87 print_char_cursor#4 Not aliassing across scopes: print_char_cursor#87 print_char_cursor#4
Not aliassing across scopes: print_line_cursor#22 print_line_cursor#7 Not aliassing across scopes: print_line_cursor#22 print_line_cursor#7
Not aliassing across scopes: print_char_cursor#89 print_char_cursor#23 Not aliassing across scopes: print_char_cursor#89 print_char_cursor#23
Not aliassing across scopes: rem16u#17 rem16u#6
Alias (word) divr16u::rem#0 = (word~) divr16u::$0 (word) divr16u::rem#6 Alias (word) divr16u::rem#0 = (word~) divr16u::$0 (word) divr16u::rem#6
Alias (word) divr16u::dividend#0 = (word~) divr16u::$6 (word) divr16u::dividend#7 Alias (word) divr16u::dividend#0 = (word~) divr16u::$6 (word) divr16u::dividend#7
Alias (word) divr16u::quotient#1 = (word~) divr16u::$7 (word) divr16u::quotient#4 Alias (word) divr16u::quotient#1 = (word~) divr16u::$7 (word) divr16u::quotient#4
@ -4602,11 +4489,8 @@ Alias (word) divr16u::rem#5 = (word) divr16u::rem#7
Alias (word) divr16u::divisor#1 = (word) divr16u::divisor#2 Alias (word) divr16u::divisor#1 = (word) divr16u::divisor#2
Alias (byte) divr16u::i#3 = (byte) divr16u::i#4 Alias (byte) divr16u::i#3 = (byte) divr16u::i#4
Alias (word) divr16u::rem#2 = (word~) divr16u::$10 Alias (word) divr16u::rem#2 = (word~) divr16u::$10
Alias (word) divr16u::rem#10 = (word) divr16u::rem#8
Alias (word) divr16u::return#0 = (word) divr16u::quotient#5 (word) divr16u::quotient#8 (word) divr16u::return#3 (word) divr16u::return#1 Alias (word) divr16u::return#0 = (word) divr16u::quotient#5 (word) divr16u::quotient#8 (word) divr16u::return#3 (word) divr16u::return#1
Alias (word) rem16u#1 = (word) rem16u#10 (word) rem16u#2
Alias (word) divr16u::return#2 = (word) divr16u::return#4 Alias (word) divr16u::return#2 = (word) divr16u::return#4
Alias (word) rem16u#11 = (word) rem16u#3 (word) rem16u#12 (word) rem16u#4
Alias (word) div16u::return#0 = (word~) div16u::$0 (word) div16u::return#3 (word) div16u::return#1 Alias (word) div16u::return#0 = (word~) div16u::$0 (word) div16u::return#3 (word) div16u::return#1
Alias (byte) mul8u::a#3 = (byte) mul8u::a#4 (byte) mul8u::a#7 Alias (byte) mul8u::a#3 = (byte) mul8u::a#4 (byte) mul8u::a#7
Alias (word) mul8u::mb#3 = (word) mul8u::mb#4 (word) mul8u::mb#5 Alias (word) mul8u::mb#3 = (word) mul8u::mb#4 (word) mul8u::mb#5
@ -4622,7 +4506,6 @@ Alias (byte) mul8su::b#1 = (byte) mul8su::b#3 (byte) mul8su::b#2
Alias (word) mul8su::m#0 = (word~) mul8su::$2 (word) mul8su::m#3 Alias (word) mul8su::m#0 = (word~) mul8su::$2 (word) mul8su::m#3
Alias (signed word) mul8su::return#0 = (signed word~) mul8su::$9 (signed word) mul8su::return#3 (signed word) mul8su::return#1 Alias (signed word) mul8su::return#0 = (signed word~) mul8su::$9 (signed word) mul8su::return#3 (signed word) mul8su::return#1
Alias (byte~) mul8su::$10 = (byte~) mul8su::$8 Alias (byte~) mul8su::$10 = (byte~) mul8su::$8
Alias (word) rem16u#0 = (word) rem16u#28 (word) rem16u#26 (word) rem16u#25 (word) rem16u#22
Alias (word) sin8s::x#3 = (word) sin8s::x#5 Alias (word) sin8s::x#3 = (word) sin8s::x#5
Alias (word) sin8s::x#0 = (word~) sin8s::$2 Alias (word) sin8s::x#0 = (word~) sin8s::$2
Alias (byte) sin8s::x1#0 = (byte~) sin8s::$7 (byte) sin8s::x1#1 (byte) sin8s::x1#4 (byte) sin8s::x1#2 (byte) sin8s::x1#3 Alias (byte) sin8s::x1#0 = (byte~) sin8s::$7 (byte) sin8s::x1#1 (byte) sin8s::x1#4 (byte) sin8s::x1#2 (byte) sin8s::x1#3
@ -4677,10 +4560,8 @@ Alias (byte*) print_char_cursor#15 = (byte*) print_char_cursor#60 (byte*) print_
Alias (byte*) print_char_cursor#17 = (byte*) print_char_cursor#63 (byte*) print_char_cursor#18 Alias (byte*) print_char_cursor#17 = (byte*) print_char_cursor#63 (byte*) print_char_cursor#18
Alias (byte*) print_line_cursor#15 = (byte*) print_screen#3 (byte*) print_screen#2 (byte*) print_line_cursor#3 (byte*) print_char_cursor#19 (byte*) print_char_cursor#64 (byte*) print_line_cursor#4 (byte*) print_char_cursor#20 Alias (byte*) print_line_cursor#15 = (byte*) print_screen#3 (byte*) print_screen#2 (byte*) print_line_cursor#3 (byte*) print_char_cursor#19 (byte*) print_char_cursor#64 (byte*) print_line_cursor#4 (byte*) print_char_cursor#20
Alias (word) main::tabsize#0 = (word) main::tabsize#1 Alias (word) main::tabsize#0 = (word) main::tabsize#1
Alias (word) rem16u#19 = (word) rem16u#23
Alias (byte*) print_line_cursor#16 = (byte*) print_line_cursor#5 Alias (byte*) print_line_cursor#16 = (byte*) print_line_cursor#5
Alias (byte*) print_char_cursor#21 = (byte*) print_char_cursor#65 Alias (byte*) print_char_cursor#21 = (byte*) print_char_cursor#65
Alias (word) rem16u#13 = (word) rem16u#5 (word) rem16u#14 (word) rem16u#6
Alias (byte*) print_char_cursor#22 = (byte*) print_char_cursor#66 (byte*) print_char_cursor#67 (byte*) print_char_cursor#23 Alias (byte*) print_char_cursor#22 = (byte*) print_char_cursor#66 (byte*) print_char_cursor#67 (byte*) print_char_cursor#23
Alias (byte*) print_line_cursor#17 = (byte*) print_line_cursor#6 (byte*) print_line_cursor#18 (byte*) print_line_cursor#7 Alias (byte*) print_line_cursor#17 = (byte*) print_line_cursor#6 (byte*) print_line_cursor#18 (byte*) print_line_cursor#7
Alias (byte) sin8u_table::amplitude#0 = (byte~) sin8u_table::$0 (byte) sin8u_table::amplitude#19 (byte) sin8u_table::amplitude#17 (byte) sin8u_table::amplitude#14 (byte) sin8u_table::amplitude#11 (byte) sin8u_table::amplitude#8 (byte) sin8u_table::amplitude#5 (byte) sin8u_table::amplitude#3 (byte) sin8u_table::amplitude#1 (byte) sin8u_table::amplitude#15 (byte) sin8u_table::amplitude#12 (byte) sin8u_table::amplitude#9 (byte) sin8u_table::amplitude#6 Alias (byte) sin8u_table::amplitude#0 = (byte~) sin8u_table::$0 (byte) sin8u_table::amplitude#19 (byte) sin8u_table::amplitude#17 (byte) sin8u_table::amplitude#14 (byte) sin8u_table::amplitude#11 (byte) sin8u_table::amplitude#8 (byte) sin8u_table::amplitude#5 (byte) sin8u_table::amplitude#3 (byte) sin8u_table::amplitude#1 (byte) sin8u_table::amplitude#15 (byte) sin8u_table::amplitude#12 (byte) sin8u_table::amplitude#9 (byte) sin8u_table::amplitude#6
@ -4693,7 +4574,6 @@ Alias (byte) sin8u_table::max#1 = (byte) sin8u_table::max#7 (byte) sin8u_table::
Alias (byte*) print_line_cursor#25 = (byte*) print_line_cursor#47 (byte*) print_line_cursor#49 (byte*) print_line_cursor#45 (byte*) print_line_cursor#43 (byte*) print_line_cursor#41 (byte*) print_line_cursor#39 (byte*) print_line_cursor#37 (byte*) print_line_cursor#35 (byte*) print_line_cursor#33 (byte*) print_line_cursor#31 (byte*) print_line_cursor#28 Alias (byte*) print_line_cursor#25 = (byte*) print_line_cursor#47 (byte*) print_line_cursor#49 (byte*) print_line_cursor#45 (byte*) print_line_cursor#43 (byte*) print_line_cursor#41 (byte*) print_line_cursor#39 (byte*) print_line_cursor#37 (byte*) print_line_cursor#35 (byte*) print_line_cursor#33 (byte*) print_line_cursor#31 (byte*) print_line_cursor#28
Alias (byte*) sin8u_table::sintab#11 = (byte*) sin8u_table::sintab#25 (byte*) sin8u_table::sintab#26 (byte*) sin8u_table::sintab#24 (byte*) sin8u_table::sintab#23 (byte*) sin8u_table::sintab#21 (byte*) sin8u_table::sintab#19 (byte*) sin8u_table::sintab#17 (byte*) sin8u_table::sintab#15 (byte*) sin8u_table::sintab#13 (byte*) sin8u_table::sintab#9 (byte*) sin8u_table::sintab#7 (byte*) sin8u_table::sintab#5 Alias (byte*) sin8u_table::sintab#11 = (byte*) sin8u_table::sintab#25 (byte*) sin8u_table::sintab#26 (byte*) sin8u_table::sintab#24 (byte*) sin8u_table::sintab#23 (byte*) sin8u_table::sintab#21 (byte*) sin8u_table::sintab#19 (byte*) sin8u_table::sintab#17 (byte*) sin8u_table::sintab#15 (byte*) sin8u_table::sintab#13 (byte*) sin8u_table::sintab#9 (byte*) sin8u_table::sintab#7 (byte*) sin8u_table::sintab#5
Alias (word) sin8u_table::tabsize#1 = (word) sin8u_table::tabsize#25 (word) sin8u_table::tabsize#24 (word) sin8u_table::tabsize#23 (word) sin8u_table::tabsize#22 (word) sin8u_table::tabsize#21 (word) sin8u_table::tabsize#20 (word) sin8u_table::tabsize#19 (word) sin8u_table::tabsize#18 (word) sin8u_table::tabsize#17 (word) sin8u_table::tabsize#16 (word) sin8u_table::tabsize#15 (word) sin8u_table::tabsize#14 Alias (word) sin8u_table::tabsize#1 = (word) sin8u_table::tabsize#25 (word) sin8u_table::tabsize#24 (word) sin8u_table::tabsize#23 (word) sin8u_table::tabsize#22 (word) sin8u_table::tabsize#21 (word) sin8u_table::tabsize#20 (word) sin8u_table::tabsize#19 (word) sin8u_table::tabsize#18 (word) sin8u_table::tabsize#17 (word) sin8u_table::tabsize#16 (word) sin8u_table::tabsize#15 (word) sin8u_table::tabsize#14
Alias (word) rem16u#15 = (word) rem16u#7 (word) rem16u#48 (word) rem16u#47 (word) rem16u#46 (word) rem16u#45 (word) rem16u#44 (word) rem16u#43 (word) rem16u#42 (word) rem16u#41 (word) rem16u#40 (word) rem16u#39 (word) rem16u#38
Alias (word) sin8u_table::step#0 = (word~) sin8u_table::$6 (word) sin8u_table::step#1 (word) sin8u_table::step#23 (word) sin8u_table::step#22 (word) sin8u_table::step#21 (word) sin8u_table::step#20 (word) sin8u_table::step#19 (word) sin8u_table::step#18 (word) sin8u_table::step#17 (word) sin8u_table::step#16 (word) sin8u_table::step#15 (word) sin8u_table::step#14 Alias (word) sin8u_table::step#0 = (word~) sin8u_table::$6 (word) sin8u_table::step#1 (word) sin8u_table::step#23 (word) sin8u_table::step#22 (word) sin8u_table::step#21 (word) sin8u_table::step#20 (word) sin8u_table::step#19 (word) sin8u_table::step#18 (word) sin8u_table::step#17 (word) sin8u_table::step#16 (word) sin8u_table::step#15 (word) sin8u_table::step#14
Alias (byte*) print_char_cursor#24 = (byte*) print_char_cursor#68 Alias (byte*) print_char_cursor#24 = (byte*) print_char_cursor#68
Alias (byte*) print_char_cursor#25 = (byte*) print_char_cursor#69 Alias (byte*) print_char_cursor#25 = (byte*) print_char_cursor#69
@ -4717,7 +4597,6 @@ Alias (byte*) print_line_cursor#26 = (byte*) print_line_cursor#46 (byte*) print_
Alias (word) sin8u_table::step#10 = (word) sin8u_table::step#12 (word) sin8u_table::step#13 (word) sin8u_table::step#11 (word) sin8u_table::step#9 (word) sin8u_table::step#8 (word) sin8u_table::step#7 (word) sin8u_table::step#6 (word) sin8u_table::step#5 (word) sin8u_table::step#4 (word) sin8u_table::step#3 (word) sin8u_table::step#2 Alias (word) sin8u_table::step#10 = (word) sin8u_table::step#12 (word) sin8u_table::step#13 (word) sin8u_table::step#11 (word) sin8u_table::step#9 (word) sin8u_table::step#8 (word) sin8u_table::step#7 (word) sin8u_table::step#6 (word) sin8u_table::step#5 (word) sin8u_table::step#4 (word) sin8u_table::step#3 (word) sin8u_table::step#2
Alias (word) sin8u_table::i#10 = (word) sin8u_table::i#12 (word) sin8u_table::i#13 (word) sin8u_table::i#11 (word) sin8u_table::i#9 (word) sin8u_table::i#8 (word) sin8u_table::i#7 (word) sin8u_table::i#6 (word) sin8u_table::i#5 (word) sin8u_table::i#4 (word) sin8u_table::i#3 (word) sin8u_table::i#2 Alias (word) sin8u_table::i#10 = (word) sin8u_table::i#12 (word) sin8u_table::i#13 (word) sin8u_table::i#11 (word) sin8u_table::i#9 (word) sin8u_table::i#8 (word) sin8u_table::i#7 (word) sin8u_table::i#6 (word) sin8u_table::i#5 (word) sin8u_table::i#4 (word) sin8u_table::i#3 (word) sin8u_table::i#2
Alias (word) sin8u_table::tabsize#10 = (word) sin8u_table::tabsize#12 (word) sin8u_table::tabsize#13 (word) sin8u_table::tabsize#11 (word) sin8u_table::tabsize#9 (word) sin8u_table::tabsize#8 (word) sin8u_table::tabsize#7 (word) sin8u_table::tabsize#6 (word) sin8u_table::tabsize#5 (word) sin8u_table::tabsize#4 (word) sin8u_table::tabsize#3 (word) sin8u_table::tabsize#2 Alias (word) sin8u_table::tabsize#10 = (word) sin8u_table::tabsize#12 (word) sin8u_table::tabsize#13 (word) sin8u_table::tabsize#11 (word) sin8u_table::tabsize#9 (word) sin8u_table::tabsize#8 (word) sin8u_table::tabsize#7 (word) sin8u_table::tabsize#6 (word) sin8u_table::tabsize#5 (word) sin8u_table::tabsize#4 (word) sin8u_table::tabsize#3 (word) sin8u_table::tabsize#2
Alias (word) rem16u#16 = (word) rem16u#36 (word) rem16u#37 (word) rem16u#35 (word) rem16u#34 (word) rem16u#33 (word) rem16u#32 (word) rem16u#31 (word) rem16u#30 (word) rem16u#29 (word) rem16u#27 (word) rem16u#24 (word) rem16u#21 (word) rem16u#8
Alias (signed byte) sin8u_table::sinx#0 = (signed byte~) sin8u_table::$18 (signed byte) sin8u_table::sinx#4 (signed byte) sin8u_table::sinx#3 (signed byte) sin8u_table::sinx#2 (signed byte) sin8u_table::sinx#1 Alias (signed byte) sin8u_table::sinx#0 = (signed byte~) sin8u_table::$18 (signed byte) sin8u_table::sinx#4 (signed byte) sin8u_table::sinx#3 (signed byte) sin8u_table::sinx#2 (signed byte) sin8u_table::sinx#1
Alias (byte) mul8su::b#0 = (byte/signed word/word/dword/signed dword~) sin8u_table::$19 Alias (byte) mul8su::b#0 = (byte/signed word/word/dword/signed dword~) sin8u_table::$19
Alias (signed word) mul8su::return#2 = (signed word) mul8su::return#4 Alias (signed word) mul8su::return#2 = (signed word) mul8su::return#4
@ -4737,19 +4616,15 @@ Alias (byte*) print_char_cursor#43 = (byte*) print_char_cursor#87 (byte*) print_
Alias (word) sin8u_table::x#1 = (word~) sin8u_table::$32 Alias (word) sin8u_table::x#1 = (word~) sin8u_table::$32
Alias (byte*) print_line_cursor#11 = (byte*) print_line_cursor#22 Alias (byte*) print_line_cursor#11 = (byte*) print_line_cursor#22
Alias (byte*) print_char_cursor#45 = (byte*) print_char_cursor#89 Alias (byte*) print_char_cursor#45 = (byte*) print_char_cursor#89
Alias (word) rem16u#17 = (word) rem16u#9
Succesful SSA optimization Pass2AliasElimination Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: divr16u::rem#9 divr16u::rem#3 Not aliassing across scopes: divr16u::rem#8 divr16u::rem#3
Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1 Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1
Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0 Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0
Not aliassing across scopes: rem16u#1 divr16u::rem#10
Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0 Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0
Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0 Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0
Not aliassing across scopes: rem16u#18 rem16u#20
Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1 Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1
Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1 Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1
Not aliassing across scopes: divr16u::return#2 divr16u::return#0 Not aliassing across scopes: divr16u::return#2 divr16u::return#0
Not aliassing across scopes: rem16u#11 rem16u#1
Not aliassing across scopes: div16u::return#0 divr16u::return#2 Not aliassing across scopes: div16u::return#0 divr16u::return#2
Not aliassing across scopes: mul8u::b#2 mul8u::b#0 Not aliassing across scopes: mul8u::b#2 mul8u::b#0
Not aliassing across scopes: mul8u::a#6 mul8u::a#1 Not aliassing across scopes: mul8u::a#6 mul8u::a#1
@ -4812,25 +4687,21 @@ Not aliassing across scopes: print_cls::sc#0 print_screen#1
Not aliassing across scopes: print_screen#4 print_line_cursor#0 Not aliassing across scopes: print_screen#4 print_line_cursor#0
Not aliassing across scopes: print_line_cursor#24 print_line_cursor#0 Not aliassing across scopes: print_line_cursor#24 print_line_cursor#0
Not aliassing across scopes: print_char_cursor#98 print_line_cursor#0 Not aliassing across scopes: print_char_cursor#98 print_line_cursor#0
Not aliassing across scopes: rem16u#19 rem16u#0
Not aliassing across scopes: print_line_cursor#16 print_line_cursor#15 Not aliassing across scopes: print_line_cursor#16 print_line_cursor#15
Not aliassing across scopes: print_char_cursor#21 print_line_cursor#15 Not aliassing across scopes: print_char_cursor#21 print_line_cursor#15
Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0 Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0
Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#0 Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#0
Not aliassing across scopes: rem16u#13 rem16u#16
Not aliassing across scopes: print_char_cursor#22 print_char_cursor#43 Not aliassing across scopes: print_char_cursor#22 print_char_cursor#43
Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10 Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10
Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0 Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0
Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0 Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0
Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0 Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0
Not aliassing across scopes: rem16u#20 rem16u#19
Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21 Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21
Not aliassing across scopes: print_line_cursor#25 print_line_cursor#16 Not aliassing across scopes: print_line_cursor#25 print_line_cursor#16
Not aliassing across scopes: sin8u_table::sintab#11 sin8u_table::sintab#0 Not aliassing across scopes: sin8u_table::sintab#11 sin8u_table::sintab#0
Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0 Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0
Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1 Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1
Not aliassing across scopes: div16u::return#2 div16u::return#0 Not aliassing across scopes: div16u::return#2 div16u::return#0
Not aliassing across scopes: rem16u#15 rem16u#11
Not aliassing across scopes: sin8u_table::step#0 div16u::return#2 Not aliassing across scopes: sin8u_table::step#0 div16u::return#2
Not aliassing across scopes: print_char_cursor#24 print_char_cursor#2 Not aliassing across scopes: print_char_cursor#24 print_char_cursor#2
Not aliassing across scopes: print_word::w#1 sin8u_table::step#0 Not aliassing across scopes: print_word::w#1 sin8u_table::step#0
@ -4871,7 +4742,6 @@ Not aliassing across scopes: print_line_cursor#10 print_line_cursor#1
Not aliassing across scopes: print_char_cursor#43 print_line_cursor#1 Not aliassing across scopes: print_char_cursor#43 print_line_cursor#1
Not aliassing across scopes: print_line_cursor#11 print_line_cursor#17 Not aliassing across scopes: print_line_cursor#11 print_line_cursor#17
Not aliassing across scopes: print_char_cursor#45 print_char_cursor#22 Not aliassing across scopes: print_char_cursor#45 print_char_cursor#22
Not aliassing across scopes: rem16u#17 rem16u#13
Alias (word) divr16u::dividend#2 = (word) divr16u::dividend#3 Alias (word) divr16u::dividend#2 = (word) divr16u::dividend#3
Alias (word) divr16u::quotient#3 = (word) divr16u::quotient#6 Alias (word) divr16u::quotient#3 = (word) divr16u::quotient#6
Alias (word) divr16u::divisor#1 = (word) divr16u::divisor#3 (word) divr16u::divisor#6 Alias (word) divr16u::divisor#1 = (word) divr16u::divisor#3 (word) divr16u::divisor#6
@ -4881,17 +4751,14 @@ Alias (byte) mul8u::a#3 = (byte) mul8u::a#5
Alias (word) mul8u::mb#2 = (word) mul8u::mb#3 Alias (word) mul8u::mb#2 = (word) mul8u::mb#3
Alias (byte) sin8s::isUpper#10 = (byte) sin8s::isUpper#3 (byte) sin8s::isUpper#2 Alias (byte) sin8s::isUpper#10 = (byte) sin8s::isUpper#3 (byte) sin8s::isUpper#2
Succesful SSA optimization Pass2AliasElimination Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: divr16u::rem#9 divr16u::rem#3 Not aliassing across scopes: divr16u::rem#8 divr16u::rem#3
Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1 Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1
Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0 Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0
Not aliassing across scopes: rem16u#1 divr16u::rem#10
Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0 Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0
Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0 Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0
Not aliassing across scopes: rem16u#18 rem16u#20
Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1 Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1
Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1 Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1
Not aliassing across scopes: divr16u::return#2 divr16u::return#0 Not aliassing across scopes: divr16u::return#2 divr16u::return#0
Not aliassing across scopes: rem16u#11 rem16u#1
Not aliassing across scopes: div16u::return#0 divr16u::return#2 Not aliassing across scopes: div16u::return#0 divr16u::return#2
Not aliassing across scopes: mul8u::b#2 mul8u::b#0 Not aliassing across scopes: mul8u::b#2 mul8u::b#0
Not aliassing across scopes: mul8u::a#6 mul8u::a#1 Not aliassing across scopes: mul8u::a#6 mul8u::a#1
@ -4954,25 +4821,21 @@ Not aliassing across scopes: print_cls::sc#0 print_screen#1
Not aliassing across scopes: print_screen#4 print_line_cursor#0 Not aliassing across scopes: print_screen#4 print_line_cursor#0
Not aliassing across scopes: print_line_cursor#24 print_line_cursor#0 Not aliassing across scopes: print_line_cursor#24 print_line_cursor#0
Not aliassing across scopes: print_char_cursor#98 print_line_cursor#0 Not aliassing across scopes: print_char_cursor#98 print_line_cursor#0
Not aliassing across scopes: rem16u#19 rem16u#0
Not aliassing across scopes: print_line_cursor#16 print_line_cursor#15 Not aliassing across scopes: print_line_cursor#16 print_line_cursor#15
Not aliassing across scopes: print_char_cursor#21 print_line_cursor#15 Not aliassing across scopes: print_char_cursor#21 print_line_cursor#15
Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0 Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0
Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#0 Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#0
Not aliassing across scopes: rem16u#13 rem16u#16
Not aliassing across scopes: print_char_cursor#22 print_char_cursor#43 Not aliassing across scopes: print_char_cursor#22 print_char_cursor#43
Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10 Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10
Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0 Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0
Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0 Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0
Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0 Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0
Not aliassing across scopes: rem16u#20 rem16u#19
Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21 Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21
Not aliassing across scopes: print_line_cursor#25 print_line_cursor#16 Not aliassing across scopes: print_line_cursor#25 print_line_cursor#16
Not aliassing across scopes: sin8u_table::sintab#11 sin8u_table::sintab#0 Not aliassing across scopes: sin8u_table::sintab#11 sin8u_table::sintab#0
Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0 Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0
Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1 Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1
Not aliassing across scopes: div16u::return#2 div16u::return#0 Not aliassing across scopes: div16u::return#2 div16u::return#0
Not aliassing across scopes: rem16u#15 rem16u#11
Not aliassing across scopes: sin8u_table::step#0 div16u::return#2 Not aliassing across scopes: sin8u_table::step#0 div16u::return#2
Not aliassing across scopes: print_char_cursor#24 print_char_cursor#2 Not aliassing across scopes: print_char_cursor#24 print_char_cursor#2
Not aliassing across scopes: print_word::w#1 sin8u_table::step#0 Not aliassing across scopes: print_word::w#1 sin8u_table::step#0
@ -5013,7 +4876,6 @@ Not aliassing across scopes: print_line_cursor#10 print_line_cursor#1
Not aliassing across scopes: print_char_cursor#43 print_line_cursor#1 Not aliassing across scopes: print_char_cursor#43 print_line_cursor#1
Not aliassing across scopes: print_line_cursor#11 print_line_cursor#17 Not aliassing across scopes: print_line_cursor#11 print_line_cursor#17
Not aliassing across scopes: print_char_cursor#45 print_char_cursor#22 Not aliassing across scopes: print_char_cursor#45 print_char_cursor#22
Not aliassing across scopes: rem16u#17 rem16u#13
Self Phi Eliminated (word) divr16u::divisor#1 Self Phi Eliminated (word) divr16u::divisor#1
Self Phi Eliminated (byte*) print_char_cursor#48 Self Phi Eliminated (byte*) print_char_cursor#48
Self Phi Eliminated (byte*) print_line_cursor#15 Self Phi Eliminated (byte*) print_line_cursor#15
@ -5021,16 +4883,13 @@ Self Phi Eliminated (byte) sin8u_table::amplitude#10
Self Phi Eliminated (byte) sin8u_table::mid#12 Self Phi Eliminated (byte) sin8u_table::mid#12
Self Phi Eliminated (word) sin8u_table::step#10 Self Phi Eliminated (word) sin8u_table::step#10
Self Phi Eliminated (word) sin8u_table::tabsize#10 Self Phi Eliminated (word) sin8u_table::tabsize#10
Self Phi Eliminated (word) rem16u#16
Succesful SSA optimization Pass2SelfPhiElimination Succesful SSA optimization Pass2SelfPhiElimination
Redundant Phi (word) divr16u::rem#9 (word) divr16u::rem#3 Redundant Phi (word) divr16u::rem#8 (word) divr16u::rem#3
Redundant Phi (word) divr16u::dividend#4 (word) divr16u::dividend#1 Redundant Phi (word) divr16u::dividend#4 (word) divr16u::dividend#1
Redundant Phi (word) divr16u::divisor#5 (word) divr16u::divisor#0 Redundant Phi (word) divr16u::divisor#5 (word) divr16u::divisor#0
Redundant Phi (word) divr16u::divisor#1 (word) divr16u::divisor#5 Redundant Phi (word) divr16u::divisor#1 (word) divr16u::divisor#5
Redundant Phi (word) div16u::dividend#1 (word) div16u::dividend#0 Redundant Phi (word) div16u::dividend#1 (word) div16u::dividend#0
Redundant Phi (word) div16u::divisor#1 (word) div16u::divisor#0 Redundant Phi (word) div16u::divisor#1 (word) div16u::divisor#0
Redundant Phi (word) rem16u#18 (word) rem16u#20
Redundant Phi (word) rem16u#11 (word) rem16u#1
Redundant Phi (signed byte) mul8su::a#1 (signed byte) mul8su::a#0 Redundant Phi (signed byte) mul8su::a#1 (signed byte) mul8su::a#0
Redundant Phi (byte) mul8su::b#1 (byte) mul8su::b#0 Redundant Phi (byte) mul8su::b#1 (byte) mul8su::b#0
Redundant Phi (word) sin8s::x#3 (word) sin8s::x#2 Redundant Phi (word) sin8s::x#3 (word) sin8s::x#2
@ -5052,20 +4911,16 @@ Redundant Phi (byte*) print_line_cursor#15 (byte*) print_screen#1
Redundant Phi (byte*) print_screen#4 (byte*) print_line_cursor#0 Redundant Phi (byte*) print_screen#4 (byte*) print_line_cursor#0
Redundant Phi (byte*) print_line_cursor#24 (byte*) print_line_cursor#0 Redundant Phi (byte*) print_line_cursor#24 (byte*) print_line_cursor#0
Redundant Phi (byte*) print_char_cursor#98 (byte*) print_line_cursor#0 Redundant Phi (byte*) print_char_cursor#98 (byte*) print_line_cursor#0
Redundant Phi (word) rem16u#19 (word) rem16u#0
Redundant Phi (byte*) print_line_cursor#16 (byte*) print_line_cursor#15 Redundant Phi (byte*) print_line_cursor#16 (byte*) print_line_cursor#15
Redundant Phi (byte*) print_char_cursor#21 (byte*) print_line_cursor#15 Redundant Phi (byte*) print_char_cursor#21 (byte*) print_line_cursor#15
Redundant Phi (word) rem16u#13 (word) rem16u#16
Redundant Phi (byte*) print_char_cursor#22 (byte*) print_char_cursor#43 Redundant Phi (byte*) print_char_cursor#22 (byte*) print_char_cursor#43
Redundant Phi (byte*) print_line_cursor#17 (byte*) print_line_cursor#10 Redundant Phi (byte*) print_line_cursor#17 (byte*) print_line_cursor#10
Redundant Phi (byte) sin8u_table::max#1 (byte) sin8u_table::max#0 Redundant Phi (byte) sin8u_table::max#1 (byte) sin8u_table::max#0
Redundant Phi (byte) sin8u_table::min#1 (byte) sin8u_table::min#0 Redundant Phi (byte) sin8u_table::min#1 (byte) sin8u_table::min#0
Redundant Phi (word) sin8u_table::tabsize#1 (word) sin8u_table::tabsize#0 Redundant Phi (word) sin8u_table::tabsize#1 (word) sin8u_table::tabsize#0
Redundant Phi (word) rem16u#20 (word) rem16u#19
Redundant Phi (byte*) print_char_cursor#105 (byte*) print_char_cursor#21 Redundant Phi (byte*) print_char_cursor#105 (byte*) print_char_cursor#21
Redundant Phi (byte*) print_line_cursor#25 (byte*) print_line_cursor#16 Redundant Phi (byte*) print_line_cursor#25 (byte*) print_line_cursor#16
Redundant Phi (byte*) sin8u_table::sintab#11 (byte*) sin8u_table::sintab#0 Redundant Phi (byte*) sin8u_table::sintab#11 (byte*) sin8u_table::sintab#0
Redundant Phi (word) rem16u#15 (word) rem16u#11
Redundant Phi (byte*) print_char_cursor#24 (byte*) print_char_cursor#2 Redundant Phi (byte*) print_char_cursor#24 (byte*) print_char_cursor#2
Redundant Phi (byte*) print_char_cursor#25 (byte*) print_char_cursor#12 Redundant Phi (byte*) print_char_cursor#25 (byte*) print_char_cursor#12
Redundant Phi (byte*) print_char_cursor#26 (byte*) print_char_cursor#2 Redundant Phi (byte*) print_char_cursor#26 (byte*) print_char_cursor#2
@ -5082,7 +4937,6 @@ Redundant Phi (byte) sin8u_table::amplitude#10 (byte) sin8u_table::amplitude#0
Redundant Phi (byte) sin8u_table::mid#12 (byte) sin8u_table::mid#0 Redundant Phi (byte) sin8u_table::mid#12 (byte) sin8u_table::mid#0
Redundant Phi (word) sin8u_table::step#10 (word) sin8u_table::step#0 Redundant Phi (word) sin8u_table::step#10 (word) sin8u_table::step#0
Redundant Phi (word) sin8u_table::tabsize#10 (word) sin8u_table::tabsize#1 Redundant Phi (word) sin8u_table::tabsize#10 (word) sin8u_table::tabsize#1
Redundant Phi (word) rem16u#16 (word) rem16u#15
Redundant Phi (byte*) print_char_cursor#35 (byte*) print_char_cursor#2 Redundant Phi (byte*) print_char_cursor#35 (byte*) print_char_cursor#2
Redundant Phi (byte*) print_char_cursor#36 (byte*) print_char_cursor#12 Redundant Phi (byte*) print_char_cursor#36 (byte*) print_char_cursor#12
Redundant Phi (byte*) print_char_cursor#37 (byte*) print_char_cursor#2 Redundant Phi (byte*) print_char_cursor#37 (byte*) print_char_cursor#2
@ -5095,7 +4949,6 @@ Redundant Phi (byte*) print_line_cursor#10 (byte*) print_line_cursor#1
Redundant Phi (byte*) print_char_cursor#43 (byte*) print_line_cursor#1 Redundant Phi (byte*) print_char_cursor#43 (byte*) print_line_cursor#1
Redundant Phi (byte*) print_line_cursor#11 (byte*) print_line_cursor#17 Redundant Phi (byte*) print_line_cursor#11 (byte*) print_line_cursor#17
Redundant Phi (byte*) print_char_cursor#45 (byte*) print_char_cursor#22 Redundant Phi (byte*) print_char_cursor#45 (byte*) print_char_cursor#22
Redundant Phi (word) rem16u#17 (word) rem16u#13
Succesful SSA optimization Pass2RedundantPhiElimination Succesful SSA optimization Pass2RedundantPhiElimination
Redundant Phi (byte*) print_char_cursor#91 (byte*) print_char_cursor#17 Redundant Phi (byte*) print_char_cursor#91 (byte*) print_char_cursor#17
Redundant Phi (byte*) print_char_cursor#100 (byte*) print_line_cursor#1 Redundant Phi (byte*) print_char_cursor#100 (byte*) print_line_cursor#1
@ -5118,7 +4971,6 @@ Simple Condition (bool~) print_sbyte::$1 if((signed byte) print_sbyte::b#1>=(byt
Simple Condition (bool~) print_cls::$1 if((byte*) print_cls::sc#1!=(byte*~) print_cls::$0) goto print_cls::@1 Simple Condition (bool~) print_cls::$1 if((byte*) print_cls::sc#1!=(byte*~) print_cls::$0) goto print_cls::@1
Simple Condition (bool~) sin8u_table::$33 if((word) sin8u_table::i#1<(word) sin8u_table::tabsize#0) goto sin8u_table::@1 Simple Condition (bool~) sin8u_table::$33 if((word) sin8u_table::i#1<(word) sin8u_table::tabsize#0) goto sin8u_table::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const word) rem16u#0 = 0
Constant (const word) divr16u::quotient#0 = 0 Constant (const word) divr16u::quotient#0 = 0
Constant (const byte) divr16u::i#0 = 0 Constant (const byte) divr16u::i#0 = 0
Constant (const word) divr16u::rem#3 = 0 Constant (const word) divr16u::rem#3 = 0
@ -5182,9 +5034,6 @@ Constant (const byte) sin8u_table::mid#0 = ((byte))sin8u_table::$4
Succesful SSA optimization Pass2ConstantIdentification Succesful SSA optimization Pass2ConstantIdentification
Constant (const byte) print_byte::b#6 = sin8u_table::mid#0 Constant (const byte) print_byte::b#6 = sin8u_table::mid#0
Succesful SSA optimization Pass2ConstantIdentification Succesful SSA optimization Pass2ConstantIdentification
Eliminating unused variable (word) rem16u#1 and assignment [15] (word) rem16u#1 ← (word) divr16u::rem#10
Eliminating unused constant (const word) rem16u#0
Succesful SSA optimization PassNEliminateUnusedVars
Eliminating Noop Cast (byte) mul8u::a#1 ← ((byte)) (signed byte) mul8su::a#0 Eliminating Noop Cast (byte) mul8u::a#1 ← ((byte)) (signed byte) mul8su::a#0
Eliminating Noop Cast (signed word) mul8su::return#0 ← ((signed word)) (word) mul8su::m#2 Eliminating Noop Cast (signed word) mul8su::return#0 ← ((signed word)) (word) mul8su::m#2
Eliminating Noop Cast (signed byte) sin8s::sinx#0 ← ((signed byte)) (byte) sin8s::usinx#4 Eliminating Noop Cast (signed byte) sin8s::sinx#0 ← ((signed byte)) (byte) sin8s::usinx#4
@ -5194,7 +5043,6 @@ Eliminating Noop Cast (byte) print_byte::b#0 ← ((byte)) (signed byte) print_sb
Succesful SSA optimization Pass2NopCastElimination Succesful SSA optimization Pass2NopCastElimination
Resolved ranged next value divr16u::i#1 ← ++ divr16u::i#2 to ++ Resolved ranged next value divr16u::i#1 ← ++ divr16u::i#2 to ++
Resolved ranged comparison value if(divr16u::i#1!=rangelast(0,15)) goto divr16u::@1 to (byte/signed byte/word/signed word/dword/signed dword) 16 Resolved ranged comparison value if(divr16u::i#1!=rangelast(0,15)) goto divr16u::@1 to (byte/signed byte/word/signed word/dword/signed dword) 16
Culled Empty Block (label) @2
Culled Empty Block (label) divr16u::@6 Culled Empty Block (label) divr16u::@6
Culled Empty Block (label) mul8u::@3 Culled Empty Block (label) mul8u::@3
Culled Empty Block (label) @13 Culled Empty Block (label) @13
@ -5638,16 +5486,16 @@ Coalesced [235] sin8s::x#10 ← sin8s::x#4
Coalesced [236] sin8s::x#8 ← sin8s::x#2 Coalesced [236] sin8s::x#8 ← sin8s::x#2
Coalesced [240] mul8u::b#3 ← mul8u::b#1 Coalesced [240] mul8u::b#3 ← mul8u::b#1
Coalesced [241] mul8u::a#9 ← mul8u::a#2 Coalesced [241] mul8u::a#9 ← mul8u::a#2
Coalesced [260] divr16u::rem#13 ← divr16u::rem#1 Coalesced [260] divr16u::rem#12 ← divr16u::rem#1
Coalesced [267] divr16u::rem#15 ← divr16u::rem#2 Coalesced [267] divr16u::rem#14 ← divr16u::rem#2
Coalesced [268] divr16u::return#6 ← divr16u::quotient#2 Coalesced [268] divr16u::return#6 ← divr16u::quotient#2
Coalesced [273] divr16u::rem#11 ← divr16u::rem#10 Coalesced [273] divr16u::rem#10 ← divr16u::rem#9
Coalesced [274] divr16u::dividend#8 ← divr16u::dividend#0 Coalesced [274] divr16u::dividend#8 ← divr16u::dividend#0
Coalesced [275] divr16u::quotient#9 ← divr16u::return#0 Coalesced [275] divr16u::quotient#9 ← divr16u::return#0
Coalesced [276] divr16u::i#7 ← divr16u::i#1 Coalesced [276] divr16u::i#7 ← divr16u::i#1
Coalesced [277] divr16u::rem#14 ← divr16u::rem#5 Coalesced [277] divr16u::rem#13 ← divr16u::rem#5
Coalesced [278] divr16u::return#5 ← divr16u::quotient#1 Coalesced [278] divr16u::return#5 ← divr16u::quotient#1
Coalesced [279] divr16u::rem#12 ← divr16u::rem#0 Coalesced [279] divr16u::rem#11 ← divr16u::rem#0
Coalesced [286] print_cls::sc#3 ← print_cls::sc#1 Coalesced [286] print_cls::sc#3 ← print_cls::sc#1
Coalesced down to 28 phi equivalence classes Coalesced down to 28 phi equivalence classes
Culled Empty Block (label) sin8u_table::@26 Culled Empty Block (label) sin8u_table::@26
@ -6134,7 +5982,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[194] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ) [194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) [195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[196] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ) [196] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[197] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ) [197] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
@ -6154,10 +6002,10 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
[205] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::tabsize#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) [205] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::tabsize#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3 to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5 divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ) [206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[206] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ) [206] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3 divr16u::@return: scope:[divr16u] from divr16u::@3
[209] return [ divr16u::return#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 ] ) [209] return [ divr16u::return#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 ] )
@ -6355,10 +6203,10 @@ VARIABLE REGISTER WEIGHTS
(word) divr16u::rem (word) divr16u::rem
(word) divr16u::rem#0 8.25 (word) divr16u::rem#0 8.25
(word) divr16u::rem#1 22.0 (word) divr16u::rem#1 22.0
(word) divr16u::rem#10 11.0
(word) divr16u::rem#2 22.0 (word) divr16u::rem#2 22.0
(word) divr16u::rem#4 22.0 (word) divr16u::rem#4 22.0
(word) divr16u::rem#5 11.0 (word) divr16u::rem#5 11.0
(word) divr16u::rem#9 11.0
(word) divr16u::return (word) divr16u::return
(word) divr16u::return#0 7.000000000000001 (word) divr16u::return#0 7.000000000000001
(word) divr16u::return#2 4.0 (word) divr16u::return#2 4.0
@ -6481,7 +6329,6 @@ VARIABLE REGISTER WEIGHTS
(word) print_word::w#2 22.0 (word) print_word::w#2 22.0
(word) print_word::w#3 6.333333333333334 (word) print_word::w#3 6.333333333333334
(word~) print_word::w#5 4.0 (word~) print_word::w#5 4.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x) (signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 4.0 (word~) sin8s::$6 4.0
(byte) sin8s::DIV_6 (byte) sin8s::DIV_6
@ -6568,7 +6415,7 @@ Initial phi equivalence classes
[ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ]
[ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ]
[ mulu8_sel::select#5 ] [ mulu8_sel::select#5 ]
[ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
[ divr16u::dividend#2 divr16u::dividend#0 ] [ divr16u::dividend#2 divr16u::dividend#0 ]
[ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ]
[ divr16u::i#2 divr16u::i#1 ] [ divr16u::i#2 divr16u::i#1 ]
@ -6634,7 +6481,7 @@ Complete equivalence classes
[ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ]
[ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ]
[ mulu8_sel::select#5 ] [ mulu8_sel::select#5 ]
[ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
[ divr16u::dividend#2 divr16u::dividend#0 ] [ divr16u::dividend#2 divr16u::dividend#0 ]
[ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ]
[ divr16u::i#2 divr16u::i#1 ] [ divr16u::i#2 divr16u::i#1 ]
@ -6699,7 +6546,7 @@ Allocated zp ZP_BYTE:33 [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ]
Allocated zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] Allocated zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ]
Allocated zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] Allocated zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ]
Allocated zp ZP_BYTE:36 [ mulu8_sel::select#5 ] Allocated zp ZP_BYTE:36 [ mulu8_sel::select#5 ]
Allocated zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] Allocated zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
Allocated zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] Allocated zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ]
Allocated zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] Allocated zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ]
Allocated zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] Allocated zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ]
@ -8022,7 +7869,7 @@ divr16u: {
//SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy //SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy
//SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy //SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy
//SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy //SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#10 [phi:divr16u::@3->divr16u::@1#3] -- register_copy //SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#9 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
jmp b1 jmp b1
//SEG422 divr16u::@1 //SEG422 divr16u::@1
b1: b1:
@ -8088,13 +7935,13 @@ divr16u: {
b3_from_b2: b3_from_b2:
b3_from_b5: b3_from_b5:
//SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy //SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#10 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy //SEG440 [206] phi (word) divr16u::rem#9 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
jmp b3 jmp b3
//SEG441 divr16u::@3 //SEG441 divr16u::@3
b3: b3:
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1=_inc_vbuz1 //SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i inc i
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1 //SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i lda i
cmp #$10 cmp #$10
bne b1_from_b3 bne b1_from_b3
@ -8297,7 +8144,7 @@ Potential registers zp ZP_BYTE:33 [ sin8s::return#0 sin8s::return#5 sin8s::sinx#
Potential registers zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] : zp ZP_BYTE:34 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] : zp ZP_BYTE:34 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] : zp ZP_BYTE:35 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] : zp ZP_BYTE:35 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:36 [ mulu8_sel::select#5 ] : zp ZP_BYTE:36 , reg byte x , reg byte y , Potential registers zp ZP_BYTE:36 [ mulu8_sel::select#5 ] : zp ZP_BYTE:36 , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] : zp ZP_WORD:37 , Potential registers zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] : zp ZP_WORD:37 ,
Potential registers zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] : zp ZP_WORD:39 , Potential registers zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] : zp ZP_WORD:39 ,
Potential registers zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] : zp ZP_WORD:41 , Potential registers zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] : zp ZP_WORD:41 ,
Potential registers zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] : zp ZP_BYTE:43 , reg byte x , reg byte y , Potential registers zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] : zp ZP_BYTE:43 , reg byte x , reg byte y ,
@ -8344,7 +8191,7 @@ REGISTER UPLIFT SCOPES
Uplift Scope [mul8u] 346.86: zp ZP_WORD:25 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] 249.57: zp ZP_WORD:27 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] 202: zp ZP_BYTE:65 [ mul8u::$1 ] 177.67: zp ZP_BYTE:24 [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ] 8: zp ZP_BYTE:23 [ mul8u::b#2 mul8u::b#1 ] 4: zp ZP_WORD:61 [ mul8u::return#2 ] 4: zp ZP_WORD:81 [ mul8u::return#3 ] Uplift Scope [mul8u] 346.86: zp ZP_WORD:25 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] 249.57: zp ZP_WORD:27 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] 202: zp ZP_BYTE:65 [ mul8u::$1 ] 177.67: zp ZP_BYTE:24 [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ] 8: zp ZP_BYTE:23 [ mul8u::b#2 mul8u::b#1 ] 4: zp ZP_WORD:61 [ mul8u::return#2 ] 4: zp ZP_WORD:81 [ mul8u::return#3 ]
Uplift Scope [] 225.55: zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] 223.48: zp ZP_WORD:16 [ print_char_cursor#92 print_char_cursor#102 print_char_cursor#62 print_char_cursor#97 print_char_cursor#94 print_char_cursor#96 print_char_cursor#17 print_char_cursor#2 print_char_cursor#122 print_char_cursor#1 ] Uplift Scope [] 225.55: zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] 223.48: zp ZP_WORD:16 [ print_char_cursor#92 print_char_cursor#102 print_char_cursor#62 print_char_cursor#97 print_char_cursor#94 print_char_cursor#96 print_char_cursor#17 print_char_cursor#2 print_char_cursor#122 print_char_cursor#1 ]
Uplift Scope [print_str] 305.5: zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ] Uplift Scope [print_str] 305.5: zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ]
Uplift Scope [divr16u] 96.25: zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] 37.25: zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] 22: zp ZP_BYTE:92 [ divr16u::$1 ] 22: zp ZP_BYTE:93 [ divr16u::$2 ] 18.19: zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] 7.46: zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] 4: zp ZP_WORD:88 [ divr16u::return#2 ] Uplift Scope [divr16u] 96.25: zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] 37.25: zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] 22: zp ZP_BYTE:92 [ divr16u::$1 ] 22: zp ZP_BYTE:93 [ divr16u::$2 ] 18.19: zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] 7.46: zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] 4: zp ZP_WORD:88 [ divr16u::return#2 ]
Uplift Scope [sin8s] 27.5: zp ZP_WORD:30 [ sin8s::x#6 sin8s::x#4 sin8s::x#2 sin8s::x#0 sin8s::x#1 ] 22: zp ZP_BYTE:50 [ sin8s::return#2 ] 13: zp ZP_BYTE:33 [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ] 10: zp ZP_BYTE:32 [ sin8s::usinx#4 sin8s::usinx#1 sin8s::usinx#2 ] 4: zp ZP_WORD:66 [ sin8s::$6 ] 4: zp ZP_BYTE:70 [ sin8s::x2#0 ] 4: zp ZP_BYTE:74 [ sin8s::x3_6#0 ] 4: zp ZP_BYTE:77 [ sin8s::x4#0 ] 4: zp ZP_BYTE:79 [ sin8s::x5#0 ] 4: zp ZP_BYTE:80 [ sin8s::x5_128#0 ] 1: zp ZP_BYTE:72 [ sin8s::x3#0 ] 0.64: zp ZP_BYTE:68 [ sin8s::x1#0 ] 0.33: zp ZP_BYTE:75 [ sin8s::usinx#0 ] 0.06: zp ZP_BYTE:29 [ sin8s::isUpper#10 ] Uplift Scope [sin8s] 27.5: zp ZP_WORD:30 [ sin8s::x#6 sin8s::x#4 sin8s::x#2 sin8s::x#0 sin8s::x#1 ] 22: zp ZP_BYTE:50 [ sin8s::return#2 ] 13: zp ZP_BYTE:33 [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ] 10: zp ZP_BYTE:32 [ sin8s::usinx#4 sin8s::usinx#1 sin8s::usinx#2 ] 4: zp ZP_WORD:66 [ sin8s::$6 ] 4: zp ZP_BYTE:70 [ sin8s::x2#0 ] 4: zp ZP_BYTE:74 [ sin8s::x3_6#0 ] 4: zp ZP_BYTE:77 [ sin8s::x4#0 ] 4: zp ZP_BYTE:79 [ sin8s::x5#0 ] 4: zp ZP_BYTE:80 [ sin8s::x5_128#0 ] 1: zp ZP_BYTE:72 [ sin8s::x3#0 ] 0.64: zp ZP_BYTE:68 [ sin8s::x1#0 ] 0.33: zp ZP_BYTE:75 [ sin8s::usinx#0 ] 0.06: zp ZP_BYTE:29 [ sin8s::isUpper#10 ]
Uplift Scope [mulu8_sel] 24: zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] 21: zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] 4: zp ZP_BYTE:69 [ mulu8_sel::return#0 ] 4: zp ZP_BYTE:71 [ mulu8_sel::return#1 ] 4: zp ZP_BYTE:73 [ mulu8_sel::return#2 ] 4: zp ZP_BYTE:76 [ mulu8_sel::return#10 ] 4: zp ZP_BYTE:78 [ mulu8_sel::return#11 ] 4: zp ZP_WORD:83 [ mulu8_sel::$0 ] 4: zp ZP_WORD:85 [ mulu8_sel::$1 ] 1.71: zp ZP_BYTE:87 [ mulu8_sel::return#12 ] 0.33: zp ZP_BYTE:36 [ mulu8_sel::select#5 ] Uplift Scope [mulu8_sel] 24: zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] 21: zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] 4: zp ZP_BYTE:69 [ mulu8_sel::return#0 ] 4: zp ZP_BYTE:71 [ mulu8_sel::return#1 ] 4: zp ZP_BYTE:73 [ mulu8_sel::return#2 ] 4: zp ZP_BYTE:76 [ mulu8_sel::return#10 ] 4: zp ZP_BYTE:78 [ mulu8_sel::return#11 ] 4: zp ZP_WORD:83 [ mulu8_sel::$0 ] 4: zp ZP_WORD:85 [ mulu8_sel::$1 ] 1.71: zp ZP_BYTE:87 [ mulu8_sel::return#12 ] 0.33: zp ZP_BYTE:36 [ mulu8_sel::select#5 ]
Uplift Scope [sin8u_table] 22: zp ZP_BYTE:57 [ sin8u_table::$21 ] 17.19: zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ] 8.75: zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 ] 3.75: zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 ] 2.2: zp ZP_BYTE:51 [ sin8u_table::sinx#0 ] 2.2: zp ZP_WORD:55 [ sin8u_table::sinx_sc#0 ] 1.94: zp ZP_BYTE:58 [ sin8u_table::sinx_tr#0 ] 0.27: zp ZP_WORD:48 [ sin8u_table::step#0 ] Uplift Scope [sin8u_table] 22: zp ZP_BYTE:57 [ sin8u_table::$21 ] 17.19: zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ] 8.75: zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 ] 3.75: zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 ] 2.2: zp ZP_BYTE:51 [ sin8u_table::sinx#0 ] 2.2: zp ZP_WORD:55 [ sin8u_table::sinx_sc#0 ] 1.94: zp ZP_BYTE:58 [ sin8u_table::sinx_tr#0 ] 0.27: zp ZP_WORD:48 [ sin8u_table::step#0 ]
@ -8362,7 +8209,7 @@ Uplift Scope [main]
Uplifting [mul8u] best 24241 combination zp ZP_WORD:25 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] zp ZP_WORD:27 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] reg byte a [ mul8u::$1 ] reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ] reg byte a [ mul8u::b#2 mul8u::b#1 ] zp ZP_WORD:61 [ mul8u::return#2 ] zp ZP_WORD:81 [ mul8u::return#3 ] Uplifting [mul8u] best 24241 combination zp ZP_WORD:25 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] zp ZP_WORD:27 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] reg byte a [ mul8u::$1 ] reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ] reg byte a [ mul8u::b#2 mul8u::b#1 ] zp ZP_WORD:61 [ mul8u::return#2 ] zp ZP_WORD:81 [ mul8u::return#3 ]
Uplifting [] best 24241 combination zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] zp ZP_WORD:16 [ print_char_cursor#92 print_char_cursor#102 print_char_cursor#62 print_char_cursor#97 print_char_cursor#94 print_char_cursor#96 print_char_cursor#17 print_char_cursor#2 print_char_cursor#122 print_char_cursor#1 ] Uplifting [] best 24241 combination zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] zp ZP_WORD:16 [ print_char_cursor#92 print_char_cursor#102 print_char_cursor#62 print_char_cursor#97 print_char_cursor#94 print_char_cursor#96 print_char_cursor#17 print_char_cursor#2 print_char_cursor#122 print_char_cursor#1 ]
Uplifting [print_str] best 24241 combination zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ] Uplifting [print_str] best 24241 combination zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ]
Uplifting [divr16u] best 24051 combination zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] reg byte a [ divr16u::$1 ] reg byte a [ divr16u::$2 ] reg byte x [ divr16u::i#2 divr16u::i#1 ] zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] zp ZP_WORD:88 [ divr16u::return#2 ] Uplifting [divr16u] best 24051 combination zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] reg byte a [ divr16u::$1 ] reg byte a [ divr16u::$2 ] reg byte x [ divr16u::i#2 divr16u::i#1 ] zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] zp ZP_WORD:88 [ divr16u::return#2 ]
Uplifting [sin8s] best 23946 combination zp ZP_WORD:30 [ sin8s::x#6 sin8s::x#4 sin8s::x#2 sin8s::x#0 sin8s::x#1 ] reg byte a [ sin8s::return#2 ] reg byte a [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ] reg byte x [ sin8s::usinx#4 sin8s::usinx#1 sin8s::usinx#2 ] zp ZP_WORD:66 [ sin8s::$6 ] zp ZP_BYTE:70 [ sin8s::x2#0 ] zp ZP_BYTE:74 [ sin8s::x3_6#0 ] zp ZP_BYTE:77 [ sin8s::x4#0 ] zp ZP_BYTE:79 [ sin8s::x5#0 ] zp ZP_BYTE:80 [ sin8s::x5_128#0 ] zp ZP_BYTE:72 [ sin8s::x3#0 ] zp ZP_BYTE:68 [ sin8s::x1#0 ] zp ZP_BYTE:75 [ sin8s::usinx#0 ] zp ZP_BYTE:29 [ sin8s::isUpper#10 ] Uplifting [sin8s] best 23946 combination zp ZP_WORD:30 [ sin8s::x#6 sin8s::x#4 sin8s::x#2 sin8s::x#0 sin8s::x#1 ] reg byte a [ sin8s::return#2 ] reg byte a [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ] reg byte x [ sin8s::usinx#4 sin8s::usinx#1 sin8s::usinx#2 ] zp ZP_WORD:66 [ sin8s::$6 ] zp ZP_BYTE:70 [ sin8s::x2#0 ] zp ZP_BYTE:74 [ sin8s::x3_6#0 ] zp ZP_BYTE:77 [ sin8s::x4#0 ] zp ZP_BYTE:79 [ sin8s::x5#0 ] zp ZP_BYTE:80 [ sin8s::x5_128#0 ] zp ZP_BYTE:72 [ sin8s::x3#0 ] zp ZP_BYTE:68 [ sin8s::x1#0 ] zp ZP_BYTE:75 [ sin8s::usinx#0 ] zp ZP_BYTE:29 [ sin8s::isUpper#10 ]
Limited combination testing to 100 combinations of 5308416 possible. Limited combination testing to 100 combinations of 5308416 possible.
Uplifting [mulu8_sel] best 23900 combination reg byte x [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] reg byte y [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] reg byte a [ mulu8_sel::return#0 ] reg byte a [ mulu8_sel::return#1 ] zp ZP_BYTE:73 [ mulu8_sel::return#2 ] zp ZP_BYTE:76 [ mulu8_sel::return#10 ] zp ZP_BYTE:78 [ mulu8_sel::return#11 ] zp ZP_WORD:83 [ mulu8_sel::$0 ] zp ZP_WORD:85 [ mulu8_sel::$1 ] zp ZP_BYTE:87 [ mulu8_sel::return#12 ] zp ZP_BYTE:36 [ mulu8_sel::select#5 ] Uplifting [mulu8_sel] best 23900 combination reg byte x [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] reg byte y [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] reg byte a [ mulu8_sel::return#0 ] reg byte a [ mulu8_sel::return#1 ] zp ZP_BYTE:73 [ mulu8_sel::return#2 ] zp ZP_BYTE:76 [ mulu8_sel::return#10 ] zp ZP_BYTE:78 [ mulu8_sel::return#11 ] zp ZP_WORD:83 [ mulu8_sel::$0 ] zp ZP_WORD:85 [ mulu8_sel::$1 ] zp ZP_BYTE:87 [ mulu8_sel::return#12 ] zp ZP_BYTE:36 [ mulu8_sel::select#5 ]
@ -8426,8 +8273,8 @@ Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m
Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m#2 mul8su::m#1 mul8su::m#0 mul8su::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 ] ] with [ zp ZP_WORD:55 [ sin8u_table::sinx_sc#0 ] ] - score: 1 Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m#2 mul8su::m#1 mul8su::m#0 mul8su::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 ] ] with [ zp ZP_WORD:55 [ sin8u_table::sinx_sc#0 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 ] ] with [ zp ZP_WORD:46 [ div16u::return#2 sin8u_table::step#0 div16u::return#0 ] ] - score: 1 Coalescing zero page register with common assignment [ zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 ] ] with [ zp ZP_WORD:46 [ div16u::return#2 sin8u_table::step#0 div16u::return#0 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m#2 mul8su::m#1 mul8su::m#0 mul8su::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 sin8u_table::sinx_sc#0 ] ] with [ zp ZP_WORD:83 [ mulu8_sel::$0 mulu8_sel::$1 ] ] - score: 1 Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m#2 mul8su::m#1 mul8su::m#0 mul8su::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 sin8u_table::sinx_sc#0 ] ] with [ zp ZP_WORD:83 [ mulu8_sel::$0 mulu8_sel::$1 ] ] - score: 1
Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 ] ] with [ zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ] Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 ] ] with [ zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ]
Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ] with [ zp ZP_WORD:44 [ print_cls::sc#2 print_cls::sc#1 ] ] Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ] with [ zp ZP_WORD:44 [ print_cls::sc#2 print_cls::sc#1 ] ]
Coalescing zero page register [ zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 ] ] with [ zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] ] Coalescing zero page register [ zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 ] ] with [ zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] ]
Coalescing zero page register [ zp ZP_BYTE:10 [ print_byte::b#8 print_byte::b#10 print_byte::b#1 print_byte::b#2 print_byte::b#7 print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#0 ] ] with [ zp ZP_BYTE:29 [ sin8s::isUpper#10 ] ] Coalescing zero page register [ zp ZP_BYTE:10 [ print_byte::b#8 print_byte::b#10 print_byte::b#1 print_byte::b#2 print_byte::b#7 print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#0 ] ] with [ zp ZP_BYTE:29 [ sin8s::isUpper#10 ] ]
Coalescing zero page register [ zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ] ] with [ zp ZP_WORD:14 [ print_sword::w#3 print_sword::w#1 print_sword::w#0 print_word::w#3 print_word::w#5 print_word::w#2 print_word::w#1 ] ] Coalescing zero page register [ zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ] ] with [ zp ZP_WORD:14 [ print_sword::w#3 print_sword::w#1 print_sword::w#0 print_word::w#3 print_word::w#5 print_word::w#2 print_word::w#1 ] ]
@ -9596,7 +9443,7 @@ divr16u: {
//SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy //SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy
//SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy //SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy
//SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy //SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#10 [phi:divr16u::@3->divr16u::@1#3] -- register_copy //SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#9 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
jmp b1 jmp b1
//SEG422 divr16u::@1 //SEG422 divr16u::@1
b1: b1:
@ -9659,13 +9506,13 @@ divr16u: {
b3_from_b2: b3_from_b2:
b3_from_b5: b3_from_b5:
//SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy //SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#10 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy //SEG440 [206] phi (word) divr16u::rem#9 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
jmp b3 jmp b3
//SEG441 divr16u::@3 //SEG441 divr16u::@3
b3: b3:
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx //SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1 //SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$10 cpx #$10
bne b1_from_b3 bne b1_from_b3
jmp breturn jmp breturn
@ -10033,10 +9880,10 @@ FINAL SYMBOL TABLE
(word) divr16u::rem (word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:2 8.25 (word) divr16u::rem#0 rem zp ZP_WORD:2 8.25
(word) divr16u::rem#1 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#1 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#10 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#2 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#2 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#4 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#4 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#5 rem zp ZP_WORD:2 11.0 (word) divr16u::rem#5 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#9 rem zp ZP_WORD:2 11.0
(word) divr16u::return (word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:18 7.000000000000001 (word) divr16u::return#0 return zp ZP_WORD:18 7.000000000000001
(word) divr16u::return#2 return zp ZP_WORD:18 4.0 (word) divr16u::return#2 return zp ZP_WORD:18 4.0
@ -10196,7 +10043,6 @@ FINAL SYMBOL TABLE
(word) print_word::w#2 w zp ZP_WORD:11 22.0 (word) print_word::w#2 w zp ZP_WORD:11 22.0
(word) print_word::w#3 w zp ZP_WORD:11 6.333333333333334 (word) print_word::w#3 w zp ZP_WORD:11 6.333333333333334
(word~) print_word::w#5 w zp ZP_WORD:11 4.0 (word~) print_word::w#5 w zp ZP_WORD:11 4.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x) (signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 $6 zp ZP_WORD:11 4.0 (word~) sin8s::$6 $6 zp ZP_WORD:11 4.0
(label) sin8s::@1 (label) sin8s::@1
@ -10313,7 +10159,7 @@ FINAL SYMBOL TABLE
(word) sin8u_table::x#1 x zp ZP_WORD:2 7.333333333333333 (word) sin8u_table::x#1 x zp ZP_WORD:2 7.333333333333333
(word) sin8u_table::x#10 x zp ZP_WORD:2 1.4193548387096775 (word) sin8u_table::x#10 x zp ZP_WORD:2 1.4193548387096775
zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ] zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 divr16u::dividend#2 divr16u::dividend#0 ] zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 divr16u::dividend#2 divr16u::dividend#0 ]
zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ] zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ]
zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ]
@ -11296,7 +11142,7 @@ divr16u: {
//SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy //SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy
//SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy //SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy
//SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy //SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#10 [phi:divr16u::@3->divr16u::@1#3] -- register_copy //SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#9 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
//SEG422 divr16u::@1 //SEG422 divr16u::@1
b1: b1:
//SEG423 [195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) -- vwuz1=vwuz1_rol_1 //SEG423 [195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) -- vwuz1=vwuz1_rol_1
@ -11349,12 +11195,12 @@ divr16u: {
sta rem+1 sta rem+1
//SEG438 [206] phi from divr16u::@2 divr16u::@5 to divr16u::@3 [phi:divr16u::@2/divr16u::@5->divr16u::@3] //SEG438 [206] phi from divr16u::@2 divr16u::@5 to divr16u::@3 [phi:divr16u::@2/divr16u::@5->divr16u::@3]
//SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy //SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#10 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy //SEG440 [206] phi (word) divr16u::rem#9 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
//SEG441 divr16u::@3 //SEG441 divr16u::@3
b3: b3:
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx //SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx
inx inx
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1 //SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$10 cpx #$10
bne b1 bne b1
//SEG444 divr16u::@return //SEG444 divr16u::@return

View File

@ -38,10 +38,10 @@
(word) divr16u::rem (word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:2 8.25 (word) divr16u::rem#0 rem zp ZP_WORD:2 8.25
(word) divr16u::rem#1 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#1 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#10 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#2 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#2 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#4 rem zp ZP_WORD:2 22.0 (word) divr16u::rem#4 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#5 rem zp ZP_WORD:2 11.0 (word) divr16u::rem#5 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#9 rem zp ZP_WORD:2 11.0
(word) divr16u::return (word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:18 7.000000000000001 (word) divr16u::return#0 return zp ZP_WORD:18 7.000000000000001
(word) divr16u::return#2 return zp ZP_WORD:18 4.0 (word) divr16u::return#2 return zp ZP_WORD:18 4.0
@ -201,7 +201,6 @@
(word) print_word::w#2 w zp ZP_WORD:11 22.0 (word) print_word::w#2 w zp ZP_WORD:11 22.0
(word) print_word::w#3 w zp ZP_WORD:11 6.333333333333334 (word) print_word::w#3 w zp ZP_WORD:11 6.333333333333334
(word~) print_word::w#5 w zp ZP_WORD:11 4.0 (word~) print_word::w#5 w zp ZP_WORD:11 4.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x) (signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 $6 zp ZP_WORD:11 4.0 (word~) sin8s::$6 $6 zp ZP_WORD:11 4.0
(label) sin8s::@1 (label) sin8s::@1
@ -318,7 +317,7 @@
(word) sin8u_table::x#1 x zp ZP_WORD:2 7.333333333333333 (word) sin8u_table::x#1 x zp ZP_WORD:2 7.333333333333333
(word) sin8u_table::x#10 x zp ZP_WORD:2 1.4193548387096775 (word) sin8u_table::x#10 x zp ZP_WORD:2 1.4193548387096775
zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ] zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 divr16u::dividend#2 divr16u::dividend#0 ] zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 divr16u::dividend#2 divr16u::dividend#0 ]
zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ] zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ]
zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ]