1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-11 20:37:40 +00:00

Assignments are now expressions. For-loops can now contain assignments in the increment part. LValue handling reimplemented (lvalue no longer exist in parser - only expression). RValues now also contains pointer derefs. Complex array expressions (SCREEN+$100)[i] now possible as LValues. ASM fragment generation improved to handle new more complex LValues & RValues. Closes #5. Closes #43

This commit is contained in:
jespergravgaard 2017-12-26 17:24:30 +01:00
parent 2c44783879
commit b412a4aefc
110 changed files with 24352 additions and 16285 deletions

View File

@ -106,7 +106,6 @@ public class Compiler {
private Program pass1GenerateSSA() {
new Pass1FixLvalueLoHi(program).execute();
new Pass1TypeInference(program).execute();
getLog().append("PROGRAM");
getLog().append(program.getStatementSequence().toString(program));
@ -114,6 +113,8 @@ public class Compiler {
getLog().append(program.getScope().getSymbolTableContents(program));
new Pass1GenerateControlFlowGraph(program).execute();
new Pass1FixLValuesLoHi(program).execute();
new Pass1AssertNoLValueIntermediate(program).execute();
new Pass1AddTypePromotions(program).execute();
getLog().append("INITIAL CONTROL FLOW GRAPH");

View File

@ -89,9 +89,18 @@ public class AsmFragmentManager {
Map<String, String> mapZ = new LinkedHashMap<>();
mapZ.put("z2", "z1");
mapZ.put("z3", "z2");
Map<String, String> mapConst = new LinkedHashMap<>();
mapConst.put("c2", "c1");
mapConst.put("c3", "c2");
Map<String, String> mapZ2 = new LinkedHashMap<>();
mapZ2.put("z3", "z1");
Map<String, String> mapZ3 = new LinkedHashMap<>();
mapZ3.put("z3", "z2");
Map<String, String> mapC = new LinkedHashMap<>();
mapC.put("c2", "c1");
mapC.put("c3", "c2");
Map<String, String> mapC3 = new LinkedHashMap<>();
mapC3.put("c3", "c2");
Map<String, String> mapZC = new LinkedHashMap<>();
mapZC.putAll(mapZ);
mapZC.putAll(mapC);
Map<String, String> mapSToU = new LinkedHashMap<>();
mapSToU.put("vbsz1", "vbuz1");
mapSToU.put("vbsz2", "vbuz2");
@ -124,9 +133,14 @@ public class AsmFragmentManager {
synths.add(new FragmentSynthesis("vbsyy=(.*)", null, null, "vbsaa=$1", "tay\n", null));
synths.add(new FragmentSynthesis("vbuz1=(.*)", ".*=.*vb.z1.*", null, "vbuaa=$1", "sta {z1}\n", mapZ));
synths.add(new FragmentSynthesis("vbsz1=(.*)", ".*=.*vb.z1.*", null, "vbsaa=$1", "sta {z1}\n", mapZ));
synths.add(new FragmentSynthesis("_deref_vwuc1=(.*)", null, null, "vbuaa=$1", "sta {c1}\n", mapConst));
synths.add(new FragmentSynthesis("_deref_vwuc1=(.*)", null, null, "vbuaa=$1", "sta {c1}\n", mapC));
synths.add(new FragmentSynthesis("_deref_pbuz1=(.*)", ".*=.*z1.*", null, "vbuaa=$1", "ldy #0\n" + "sta ({z1}),y\n", mapZ));
synths.add(new FragmentSynthesis("vwuc1_derefidx_vbuz1=(.*)", null, null, "vbuaa=$1", "ldx {z1}\n"+"sta {c1},x\n", mapZ));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuz1=(.*)", ".*z1.*z1.*|.*c1.*c1.*", null, "vb$1aa=$2", "ldx {z1}\n"+"sta {c1},x\n", mapZC));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuz1=(.*c1.*)", ".*z1.*z1.*", null, "vb$1aa=$2", "ldx {z1}\n"+"sta {c1},x\n", mapZ));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuyy=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1},y\n", mapC));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuxx=(.*)", ".*c1.*c1.*", null, "vb$1aa=$2", "sta {c1},x\n", mapC));
synths.add(new FragmentSynthesis("pb(.)z1_derefidx_vbuz2=(.*)", ".*z1.*z1.*|.*z2.*z2.*", null, "vb$1aa=$2", "ldy {z2}\n"+"sta ({z1}),y\n", mapZ2));
synths.add(new FragmentSynthesis("(.*)=vbuxx(.*)", ".*=.*vb.aa.*", "txa\n", "$1=vbuaa$2", null, null));
synths.add(new FragmentSynthesis("(.*)=vbuyy(.*)", ".*=.*vb.aa.*", "tya\n", "$1=vbuaa$2", null, null));
@ -136,11 +150,39 @@ public class AsmFragmentManager {
synths.add(new FragmentSynthesis("(.*)=vbsz2(.*)", ".*=.*vb.aa.*|.*z2.*z2.*|.*z3.*", "lda {z2}\n", "$1=vbsaa$2", null, null));
synths.add(new FragmentSynthesis("(.*)=vbuz2", ".*=.*aa.*|.*z2.*=.*", "lda {z2}\n", "$1=vbuaa", null, null));
synths.add(new FragmentSynthesis("(.*)=vbsz2", ".*=.*aa.*|.*z2.*=.*", "lda {z2}\n", "$1=vbuaa", null, null));
synths.add(new FragmentSynthesis("(.*)=vbuc1", ".*=.*aa.*", "lda #{c1}\n", "$1=vbuaa", null, mapConst));
synths.add(new FragmentSynthesis("(.*)=vbsc1", ".*=.*aa.*", "lda #{c1}\n", "$1=vbsaa", null, mapConst));
synths.add(new FragmentSynthesis("(.*)=_deref_vwuc1(.*)", ".*=.*aa.*", "lda {c1}\n", "$1=vbuaa$2", null, mapConst));
synths.add(new FragmentSynthesis("(.*)=vbuc1", ".*=.*aa.*", "lda #{c1}\n", "$1=vbuaa", null, mapC));
synths.add(new FragmentSynthesis("(.*)=vbsc1", ".*=.*aa.*", "lda #{c1}\n", "$1=vbsaa", null, mapC));
synths.add(new FragmentSynthesis("(.*)=_deref_vwuc1(.*)", ".*=.*aa.*", "lda {c1}\n", "$1=vbuaa$2", null, mapC));
synths.add(new FragmentSynthesis("(.*)=_deref_pb(.)z1(.*)", ".*z1.*z1.*|.*=.*aa.*|.*=.*yy.*", "ldy #0\n" + "lda ({z1}),y\n", "$1=vb$2aa$3", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c1_derefidx_vbuxx(.*)", ".*=.*aa.*|.*c1.*c1.*", "lda {c1},x\n", "$1=$2vb$3aa$4", null, mapC));
synths.add(new FragmentSynthesis("(.*)=(.*c1.*)pb(.)c1_derefidx_vbuxx(.*)", ".*=.*aa.*", "lda {c1},x\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c1_derefidx_vbuxx(.*c1.*)", ".*=.*aa.*", "lda {c1},x\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c1_derefidx_vbuyy(.*)", ".*=.*aa.*|.*c1.*c1.*", "lda {c1},y\n", "$1=$2vb$3aa$4", null, mapC));
synths.add(new FragmentSynthesis("(.*)=(.*c1.*)pb(.)c1_derefidx_vbuyy(.*)", ".*=.*aa.*", "lda {c1},y\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c1_derefidx_vbuyy(.*c1.*)", ".*=.*aa.*", "lda {c1},y\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c2_derefidx_vbuxx(.*)", ".*=.*aa.*|.*c2.*c2.*", "lda {c2},x\n", "$1=$2vb$3aa$4", null, mapC3));
synths.add(new FragmentSynthesis("(.*)=(.*c2.*)pb(.)c2_derefidx_vbuxx(.*)", ".*=.*aa.*", "lda {c2},x\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c2_derefidx_vbuxx(.*c2.*)", ".*=.*aa.*", "lda {c2},x\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c2_derefidx_vbuyy(.*)", ".*=.*aa.*|.*c2.*c2.*", "lda {c2},y\n", "$1=$2vb$3aa$4", null, mapC3));
synths.add(new FragmentSynthesis("(.*)=(.*c2.*)pb(.)c2_derefidx_vbuyy(.*)", ".*=.*aa.*", "lda {c2},y\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)pb(.)c2_derefidx_vbuyy(.*c2.*)", ".*=.*aa.*", "lda {c2},y\n", "$1=$2vb$3aa$4", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuaa(.*)", ".*=.*xx.*", "tax\n", "$1=$2_derefidx_vbuxx$3", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuaa(.*)", ".*=.*yy.*", "tay\n", "$1=$2_derefidx_vbuyy$3", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz1(.*)", ".*=.*xx.*|.*z1.*z1.*", "ldx {z1}\n", "$1=$2_derefidx_vbuxx$3", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz1(.*)", ".*=.*yy.*|.*z1.*z1.*", "ldy {z1}\n", "$1=$2_derefidx_vbuyy$3", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz2(.*)", ".*=.*xx.*|.*z2.*z2.*", "ldx {z2}\n", "$1=$2_derefidx_vbuxx$3", null, mapZ3));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz2(.*)", ".*=.*yy.*|.*z2.*z2.*", "ldy {z2}\n", "$1=$2_derefidx_vbuyy$3", null, mapZ3));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz3(.*)", ".*=.*yy.*", "ldy {z3}\n", "$1=$2_derefidx_vbuyy$3", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz3(.*)", ".*=.*xx.*", "ldx {z3}\n", "$1=$2_derefidx_vbuxx$3", null, null));
synths.add(new FragmentSynthesis("(.*)_derefidx_vbuz1(.*)_derefidx_vbuz1(.*)", ".*z1.*z1.*z1.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "ldx {z1}\n", mapZ));
synths.add(new FragmentSynthesis("(.*)_derefidx_vbuz1(.*)_derefidx_vbuz1(.*)", ".*z1.*z1.*z1.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "ldy {z1}\n", mapZ));
synths.add(new FragmentSynthesis("(.*)_derefidx_vbuz2(.*)_derefidx_vbuz2(.*)", ".*z2.*z2.*z2.*|.*xx.*", null, "$1_derefidx_vbuxx$2_derefidx_vbuxx$3", "ldx {z2}\n", mapZ));
synths.add(new FragmentSynthesis("(.*)_derefidx_vbuz2(.*)_derefidx_vbuz2(.*)", ".*z2.*z2.*z2.*|.*yy.*", null, "$1_derefidx_vbuyy$2_derefidx_vbuyy$3", "ldy {z2}\n", mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_vbuxx", ".*=.*[ax][ax].*xx|.*derefidx_vb.xx", "txa\n", "$1=$2_vbuaa", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_vbsxx", ".*=.*[ax][ax].*xx|.*derefidx_vb.xx", "txa\n", "$1=$2_vbsaa", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_vbuyy", ".*=.*[ay][ay].*yy|.*derefidx_vb.yy", "tya\n", "$1=$2_vbuaa", null, null));
@ -153,20 +195,19 @@ public class AsmFragmentManager {
synths.add(new FragmentSynthesis("vbuz1=vbuz1(.*)", ".*=.*vb.aa.*|.*z1.*z1.*z1.*", "lda {z1}\n", "vbuaa=vbuaa$1", "sta {z1}\n", mapZ));
synths.add(new FragmentSynthesis("vbsz1=vbsz1(.*)", ".*=.*vb.aa.*|.*z1.*z1.*z1.*", "lda {z1}\n", "vbsaa=vbsaa$1", "sta {z1}\n", mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuaa", ".*=.*yy.*", "tay\n", "$1=$2_derefidx_vbuyy", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuaa", ".*=.*xx.*", "tax\n", "$1=$2_derefidx_vbuxx", null, null));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz1", ".*=.*yy.*|.*z1.*z1.*", "ldy {z1}\n", "$1=$2_derefidx_vbuyy", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz1", ".*=.*xx.*|.*z1.*z1.*", "ldx {z1}\n", "$1=$2_derefidx_vbuxx", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz2", ".*=.*xx.*|.*z2.*z2.*", "ldx {z2}\n", "$1=$2_derefidx_vbuxx", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz2", ".*=.*yy.*|.*z2.*z2.*", "ldy {z2}\n", "$1=$2_derefidx_vbuyy", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz3", ".*=.*xx.*|.*z3.*z3.*", "ldx {z3}\n", "$1=$2_derefidx_vbuxx", null, mapZ));
synths.add(new FragmentSynthesis("(.*)=(.*)_derefidx_vbuz3", ".*=.*yy.*|.*z3.*z3.*", "ldy {z3}\n", "$1=$2_derefidx_vbuyy", null, mapZ));
synths.add(new FragmentSynthesis("vbuz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*", "lda {z1}\n", "vbuaa_$1_$2", null, mapZ));
synths.add(new FragmentSynthesis("vbsz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*", "lda {z1}\n", "vbsaa_$1_$2", null, mapZ));
synths.add(new FragmentSynthesis("_deref_vwuc1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*", "lda {c1}\n", "vbuaa_$1_$2", null, mapConst));
synths.add(new FragmentSynthesis("_deref_vwuc1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*", "lda {c1}\n", "vbuaa_$1_$2", null, mapC));
synths.add(new FragmentSynthesis("_deref_pb(.)z1_(lt|gt|le|ge|eq|neq)_(.*)", ".*vb.aa.*|.*vb.yy.*|.*z1.*z1.*", "ldy #0\n" + "lda ({z1}),y\n", "vb$1aa_$2_$3", null, mapZ));
synths.add(new FragmentSynthesis("(.*)_derefidx_vbuz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*z1.*z1.*|.*vb.yy.*", "ldy {z1}\n", "$1_derefidx_vbuyy_$2_$3", null, mapZ));
synths.add(new FragmentSynthesis("(.*)_derefidx_vbuz1_(lt|gt|le|ge|eq|neq)_(.*)", ".*z1.*z1.*|.*vb.xx.*", "ldx {z1}\n", "$1_derefidx_vbuxx_$2_$3", null, mapZ));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuyy_(lt|gt|le|ge|eq|neq)_(.*)", ".*c1.*c1.*|.*aa.*", "lda {c1},y\n", "vb$1aa_$2_$3", null, mapC));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuyy_(lt|gt|le|ge|eq|neq)_(.*c1.*)", ".*aa.*", "lda {c1},y\n", "vb$1aa_$2_$3", null, null));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuxx_(lt|gt|le|ge|eq|neq)_(.*)", ".*c1.*c1.*|.*aa.*", "lda {c1},x\n", "vb$1aa_$2_$3", null, mapC));
synths.add(new FragmentSynthesis("pb(.)c1_derefidx_vbuxx_(lt|gt|le|ge|eq|neq)_(.*c1.*)", ".*aa.*", "lda {c1},x\n", "vb$1aa_$2_$3", null, null));
synths.add(new FragmentSynthesis("(.*)_ge_(vb.aa)_then_(.*)", ".*vb.aa.*_ge.*", null, "$2_lt_$1_then_$3", null, null));
synths.add(new FragmentSynthesis("(.*)_ge_(vb.xx)_then_(.*)", ".*vb.[ax][ax].*_ge.*", null, "$2_lt_$1_then_$3", null, null));
synths.add(new FragmentSynthesis("(.*)_ge_(vb.yy)_then_(.*)", ".*vb.[axy][axy].*_ge.*", null, "$2_lt_$1_then_$3", null, null));

View File

@ -0,0 +1,27 @@
package dk.camelot64.kickc.model;
/**
* LValue containing an intermediate variable during parsing. Must be resolved to a proper LValue in Pass 1 - or result in failure
*/
public class LvalueIntermediate implements LValue {
private VariableRef variable;
public LvalueIntermediate(VariableRef variable) {
this.variable = variable;
}
public VariableRef getVariable() {
return variable;
}
@Override
public String toString(Program program) {
return "lval" + "(" + variable.toString(program) + ")";
}
public void setVariable(VariableRef variable) {
this.variable = variable;
}
}

View File

@ -18,6 +18,9 @@ public class SymbolTypeInference {
* @return The type of the resulting value
*/
public static SymbolType inferType(ProgramScope programScope, Operator operator, RValue rValue) {
if(operator==null) {
return inferType(programScope, rValue);
}
if (operator.equals(Operator.CAST_BYTE)) {
return SymbolType.BYTE;
} else if (operator.equals(Operator.CAST_SBYTE)) {
@ -375,4 +378,45 @@ public class SymbolTypeInference {
return false;
}
public static void inferCallLValue(ProgramScope programScope, StatementCall call) {
LValue lValue = call.getlValue();
if(lValue instanceof VariableRef) {
Variable lValueVar = programScope.getVariable((VariableRef) lValue);
if(SymbolType.VAR.equals(lValueVar.getType())) {
Procedure procedure = programScope.getProcedure(call.getProcedure());
lValueVar.setTypeInferred(procedure.getReturnType());
}
}
}
public static void inferAssignmentLValue(ProgramScope programScope, StatementAssignment assignment) {
LValue lValue = assignment.getlValue();
if (lValue instanceof VariableRef) {
Variable symbol = programScope.getVariable((VariableRef) lValue);
if (SymbolType.VAR.equals(symbol.getType())) {
// Unresolved symbol - perform inference
Operator operator = assignment.getOperator();
if (operator == null || assignment.getrValue1() == null) {
// Copy operation or Unary operation
RValue rValue = assignment.getrValue2();
SymbolType type = inferType(programScope, operator, rValue);
symbol.setTypeInferred(type);
} else {
// Binary operation
SymbolType type = inferType(programScope, assignment.getrValue1(), assignment.getOperator(), assignment.getrValue2());
symbol.setTypeInferred(type);
}
}
}
}
public static void inferLValue(ProgramScope programScope, StatementLValue statementLValue) {
if(statementLValue instanceof StatementAssignment) {
inferAssignmentLValue(programScope, (StatementAssignment) statementLValue);
} else if(statementLValue instanceof StatementCall) {
inferCallLValue(programScope, (StatementCall) statementLValue);
} else {
throw new RuntimeException("LValue statement not implemented "+statementLValue);
}
}
}

View File

@ -43,7 +43,6 @@ stmtSeq
stmt
: declVar #stmtDeclVar
| '{' stmtSeq? '}' #stmtBlock
| lvalue '=' expr ';' #stmtAssignment
| expr ';' #stmtExpr
| 'if' '(' expr ')' stmt ( 'else' stmt )? #stmtIfElse
| 'while' '(' expr ')' stmt #stmtWhile
@ -58,7 +57,7 @@ forDeclaration
;
forIteration
: ';' expr ';' expr? # forClassic
: ';' expr ';' expr # forClassic
| ':' expr ( '..' ) expr #forRange
;
@ -69,14 +68,6 @@ typeDecl
| typeDecl '[' (expr)? ']' #typeArray
;
lvalue
: NAME #lvalueName
| '*' NAME #lvaluePtr
| '*' '(' expr ')' #lvaluePtrExpr
| ('<' | '>' ) lvalue #lvalueLoHi
| lvalue '[' expr ']' #lvalueArray
;
expr
: '(' expr ')' #exprPar
| NAME '(' parameterList? ')' #exprCall
@ -84,7 +75,8 @@ expr
| expr '[' expr ']' #exprArray
| ('--' | '++' ) expr #exprPreMod
| expr ('--' | '++' ) #exprPostMod
| ('+' | '-' | '!' | '&' | '*' | '~') expr #exprUnary
| '*' expr #exprPtr
| ('+' | '-' | '!' | '&' | '~') expr #exprUnary
| expr ('>>' | '<<' ) expr #exprBinary
| expr ('*' | '/' | '%' ) expr #exprBinary
| expr ( '+' | '-') expr #exprBinary
@ -95,6 +87,7 @@ expr
| expr ( '|' ) expr #exprBinary
| expr ( '&&' ) expr #exprBinary
| expr ( '||' ) expr #exprBinary
| <assoc=right> expr '=' expr #exprAssignment
| '{' expr (',' expr )* '}' #initList
| NAME #exprId
| NUMBER #exprNumber

View File

@ -86,19 +86,19 @@ COMMENT_BLOCK=66
'*'=20
'['=21
']'=22
'<'=23
'>'=24
'--'=25
'++'=26
'+'=27
'-'=28
'!'=29
'&'=30
'~'=31
'>>'=32
'<<'=33
'/'=34
'%'=35
'--'=23
'++'=24
'+'=25
'-'=26
'!'=27
'&'=28
'~'=29
'>>'=30
'<<'=31
'/'=32
'%'=33
'<'=34
'>'=35
'=='=36
'!='=37
'<>'=38

View File

@ -167,18 +167,6 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitStmtBlock(KickCParser.StmtBlockContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterStmtAssignment(KickCParser.StmtAssignmentContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitStmtAssignment(KickCParser.StmtAssignmentContext ctx) { }
/**
* {@inheritDoc}
*
@ -352,61 +340,13 @@ public class KickCBaseListener implements KickCListener {
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterLvalueName(KickCParser.LvalueNameContext ctx) { }
@Override public void enterExprPtr(KickCParser.ExprPtrContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitLvalueName(KickCParser.LvalueNameContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterLvaluePtr(KickCParser.LvaluePtrContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitLvaluePtr(KickCParser.LvaluePtrContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterLvaluePtrExpr(KickCParser.LvaluePtrExprContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitLvaluePtrExpr(KickCParser.LvaluePtrExprContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterLvalueArray(KickCParser.LvalueArrayContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitLvalueArray(KickCParser.LvalueArrayContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterLvalueLoHi(KickCParser.LvalueLoHiContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitLvalueLoHi(KickCParser.LvalueLoHiContext ctx) { }
@Override public void exitExprPtr(KickCParser.ExprPtrContext ctx) { }
/**
* {@inheritDoc}
*
@ -563,6 +503,18 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprId(KickCParser.ExprIdContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprAssignment(KickCParser.ExprAssignmentContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprAssignment(KickCParser.ExprAssignmentContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -102,13 +102,6 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitStmtBlock(KickCParser.StmtBlockContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitStmtAssignment(KickCParser.StmtAssignmentContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -213,35 +206,7 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLvalueName(KickCParser.LvalueNameContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLvaluePtr(KickCParser.LvaluePtrContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLvaluePtrExpr(KickCParser.LvaluePtrExprContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLvalueArray(KickCParser.LvalueArrayContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLvalueLoHi(KickCParser.LvalueLoHiContext ctx) { return visitChildren(ctx); }
@Override public T visitExprPtr(KickCParser.ExprPtrContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -333,6 +298,13 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprId(KickCParser.ExprIdContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprAssignment(KickCParser.ExprAssignmentContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -51,8 +51,8 @@ public class KickCLexer extends Lexer {
private static final String[] _LITERAL_NAMES = {
null, "'import'", "'('", "')'", "'{'", "'}'", "','", "'const'", "'='",
"';'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'", "'asm'",
"':'", "'..'", "'signed'", "'*'", "'['", "']'", "'<'", "'>'", "'--'",
"'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'",
"':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'",
"'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'",
"'=='", "'!='", "'<>'", "'<='", "'=<'", "'>='", "'=>'", "'^'", "'|'",
"'&&'", "'||'", "'#'"
};
@ -137,10 +137,10 @@ public class KickCLexer extends Lexer {
"\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20"+
"\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\23\3\23\3\23"+
"\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30"+
"\3\30\3\31\3\31\3\32\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\35\3\35\3\36"+
"\3\36\3\37\3\37\3 \3 \3!\3!\3!\3\"\3\"\3\"\3#\3#\3$\3$\3%\3%\3%\3&\3&"+
"\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3-\3-\3.\3."+
"\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
"\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36"+
"\3\36\3\37\3\37\3\37\3 \3 \3 \3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3%\3%\3&\3"+
"&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3-\3-\3.\3"+
".\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
"\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
"\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
"\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
@ -193,9 +193,9 @@ public class KickCLexer extends Lexer {
"\2\25\u00ac\3\2\2\2\27\u00af\3\2\2\2\31\u00b4\3\2\2\2\33\u00ba\3\2\2\2"+
"\35\u00bd\3\2\2\2\37\u00c1\3\2\2\2!\u00c8\3\2\2\2#\u00cc\3\2\2\2%\u00ce"+
"\3\2\2\2\'\u00d1\3\2\2\2)\u00d8\3\2\2\2+\u00da\3\2\2\2-\u00dc\3\2\2\2"+
"/\u00de\3\2\2\2\61\u00e0\3\2\2\2\63\u00e2\3\2\2\2\65\u00e5\3\2\2\2\67"+
"\u00e8\3\2\2\29\u00ea\3\2\2\2;\u00ec\3\2\2\2=\u00ee\3\2\2\2?\u00f0\3\2"+
"\2\2A\u00f2\3\2\2\2C\u00f5\3\2\2\2E\u00f8\3\2\2\2G\u00fa\3\2\2\2I\u00fc"+
"/\u00de\3\2\2\2\61\u00e1\3\2\2\2\63\u00e4\3\2\2\2\65\u00e6\3\2\2\2\67"+
"\u00e8\3\2\2\29\u00ea\3\2\2\2;\u00ec\3\2\2\2=\u00ee\3\2\2\2?\u00f1\3\2"+
"\2\2A\u00f4\3\2\2\2C\u00f6\3\2\2\2E\u00f8\3\2\2\2G\u00fa\3\2\2\2I\u00fc"+
"\3\2\2\2K\u00ff\3\2\2\2M\u0102\3\2\2\2O\u0105\3\2\2\2Q\u0108\3\2\2\2S"+
"\u010b\3\2\2\2U\u010e\3\2\2\2W\u0111\3\2\2\2Y\u0113\3\2\2\2[\u0115\3\2"+
"\2\2]\u0118\3\2\2\2_\u011b\3\2\2\2a\u01f8\3\2\2\2c\u020d\3\2\2\2e\u020f"+
@ -224,14 +224,14 @@ public class KickCLexer extends Lexer {
"\u00d2\u00d3\7k\2\2\u00d3\u00d4\7i\2\2\u00d4\u00d5\7p\2\2\u00d5\u00d6"+
"\7g\2\2\u00d6\u00d7\7f\2\2\u00d7(\3\2\2\2\u00d8\u00d9\7,\2\2\u00d9*\3"+
"\2\2\2\u00da\u00db\7]\2\2\u00db,\3\2\2\2\u00dc\u00dd\7_\2\2\u00dd.\3\2"+
"\2\2\u00de\u00df\7>\2\2\u00df\60\3\2\2\2\u00e0\u00e1\7@\2\2\u00e1\62\3"+
"\2\2\2\u00e2\u00e3\7/\2\2\u00e3\u00e4\7/\2\2\u00e4\64\3\2\2\2\u00e5\u00e6"+
"\7-\2\2\u00e6\u00e7\7-\2\2\u00e7\66\3\2\2\2\u00e8\u00e9\7-\2\2\u00e98"+
"\3\2\2\2\u00ea\u00eb\7/\2\2\u00eb:\3\2\2\2\u00ec\u00ed\7#\2\2\u00ed<\3"+
"\2\2\2\u00ee\u00ef\7(\2\2\u00ef>\3\2\2\2\u00f0\u00f1\7\u0080\2\2\u00f1"+
"@\3\2\2\2\u00f2\u00f3\7@\2\2\u00f3\u00f4\7@\2\2\u00f4B\3\2\2\2\u00f5\u00f6"+
"\7>\2\2\u00f6\u00f7\7>\2\2\u00f7D\3\2\2\2\u00f8\u00f9\7\61\2\2\u00f9F"+
"\3\2\2\2\u00fa\u00fb\7\'\2\2\u00fbH\3\2\2\2\u00fc\u00fd\7?\2\2\u00fd\u00fe"+
"\2\2\u00de\u00df\7/\2\2\u00df\u00e0\7/\2\2\u00e0\60\3\2\2\2\u00e1\u00e2"+
"\7-\2\2\u00e2\u00e3\7-\2\2\u00e3\62\3\2\2\2\u00e4\u00e5\7-\2\2\u00e5\64"+
"\3\2\2\2\u00e6\u00e7\7/\2\2\u00e7\66\3\2\2\2\u00e8\u00e9\7#\2\2\u00e9"+
"8\3\2\2\2\u00ea\u00eb\7(\2\2\u00eb:\3\2\2\2\u00ec\u00ed\7\u0080\2\2\u00ed"+
"<\3\2\2\2\u00ee\u00ef\7@\2\2\u00ef\u00f0\7@\2\2\u00f0>\3\2\2\2\u00f1\u00f2"+
"\7>\2\2\u00f2\u00f3\7>\2\2\u00f3@\3\2\2\2\u00f4\u00f5\7\61\2\2\u00f5B"+
"\3\2\2\2\u00f6\u00f7\7\'\2\2\u00f7D\3\2\2\2\u00f8\u00f9\7>\2\2\u00f9F"+
"\3\2\2\2\u00fa\u00fb\7@\2\2\u00fbH\3\2\2\2\u00fc\u00fd\7?\2\2\u00fd\u00fe"+
"\7?\2\2\u00feJ\3\2\2\2\u00ff\u0100\7#\2\2\u0100\u0101\7?\2\2\u0101L\3"+
"\2\2\2\u0102\u0103\7>\2\2\u0103\u0104\7@\2\2\u0104N\3\2\2\2\u0105\u0106"+
"\7>\2\2\u0106\u0107\7?\2\2\u0107P\3\2\2\2\u0108\u0109\7?\2\2\u0109\u010a"+

View File

@ -86,19 +86,19 @@ COMMENT_BLOCK=66
'*'=20
'['=21
']'=22
'<'=23
'>'=24
'--'=25
'++'=26
'+'=27
'-'=28
'!'=29
'&'=30
'~'=31
'>>'=32
'<<'=33
'/'=34
'%'=35
'--'=23
'++'=24
'+'=25
'-'=26
'!'=27
'&'=28
'~'=29
'>>'=30
'<<'=31
'/'=32
'%'=33
'<'=34
'>'=35
'=='=36
'!='=37
'<>'=38

View File

@ -145,18 +145,6 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitStmtBlock(KickCParser.StmtBlockContext ctx);
/**
* Enter a parse tree produced by the {@code stmtAssignment}
* labeled alternative in {@link KickCParser#stmt}.
* @param ctx the parse tree
*/
void enterStmtAssignment(KickCParser.StmtAssignmentContext ctx);
/**
* Exit a parse tree produced by the {@code stmtAssignment}
* labeled alternative in {@link KickCParser#stmt}.
* @param ctx the parse tree
*/
void exitStmtAssignment(KickCParser.StmtAssignmentContext ctx);
/**
* Enter a parse tree produced by the {@code stmtExpr}
* labeled alternative in {@link KickCParser#stmt}.
@ -326,65 +314,17 @@ public interface KickCListener extends ParseTreeListener {
*/
void exitTypeSignedSimple(KickCParser.TypeSignedSimpleContext ctx);
/**
* Enter a parse tree produced by the {@code lvalueName}
* labeled alternative in {@link KickCParser#lvalue}.
* Enter a parse tree produced by the {@code exprPtr}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterLvalueName(KickCParser.LvalueNameContext ctx);
void enterExprPtr(KickCParser.ExprPtrContext ctx);
/**
* Exit a parse tree produced by the {@code lvalueName}
* labeled alternative in {@link KickCParser#lvalue}.
* Exit a parse tree produced by the {@code exprPtr}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitLvalueName(KickCParser.LvalueNameContext ctx);
/**
* Enter a parse tree produced by the {@code lvaluePtr}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void enterLvaluePtr(KickCParser.LvaluePtrContext ctx);
/**
* Exit a parse tree produced by the {@code lvaluePtr}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void exitLvaluePtr(KickCParser.LvaluePtrContext ctx);
/**
* Enter a parse tree produced by the {@code lvaluePtrExpr}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void enterLvaluePtrExpr(KickCParser.LvaluePtrExprContext ctx);
/**
* Exit a parse tree produced by the {@code lvaluePtrExpr}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void exitLvaluePtrExpr(KickCParser.LvaluePtrExprContext ctx);
/**
* Enter a parse tree produced by the {@code lvalueArray}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void enterLvalueArray(KickCParser.LvalueArrayContext ctx);
/**
* Exit a parse tree produced by the {@code lvalueArray}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void exitLvalueArray(KickCParser.LvalueArrayContext ctx);
/**
* Enter a parse tree produced by the {@code lvalueLoHi}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void enterLvalueLoHi(KickCParser.LvalueLoHiContext ctx);
/**
* Exit a parse tree produced by the {@code lvalueLoHi}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
*/
void exitLvalueLoHi(KickCParser.LvalueLoHiContext ctx);
void exitExprPtr(KickCParser.ExprPtrContext ctx);
/**
* Enter a parse tree produced by the {@code exprPreMod}
* labeled alternative in {@link KickCParser#expr}.
@ -541,6 +481,18 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitExprId(KickCParser.ExprIdContext ctx);
/**
* Enter a parse tree produced by the {@code exprAssignment}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprAssignment(KickCParser.ExprAssignmentContext ctx);
/**
* Exit a parse tree produced by the {@code exprAssignment}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprAssignment(KickCParser.ExprAssignmentContext ctx);
/**
* Enter a parse tree produced by the {@code exprArray}
* labeled alternative in {@link KickCParser#expr}.

File diff suppressed because it is too large Load Diff

View File

@ -92,13 +92,6 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitStmtBlock(KickCParser.StmtBlockContext ctx);
/**
* Visit a parse tree produced by the {@code stmtAssignment}
* labeled alternative in {@link KickCParser#stmt}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitStmtAssignment(KickCParser.StmtAssignmentContext ctx);
/**
* Visit a parse tree produced by the {@code stmtExpr}
* labeled alternative in {@link KickCParser#stmt}.
@ -198,40 +191,12 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
*/
T visitTypeSignedSimple(KickCParser.TypeSignedSimpleContext ctx);
/**
* Visit a parse tree produced by the {@code lvalueName}
* labeled alternative in {@link KickCParser#lvalue}.
* Visit a parse tree produced by the {@code exprPtr}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitLvalueName(KickCParser.LvalueNameContext ctx);
/**
* Visit a parse tree produced by the {@code lvaluePtr}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitLvaluePtr(KickCParser.LvaluePtrContext ctx);
/**
* Visit a parse tree produced by the {@code lvaluePtrExpr}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitLvaluePtrExpr(KickCParser.LvaluePtrExprContext ctx);
/**
* Visit a parse tree produced by the {@code lvalueArray}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitLvalueArray(KickCParser.LvalueArrayContext ctx);
/**
* Visit a parse tree produced by the {@code lvalueLoHi}
* labeled alternative in {@link KickCParser#lvalue}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitLvalueLoHi(KickCParser.LvalueLoHiContext ctx);
T visitExprPtr(KickCParser.ExprPtrContext ctx);
/**
* Visit a parse tree produced by the {@code exprPreMod}
* labeled alternative in {@link KickCParser#expr}.
@ -323,6 +288,13 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitExprId(KickCParser.ExprIdContext ctx);
/**
* Visit a parse tree produced by the {@code exprAssignment}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprAssignment(KickCParser.ExprAssignmentContext ctx);
/**
* Visit a parse tree produced by the {@code exprArray}
* labeled alternative in {@link KickCParser#expr}.

View File

@ -0,0 +1,32 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.*;
/**
* Asserts that all intermediate lvalues have been replaced by something else
*/
public class Pass1AssertNoLValueIntermediate extends Pass1Base {
public Pass1AssertNoLValueIntermediate(Program program) {
super(program);
}
@Override
public boolean executeStep() {
for (ControlFlowBlock block : getGraph().getAllBlocks()) {
for (Statement statement : block.getStatements()) {
if(statement instanceof StatementLValue) {
LValue lValue = ((StatementLValue) statement).getlValue();
if(lValue instanceof LvalueIntermediate) {
VariableRef intermediateVar = ((LvalueIntermediate) lValue).getVariable();
StatementAssignment assignment = getGraph().getAssignment(intermediateVar);
throw new CompileError("Error! LValue is illegal. "+statement+" - definition of lValue "+assignment);
}
}
}
}
return false;
}
}

View File

@ -0,0 +1,65 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.*;
import java.util.List;
import java.util.ListIterator;
/**
* Replaces all LValue intermediate lo/hi-assignments with a separate assignment to the modified variable.
* <br>Example: <code>&lt;plotter = x &amp; 8 </code>
* <br>Becomes: <code> $1 =x &amp; 8 , plotter = plotter lo= $1 </code>
*/
public class Pass1FixLValuesLoHi extends Pass1Base {
public Pass1FixLValuesLoHi(Program program) {
super(program);
}
@Override
boolean executeStep() {
ProgramScope programScope = getProgram().getScope();
for (ControlFlowBlock block : getProgram().getGraph().getAllBlocks()) {
List<Statement> statements = block.getStatements();
ListIterator<Statement> statementsIt = statements.listIterator();
while (statementsIt.hasNext()) {
Statement statement = statementsIt.next();
if (statement instanceof StatementLValue && ((StatementLValue) statement).getlValue() instanceof LvalueIntermediate) {
StatementLValue statementLValue = (StatementLValue) statement;
LvalueIntermediate intermediate = (LvalueIntermediate) statementLValue.getlValue();
StatementAssignment intermediateAssignment = getProgram().getGraph().getAssignment(intermediate.getVariable());
if (Operator.LOWBYTE.equals(intermediateAssignment.getOperator()) && intermediateAssignment.getrValue1() == null) {
// Found assignment to an intermediate low byte lValue <x = ...
fixLoHiLValue(programScope, statementsIt, statementLValue, intermediate, intermediateAssignment, Operator.SET_LOWBYTE);
} else if (Operator.HIBYTE.equals(intermediateAssignment.getOperator()) && intermediateAssignment.getrValue1() == null) {
// Found assignment to an intermediate low byte lValue >x = ...
fixLoHiLValue(programScope, statementsIt, statementLValue, intermediate, intermediateAssignment, Operator.SET_HIBYTE);
}
}
}
}
return false;
}
private void fixLoHiLValue(
ProgramScope programScope,
ListIterator<Statement> statementsIt,
StatementLValue statementLValue,
LvalueIntermediate intermediate,
StatementAssignment intermediateAssignment,
Operator loHiOperator) {
VariableRef loHiVar = (VariableRef) intermediateAssignment.getrValue2();
Variable intermediateVar = programScope.getVariable(intermediate.getVariable());
Scope currentScope = intermediateVar.getScope();
// Let assignment put value into a tmp Var
VariableIntermediate tmpVar = currentScope.addVariableIntermediate();
VariableRef tmpVarRef = tmpVar.getRef();
statementLValue.setlValue(tmpVarRef);
SymbolTypeInference.inferLValue(programScope, statementLValue);
// Insert an extra "set low" assignment statement
Statement setLoHiAssignment = new StatementAssignment(loHiVar, loHiVar, loHiOperator, tmpVarRef);
statementsIt.add(setLoHiAssignment);
getLog().append("Fixing lo/hi-lvalue with new tmpVar " + tmpVarRef + " " + statementLValue.toString());
}
}

View File

@ -1,60 +0,0 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.*;
import java.util.Stack;
/**
* Replaces all LValueLoHi with a separate assignment to the modified variable.
* <br>Example: <code>&lt;plotter = x &amp; 8 </code>
* <br>Becomes: <code> $1 =x &amp; 8 , plotter = plotter lo= $1 </code>
*/
public class Pass1FixLvalueLoHi extends Pass1Base {
public Pass1FixLvalueLoHi(Program program) {
super(program);
}
@Override
boolean executeStep() {
Stack<Scope> scopeStack = new Stack<>();
scopeStack.push(getScope());
StatementSequence fixedSequence = new StatementSequence();
for (Statement statement : getProgram().getStatementSequence().getStatements()) {
if (statement instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statement;
if (assignment.getlValue() instanceof LvalueLoHiByte) {
LvalueLoHiByte loHiByte = (LvalueLoHiByte) assignment.getlValue();
if (assignment.getOperator() != null || assignment.getrValue1()!=null) {
Scope currentScope = scopeStack.peek();
VariableIntermediate tmpVar = currentScope.addVariableIntermediate();
VariableRef tmpVarRef = tmpVar.getRef();
Statement tmpAssignment = new StatementAssignment(tmpVarRef, assignment.getrValue1(), assignment.getOperator(), assignment.getrValue2());
fixedSequence.addStatement(tmpAssignment);
Statement setLoHiAssignment = new StatementAssignment(loHiByte.getVariable(), loHiByte.getVariable(), loHiByte.getOperator(), tmpVarRef);
fixedSequence.addStatement(setLoHiAssignment);
getLog().append("Fixing lo/hi-lvalue with new tmpVar " + tmpVarRef + " " + assignment.toString());
} else {
Statement setLoHiAssignment = new StatementAssignment(loHiByte.getVariable(), loHiByte.getVariable(), loHiByte.getOperator(), assignment.getrValue2());
fixedSequence.addStatement(setLoHiAssignment);
getLog().append("Fixing lo/hi-lvalue " + assignment.toString());
}
} else {
fixedSequence.addStatement(statement);
}
} else {
fixedSequence.addStatement(statement);
}
if (statement instanceof StatementProcedureBegin) {
ProcedureRef procedureRef = ((StatementProcedureBegin) statement).getProcedure();
Procedure procedure = getScope().getProcedure(procedureRef);
scopeStack.push(procedure);
} else if (statement instanceof StatementProcedureEnd) {
scopeStack.pop();
}
}
getProgram().setStatementSequence(fixedSequence);
return false;
}
}

View File

@ -29,27 +29,9 @@ public class Pass1TypeInference extends Pass1Base {
scopes.pop();
} else if (statement instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statement;
LValue lValue = assignment.getlValue();
if (lValue instanceof VariableRef) {
Variable symbol = programScope.getVariable((VariableRef) lValue);
if (SymbolType.VAR.equals(symbol.getType())) {
// Unresolved symbol - perform inference
Operator operator = assignment.getOperator();
if (operator == null || assignment.getrValue1() == null) {
// Copy operation or Unary operation
RValue rValue = assignment.getrValue2();
SymbolType type = SymbolTypeInference.inferType(programScope, operator, rValue);
symbol.setTypeInferred(type);
} else {
// Binary operation
SymbolType type = SymbolTypeInference.inferType(programScope, assignment.getrValue1(), assignment.getOperator(), assignment.getrValue2());
symbol.setTypeInferred(type);
}
}
}
SymbolTypeInference.inferAssignmentLValue(programScope, assignment);
} else if(statement instanceof StatementCall) {
StatementCall call = (StatementCall) statement;
LValue lValue = call.getlValue();
String procedureName = call.getProcedureName();
Procedure procedure = scopes.peek().getProcedure(procedureName);
if(procedure==null) {
@ -59,10 +41,7 @@ public class Pass1TypeInference extends Pass1Base {
if(procedure.getParameters().size()!=call.getParameters().size()) {
throw new CompileError("Wrong number of parameters in call. Expected " +procedure.getParameters().size()+". "+statement.toString());
}
if(lValue instanceof VariableRef) {
Variable lValueVar = programScope.getVariable((VariableRef) lValue);
lValueVar.setTypeInferred(procedure.getReturnType());
}
SymbolTypeInference.inferCallLValue(programScope, (StatementCall) statement);
}
}
return false;

View File

@ -39,8 +39,15 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
if (statement instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statement;
if(assignment.getlValue() instanceof PointerDereferenceIndexed) {
optimized |= optimizePointerDereferenceIndexed(assignment);
optimized |= optimizePointerDereferenceIndexed(new VariableReplacer.ReplacableLValue(assignment));
}
if(assignment.getrValue1() instanceof PointerDereferenceIndexed) {
optimized |= optimizePointerDereferenceIndexed(new VariableReplacer.ReplacableRValue1(assignment));
}
if(assignment.getrValue2() instanceof PointerDereferenceIndexed) {
optimized |= optimizePointerDereferenceIndexed(new VariableReplacer.ReplacableRValue2(assignment));
}
Operator operator = assignment.getOperator();
if (operator != null) {
switch (operator.getOperator()) {
@ -52,20 +59,28 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
break;
}
}
} else if(statement instanceof StatementConditionalJump) {
StatementConditionalJump jump = (StatementConditionalJump) statement;
if(jump.getrValue1() instanceof PointerDereferenceIndexed) {
optimized |= optimizePointerDereferenceIndexed(new VariableReplacer.ReplacableCondRValue1(jump));
}
if(jump.getrValue2() instanceof PointerDereferenceIndexed) {
optimized |= optimizePointerDereferenceIndexed(new VariableReplacer.ReplacableCondRValue2(jump));
}
}
}
}
return optimized;
}
private boolean optimizePointerDereferenceIndexed(StatementAssignment assignment) {
PointerDereferenceIndexed pointerDereferenceIndexed = (PointerDereferenceIndexed) assignment.getlValue();
private boolean optimizePointerDereferenceIndexed(VariableReplacer.ReplacableValue value) {
PointerDereferenceIndexed pointerDereferenceIndexed = (PointerDereferenceIndexed) value.get();
if(pointerDereferenceIndexed.getPointer() instanceof ConstantValue && pointerDereferenceIndexed.getIndex() instanceof ConstantValue) {
ConstantValue ptrConstant = (ConstantValue) pointerDereferenceIndexed.getPointer();
ConstantValue idxConstant = (ConstantValue) pointerDereferenceIndexed.getIndex();
ConstantValue newPtr = new ConstantBinary(ptrConstant, Operator.PLUS, idxConstant);
assignment.setlValue(new PointerDereferenceSimple(newPtr));
getLog().append("Consolidated assigned array index constant in assignment " + assignment.getlValue());
value.set(new PointerDereferenceSimple(newPtr));
getLog().append("Consolidated array index constant in " + value.get().toString());
return true;
}
if(pointerDereferenceIndexed.getPointer() instanceof ConstantValue && pointerDereferenceIndexed.getIndex() instanceof VariableRef) {
@ -75,7 +90,7 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
ConstantValue ptrConstant = (ConstantValue) pointerDereferenceIndexed.getPointer();
ConstantValue newPtr = new ConstantBinary(ptrConstant, Operator.PLUS, consolidated);
pointerDereferenceIndexed.setPointer(newPtr);
getLog().append("Consolidated assigned array index constant in assignment " + assignment.getlValue());
getLog().append("Consolidated array index constant in assignment " + value.get().toString());
return true;
}
}

View File

@ -396,58 +396,6 @@ public class StatementSequenceGenerator extends KickCBaseVisitor<Object> {
PrePostModifierHandler.addPostModifiers(this, initializer);
}
@Override
public Void visitStmtAssignment(KickCParser.StmtAssignmentContext ctx) {
PrePostModifierHandler.addPreModifiers(this, ctx);
LValue lValue = (LValue) visit(ctx.lvalue());
RValue rValue = (RValue) this.visit(ctx.expr());
Statement stmt = new StatementAssignment(lValue, rValue);
sequence.addStatement(stmt);
PrePostModifierHandler.addPostModifiers(this, ctx);
return null;
}
@Override
public LValue visitLvalueName(KickCParser.LvalueNameContext ctx) {
Variable variable = getCurrentSymbols().getVariable(ctx.NAME().getText());
return variable.getRef();
}
@Override
public LValue visitLvaluePtr(KickCParser.LvaluePtrContext ctx) {
Variable variable = getCurrentSymbols().getVariable(ctx.NAME().getText());
return new PointerDereferenceSimple(variable.getRef());
}
@Override
public Object visitLvaluePtrExpr(KickCParser.LvaluePtrExprContext ctx) {
RValue rValue = (RValue) this.visit(ctx.expr());
return new PointerDereferenceSimple(rValue);
}
@Override
public Object visitLvalueLoHi(KickCParser.LvalueLoHiContext ctx) {
LValue lval = (LValue) visit(ctx.lvalue());
if (lval instanceof VariableRef) {
String opTxt = ctx.getChild(0).getText();
if (opTxt.equals("<")) {
return new LvalueLoHiByte(Operator.SET_LOWBYTE, (VariableRef) lval);
} else if (opTxt.equals(">")) {
return new LvalueLoHiByte(Operator.SET_HIBYTE, (VariableRef) lval);
} else {
throw new RuntimeException("Not implemented - lo/hi-lvalue operator " + opTxt);
}
}
throw new RuntimeException("Not implemented - lo/hi lvalues of non-variables");
}
@Override
public LValue visitLvalueArray(KickCParser.LvalueArrayContext ctx) {
LValue lval = (LValue) visit(ctx.lvalue());
RValue index = (RValue) visit(ctx.expr());
return new PointerDereferenceIndexed(lval, index);
}
@Override
public RValue visitInitList(KickCParser.InitListContext ctx) {
List<RValue> initValues = new ArrayList<>();
@ -489,6 +437,19 @@ public class StatementSequenceGenerator extends KickCBaseVisitor<Object> {
}
}
@Override
public Object visitExprAssignment(KickCParser.ExprAssignmentContext ctx) {
LValue lValue = (LValue) visit(ctx.expr(0));
if(lValue instanceof VariableRef && ((VariableRef) lValue).isIntermediate()) {
// Encountered an intermediate variable. This must be turned into a proper LValue later. Put it into a marker to signify that
lValue = new LvalueIntermediate((VariableRef) lValue);
}
RValue rValue = (RValue) this.visit(ctx.expr(1));
Statement stmt = new StatementAssignment(lValue, rValue);
sequence.addStatement(stmt);
return lValue;
}
@Override
public RValue visitExprCast(KickCParser.ExprCastContext ctx) {
RValue child = (RValue) this.visit(ctx.expr());
@ -530,12 +491,7 @@ public class StatementSequenceGenerator extends KickCBaseVisitor<Object> {
public RValue visitExprArray(KickCParser.ExprArrayContext ctx) {
RValue array = (LValue) visit(ctx.expr(0));
RValue index = (RValue) visit(ctx.expr(1));
Operator operator = Operator.DEREF_IDX;
VariableIntermediate tmpVar = getCurrentSymbols().addVariableIntermediate();
VariableRef tmpVarRef = tmpVar.getRef();
Statement stmt = new StatementAssignment(tmpVarRef, array, operator, index);
sequence.addStatement(stmt);
return tmpVarRef;
return new PointerDereferenceIndexed(array, index);
}
@Override
@ -578,20 +534,22 @@ public class StatementSequenceGenerator extends KickCBaseVisitor<Object> {
return tmpVarRef;
}
@Override
public Object visitExprPtr(KickCParser.ExprPtrContext ctx) {
RValue child = (RValue) this.visit(ctx.expr());
return new PointerDereferenceSimple(child);
}
@Override
public RValue visitExprUnary(KickCParser.ExprUnaryContext ctx) {
RValue child = (RValue) this.visit(ctx.expr());
String op = ((TerminalNode) ctx.getChild(0)).getSymbol().getText();
Operator operator = Operator.getUnary(op);
if (Operator.DEREF.equals(operator)) {
return new PointerDereferenceSimple(child);
} else {
VariableIntermediate tmpVar = getCurrentSymbols().addVariableIntermediate();
VariableRef tmpVarRef = tmpVar.getRef();
Statement stmt = new StatementAssignment(tmpVarRef, operator, child);
sequence.addStatement(stmt);
return tmpVarRef;
}
VariableIntermediate tmpVar = getCurrentSymbols().addVariableIntermediate();
VariableRef tmpVarRef = tmpVar.getRef();
Statement stmt = new StatementAssignment(tmpVarRef, operator, child);
sequence.addStatement(stmt);
return tmpVarRef;
}
@Override

View File

@ -28,10 +28,6 @@ public class TestErrors extends TestCase {
compileAndCompare("nocast");
}
public void testConstants() throws IOException, URISyntaxException {
compileAndCompare("constants");
}
public void testInlineAsmParam() throws IOException, URISyntaxException {
compileAndCompare("inline-asm-param");
}
@ -41,11 +37,6 @@ public class TestErrors extends TestCase {
compileAndCompare(filename);
}
public void testForIncrementAssign() throws IOException, URISyntaxException {
String filename = "forincrementassign";
compileAndCompare(filename);
}
private void compileAndCompare(String filename) throws IOException, URISyntaxException {
TestErrors tester = new TestErrors();
tester.testFile(filename);

View File

@ -22,6 +22,18 @@ public class TestPrograms extends TestCase {
helper = new ReferenceHelper("dk/camelot64/kickc/test/ref/");
}
public void testForIncrementAssign() throws IOException, URISyntaxException {
compileAndCompare("forincrementassign");
}
public void testConstants() throws IOException, URISyntaxException {
compileAndCompare("constants");
}
public void testInlineAssignment() throws IOException, URISyntaxException {
compileAndCompare("inline-assignment");
}
public void testInlineWord() throws IOException, URISyntaxException {
compileAndCompare("inline-word");
}
@ -307,6 +319,10 @@ public class TestPrograms extends TestCase {
assertError("procedurenotfound", "Called procedure not found");
}
public void testIllegalLValue() throws IOException, URISyntaxException {
assertError("illegallvalue", "LValue is illegal");
}
private void assertError(String kcFile, String expectError) throws IOException, URISyntaxException {
try {
compileAndCompare(kcFile);

View File

@ -1,3 +1,4 @@
import "print.kc"
const byte* BGCOL = $d021;
const byte GREEN = 5;
const byte RED = 2 ;
@ -56,28 +57,3 @@ void assert_sbyte(byte* msg, signed byte b, signed byte c) {
}
print_ln();
}
byte* line_cursor = $0400;
byte* char_cursor = line_cursor;
// Print a zero-terminated string
void print_str(byte* str) {
while(*str!='@') {
*(char_cursor++) = *(str++);
}
}
// Print a newline
void print_ln() {
do {
line_cursor = line_cursor + $28;
} while (line_cursor<char_cursor);
char_cursor = line_cursor;
}
// Clear the screen
void print_cls() {
for(byte* sc=$0400; sc!=$0400+1000; sc++) {
*sc = ' ';
}
}

View File

@ -1,4 +1,4 @@
// Classic for() does not allow assignment as increment, eg. for(byte i=0;i<25;i=i+2) {}
// Classic for() does not allow assignment as increment, eg. for(byte i=0;i<40;i=i+2) {}
// The following should give a program rendering a char on every second char of the first line - but results in a syntax error
byte* SCREEN = $0400;

View File

@ -0,0 +1,5 @@
void main() {
byte q=0;
q+1=1;
}

View File

@ -0,0 +1,9 @@
const byte* SCREEN = $400;
void main() {
byte a;
for( byte i : 0..39) {
SCREEN[i] = a = i;
(SCREEN+80)[i] = a;
}
}

View File

@ -1,8 +1,8 @@
const byte* SCREEN = $400;
void main() {
byte[] his = { >SCREEN, >SCREEN+$100 };
for( byte h: 0..1) {
byte[] his = { >SCREEN, >SCREEN+$100, >SCREEN+$200 };
for( byte h: 0..2) {
for (byte l: 4..7) {
word w = { his[h], l };
byte* sc = (byte*)w;

View File

@ -36,3 +36,11 @@ void print_char(byte ch) {
*(char_cursor++) = ch;
}
// Clear the screen
void print_cls() {
for(byte* sc=$0400; sc!=$0400+1000; sc++) {
*sc = ' ';
}
}

View File

@ -222,8 +222,7 @@ line_ydxi: {
rts
}
plot: {
.label _2 = $a
.label _4 = 8
.label _0 = 8
.label plotter_x = 8
.label plotter_y = $b
.label plotter = 8
@ -232,21 +231,19 @@ plot: {
lda plot_xlo,x
sta plotter_x
lda plot_yhi,y
sta _2
sta plotter_y+1
lda plot_ylo,y
sta plotter_y
lda _2
sta plotter_y+1
lda _4
lda _0
clc
adc plotter_y
sta _4
lda _4+1
sta _0
lda _0+1
adc plotter_y+1
sta _4+1
lda plot_bit,x
sta _0+1
ldy #0
ora (plotter),y
lda (plotter),y
ora plot_bit,x
sta (plotter),y
rts
}

View File

@ -33,10 +33,10 @@ lines: scope:[lines] from main::@1
to:lines::@1
lines::@1: scope:[lines] from lines lines::@3
[16] (byte) lines::l#2 ← phi( lines/(byte/signed byte/word/signed word) 0 lines::@3/(byte) lines::l#1 ) [ lines::l#2 ] ( main:2::lines:12 [ lines::l#2 ] )
[17] (byte) line::x0#0 ← (const byte[]) lines_x#0 *idx (byte) lines::l#2 [ lines::l#2 line::x0#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 ] )
[18] (byte) line::x1#0 ← (const byte[]) lines_x#0+(byte/signed byte/word/signed word) 1 *idx (byte) lines::l#2 [ lines::l#2 line::x0#0 line::x1#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 line::x1#0 ] )
[19] (byte) line::y0#0 ← (const byte[]) lines_y#0 *idx (byte) lines::l#2 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 ] )
[20] (byte) line::y1#0 ← (const byte[]) lines_y#0+(byte/signed byte/word/signed word) 1 *idx (byte) lines::l#2 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 ] )
[17] (byte) line::x0#0 ← *((const byte[]) lines_x#0 + (byte) lines::l#2) [ lines::l#2 line::x0#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 ] )
[18] (byte) line::x1#0 ← *((const byte[]) lines_x#0+(byte/signed byte/word/signed word) 1 + (byte) lines::l#2) [ lines::l#2 line::x0#0 line::x1#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 line::x1#0 ] )
[19] (byte) line::y0#0 ← *((const byte[]) lines_y#0 + (byte) lines::l#2) [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 ] )
[20] (byte) line::y1#0 ← *((const byte[]) lines_y#0+(byte/signed byte/word/signed word) 1 + (byte) lines::l#2) [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 ] ( main:2::lines:12 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 ] )
[21] call line param-assignment [ lines::l#2 ] ( main:2::lines:12 [ lines::l#2 ] )
to:lines::@3
lines::@3: scope:[lines] from lines::@1
@ -175,184 +175,179 @@ line_ydxi::@return: scope:[line_ydxi] from line_ydxi::@2
[101] return [ ] ( main:2::lines:12::line:21::line_ydxi:42 [ lines::l#2 ] main:2::lines:12::line:21::line_ydxi:86 [ lines::l#2 ] )
to:@return
plot: scope:[plot] from line_xdyd::@1 line_xdyi::@1 line_ydxd::@1 line_ydxi::@1
[102] (byte) plot::y#4 ← phi( line_xdyd::@1/(byte) plot::y#1 line_xdyi::@1/(byte) plot::y#0 line_ydxd::@1/(byte) plot::y#3 line_ydxi::@1/(byte) plot::y#2 ) [ plot::x#4 plot::y#4 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] )
[102] (byte) plot::x#4 ← phi( line_xdyd::@1/(byte) plot::x#1 line_xdyi::@1/(byte) plot::x#0 line_ydxd::@1/(byte) plot::x#3 line_ydxi::@1/(byte) plot::x#2 ) [ plot::x#4 plot::y#4 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] )
[103] (byte~) plot::$0 ← (const byte[]) plot_xhi#0 *idx (byte) plot::x#4 [ plot::x#4 plot::y#4 plot::$0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::$0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::$0 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::$0 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::$0 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::$0 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::$0 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::$0 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::$0 ] )
[104] (byte~) plot::$1 ← (const byte[]) plot_xlo#0 *idx (byte) plot::x#4 [ plot::x#4 plot::y#4 plot::$0 plot::$1 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::$0 plot::$1 ] )
[105] (word) plot::plotter_x#0 ← (byte~) plot::$0 w= (byte~) plot::$1 [ plot::x#4 plot::y#4 plot::plotter_x#0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] )
[106] (byte~) plot::$2 ← (const byte[]) plot_yhi#0 *idx (byte) plot::y#4 [ plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 plot::$2 ] )
[107] (byte~) plot::$3 ← (const byte[]) plot_ylo#0 *idx (byte) plot::y#4 [ plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter_x#0 plot::$2 plot::$3 ] )
[108] (word) plot::plotter_y#0 ← (byte~) plot::$2 w= (byte~) plot::$3 [ plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] )
[109] (word~) plot::$4 ← (word) plot::plotter_x#0 + (word) plot::plotter_y#0 [ plot::x#4 plot::$4 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::$4 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::$4 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::$4 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::$4 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::$4 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::$4 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::$4 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::$4 ] )
[110] (byte*) plot::plotter#0 ← ((byte*)) (word~) plot::$4 [ plot::x#4 plot::plotter#0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter#0 ] )
[111] (byte~) plot::$5 ← (const byte[]) plot_bit#0 *idx (byte) plot::x#4 [ plot::plotter#0 plot::$5 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::plotter#0 plot::$5 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::plotter#0 plot::$5 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::plotter#0 plot::$5 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::plotter#0 plot::$5 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::plotter#0 plot::$5 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::plotter#0 plot::$5 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::plotter#0 plot::$5 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::plotter#0 plot::$5 ] )
[112] (byte~) plot::$6 ← *((byte*) plot::plotter#0) | (byte~) plot::$5 [ plot::plotter#0 plot::$6 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::plotter#0 plot::$6 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::plotter#0 plot::$6 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::plotter#0 plot::$6 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::plotter#0 plot::$6 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::plotter#0 plot::$6 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::plotter#0 plot::$6 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::plotter#0 plot::$6 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::plotter#0 plot::$6 ] )
[113] *((byte*) plot::plotter#0) ← (byte~) plot::$6 [ ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[102] (byte) plot::y#4 ← phi( line_xdyd::@1/(byte) plot::y#1 line_xdyi::@1/(byte) plot::y#0 line_ydxd::@1/(byte) plot::y#3 line_ydxi::@1/(byte) plot::y#2 ) [ plot::x#4 plot::y#4 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] )
[102] (byte) plot::x#4 ← phi( line_xdyd::@1/(byte) plot::x#1 line_xdyi::@1/(byte) plot::x#0 line_ydxd::@1/(byte) plot::x#3 line_ydxi::@1/(byte) plot::x#2 ) [ plot::x#4 plot::y#4 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 ] )
[103] (word) plot::plotter_x#0 ← *((const byte[]) plot_xhi#0 + (byte) plot::x#4) w= *((const byte[]) plot_xlo#0 + (byte) plot::x#4) [ plot::x#4 plot::y#4 plot::plotter_x#0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::y#4 plot::plotter_x#0 ] )
[104] (word) plot::plotter_y#0 ← *((const byte[]) plot_yhi#0 + (byte) plot::y#4) w= *((const byte[]) plot_ylo#0 + (byte) plot::y#4) [ plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter_x#0 plot::plotter_y#0 ] )
[105] (word~) plot::$0 ← (word) plot::plotter_x#0 + (word) plot::plotter_y#0 [ plot::x#4 plot::$0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::$0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::$0 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::$0 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::$0 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::$0 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::$0 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::$0 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::$0 ] )
[106] (byte*) plot::plotter#0 ← ((byte*)) (word~) plot::$0 [ plot::x#4 plot::plotter#0 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter#0 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::x#4 plot::plotter#0 ] )
[107] (byte~) plot::$1 ← *((byte*) plot::plotter#0) | *((const byte[]) plot_bit#0 + (byte) plot::x#4) [ plot::plotter#0 plot::$1 ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::plotter#0 plot::$1 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 plot::plotter#0 plot::$1 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::plotter#0 plot::$1 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 plot::plotter#0 plot::$1 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::plotter#0 plot::$1 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 plot::plotter#0 plot::$1 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::plotter#0 plot::$1 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 plot::plotter#0 plot::$1 ] )
[108] *((byte*) plot::plotter#0) ← (byte~) plot::$1 [ ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
to:plot::@return
plot::@return: scope:[plot] from plot
[114] return [ ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_xdyi:35::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80::plot:120 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_ydxd:56::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72::plot:135 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_xdyd:50::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66::plot:150 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[109] return [ ] ( main:2::lines:12::line:21::line_ydxi:42::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_ydxi:86::plot:92 [ lines::l#2 line_ydxi::xd#2 line_ydxi::yd#5 line_ydxi::y1#6 line_ydxi::x#3 line_ydxi::y#3 line_ydxi::e#3 ] main:2::lines:12::line:21::line_xdyi:35::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80::plot:115 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_ydxd:56::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72::plot:130 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_xdyd:50::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66::plot:145 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
to:@return
line_xdyi: scope:[line_xdyi] from line::@17 line::@27
[115] (byte) line_xdyi::x1#6 ← phi( line::@17/(byte) line_xdyi::x1#0 line::@27/(byte) line_xdyi::x1#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[115] (byte) line_xdyi::xd#5 ← phi( line::@17/(byte) line_xdyi::xd#0 line::@27/(byte) line_xdyi::xd#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[115] (byte) line_xdyi::y#5 ← phi( line::@17/(byte) line_xdyi::y#0 line::@27/(byte) line_xdyi::y#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[115] (byte) line_xdyi::x#6 ← phi( line::@17/(byte) line_xdyi::x#0 line::@27/(byte) line_xdyi::x#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[115] (byte) line_xdyi::yd#2 ← phi( line::@17/(byte) line_xdyi::yd#0 line::@27/(byte) line_xdyi::yd#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[116] (byte) line_xdyi::e#0 ← (byte) line_xdyi::yd#2 >> (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::e#0 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::e#0 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::e#0 ] )
[110] (byte) line_xdyi::x1#6 ← phi( line::@17/(byte) line_xdyi::x1#0 line::@27/(byte) line_xdyi::x1#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[110] (byte) line_xdyi::xd#5 ← phi( line::@17/(byte) line_xdyi::xd#0 line::@27/(byte) line_xdyi::xd#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[110] (byte) line_xdyi::y#5 ← phi( line::@17/(byte) line_xdyi::y#0 line::@27/(byte) line_xdyi::y#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[110] (byte) line_xdyi::x#6 ← phi( line::@17/(byte) line_xdyi::x#0 line::@27/(byte) line_xdyi::x#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[110] (byte) line_xdyi::yd#2 ← phi( line::@17/(byte) line_xdyi::yd#0 line::@27/(byte) line_xdyi::yd#1 ) [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 ] )
[111] (byte) line_xdyi::e#0 ← (byte) line_xdyi::yd#2 >> (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::e#0 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::e#0 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::x#6 line_xdyi::y#5 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::e#0 ] )
to:line_xdyi::@1
line_xdyi::@1: scope:[line_xdyi] from line_xdyi line_xdyi::@2
[117] (byte) line_xdyi::e#3 ← phi( line_xdyi/(byte) line_xdyi::e#0 line_xdyi::@2/(byte) line_xdyi::e#6 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[117] (byte) line_xdyi::y#3 ← phi( line_xdyi/(byte) line_xdyi::y#5 line_xdyi::@2/(byte) line_xdyi::y#6 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[117] (byte) line_xdyi::x#3 ← phi( line_xdyi/(byte) line_xdyi::x#6 line_xdyi::@2/(byte) line_xdyi::x#2 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[118] (byte) plot::x#0 ← (byte) line_xdyi::x#3 [ plot::x#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 plot::x#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 plot::x#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[119] (byte) plot::y#0 ← (byte) line_xdyi::y#3 [ plot::x#0 plot::y#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 plot::x#0 plot::y#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 plot::x#0 plot::y#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[120] call plot param-assignment [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[112] (byte) line_xdyi::e#3 ← phi( line_xdyi/(byte) line_xdyi::e#0 line_xdyi::@2/(byte) line_xdyi::e#6 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[112] (byte) line_xdyi::y#3 ← phi( line_xdyi/(byte) line_xdyi::y#5 line_xdyi::@2/(byte) line_xdyi::y#6 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[112] (byte) line_xdyi::x#3 ← phi( line_xdyi/(byte) line_xdyi::x#6 line_xdyi::@2/(byte) line_xdyi::x#2 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[113] (byte) plot::x#0 ← (byte) line_xdyi::x#3 [ plot::x#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 plot::x#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 plot::x#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[114] (byte) plot::y#0 ← (byte) line_xdyi::y#3 [ plot::x#0 plot::y#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 plot::x#0 plot::y#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 plot::x#0 plot::y#0 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
[115] call plot param-assignment [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#3 line_xdyi::y#3 line_xdyi::e#3 ] )
to:line_xdyi::@5
line_xdyi::@5: scope:[line_xdyi] from line_xdyi::@1
[121] (byte) line_xdyi::x#2 ← (byte) line_xdyi::x#3 + (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::e#3 line_xdyi::x#2 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::e#3 line_xdyi::x#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::e#3 line_xdyi::x#2 ] )
[122] (byte) line_xdyi::e#1 ← (byte) line_xdyi::e#3 + (byte) line_xdyi::yd#2 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] )
[123] if((byte) line_xdyi::xd#5>=(byte) line_xdyi::e#1) goto line_xdyi::@2 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] )
[116] (byte) line_xdyi::x#2 ← (byte) line_xdyi::x#3 + (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::e#3 line_xdyi::x#2 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::e#3 line_xdyi::x#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::e#3 line_xdyi::x#2 ] )
[117] (byte) line_xdyi::e#1 ← (byte) line_xdyi::e#3 + (byte) line_xdyi::yd#2 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] )
[118] if((byte) line_xdyi::xd#5>=(byte) line_xdyi::e#1) goto line_xdyi::@2 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::y#3 line_xdyi::x#2 line_xdyi::e#1 ] )
to:line_xdyi::@3
line_xdyi::@3: scope:[line_xdyi] from line_xdyi::@5
[124] (byte) line_xdyi::y#2 ← (byte) line_xdyi::y#3 + (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::e#1 line_xdyi::y#2 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::e#1 line_xdyi::y#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::e#1 line_xdyi::y#2 ] )
[125] (byte) line_xdyi::e#2 ← (byte) line_xdyi::e#1 - (byte) line_xdyi::xd#5 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#2 line_xdyi::e#2 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#2 line_xdyi::e#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#2 line_xdyi::e#2 ] )
[119] (byte) line_xdyi::y#2 ← (byte) line_xdyi::y#3 + (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::e#1 line_xdyi::y#2 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::e#1 line_xdyi::y#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::e#1 line_xdyi::y#2 ] )
[120] (byte) line_xdyi::e#2 ← (byte) line_xdyi::e#1 - (byte) line_xdyi::xd#5 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#2 line_xdyi::e#2 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#2 line_xdyi::e#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#2 line_xdyi::e#2 ] )
to:line_xdyi::@2
line_xdyi::@2: scope:[line_xdyi] from line_xdyi::@3 line_xdyi::@5
[126] (byte) line_xdyi::e#6 ← phi( line_xdyi::@3/(byte) line_xdyi::e#2 line_xdyi::@5/(byte) line_xdyi::e#1 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] )
[126] (byte) line_xdyi::y#6 ← phi( line_xdyi::@3/(byte) line_xdyi::y#2 line_xdyi::@5/(byte) line_xdyi::y#3 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] )
[127] (byte~) line_xdyi::$8 ← (byte) line_xdyi::x1#6 + (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$8 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$8 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$8 ] )
[128] if((byte) line_xdyi::x#2<(byte~) line_xdyi::$8) goto line_xdyi::@1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] )
[121] (byte) line_xdyi::e#6 ← phi( line_xdyi::@3/(byte) line_xdyi::e#2 line_xdyi::@5/(byte) line_xdyi::e#1 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] )
[121] (byte) line_xdyi::y#6 ← phi( line_xdyi::@3/(byte) line_xdyi::y#2 line_xdyi::@5/(byte) line_xdyi::y#3 ) [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] )
[122] (byte~) line_xdyi::$8 ← (byte) line_xdyi::x1#6 + (byte/signed byte/word/signed word) 1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$8 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$8 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 line_xdyi::$8 ] )
[123] if((byte) line_xdyi::x#2<(byte~) line_xdyi::$8) goto line_xdyi::@1 [ line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 line_xdyi::yd#2 line_xdyi::xd#5 line_xdyi::x1#6 line_xdyi::x#2 line_xdyi::y#6 line_xdyi::e#6 ] )
to:line_xdyi::@return
line_xdyi::@return: scope:[line_xdyi] from line_xdyi::@2
[129] return [ ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 ] )
[124] return [ ] ( main:2::lines:12::line:21::line_xdyi:35 [ lines::l#2 ] main:2::lines:12::line:21::line_xdyi:80 [ lines::l#2 ] )
to:@return
line_ydxd: scope:[line_ydxd] from line::@10 line::@6
[130] (byte) line_ydxd::y1#6 ← phi( line::@10/(byte) line_ydxd::y1#1 line::@6/(byte) line_ydxd::y1#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[130] (byte) line_ydxd::yd#5 ← phi( line::@10/(byte) line_ydxd::yd#1 line::@6/(byte) line_ydxd::yd#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[130] (byte) line_ydxd::y#6 ← phi( line::@10/(byte) line_ydxd::y#1 line::@6/(byte) line_ydxd::y#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[130] (byte) line_ydxd::x#5 ← phi( line::@10/(byte) line_ydxd::x#1 line::@6/(byte) line_ydxd::x#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[130] (byte) line_ydxd::xd#2 ← phi( line::@10/(byte) line_ydxd::xd#1 line::@6/(byte) line_ydxd::xd#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[131] (byte) line_ydxd::e#0 ← (byte) line_ydxd::xd#2 >> (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::e#0 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::e#0 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::e#0 ] )
[125] (byte) line_ydxd::y1#6 ← phi( line::@10/(byte) line_ydxd::y1#1 line::@6/(byte) line_ydxd::y1#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[125] (byte) line_ydxd::yd#5 ← phi( line::@10/(byte) line_ydxd::yd#1 line::@6/(byte) line_ydxd::yd#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[125] (byte) line_ydxd::y#6 ← phi( line::@10/(byte) line_ydxd::y#1 line::@6/(byte) line_ydxd::y#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[125] (byte) line_ydxd::x#5 ← phi( line::@10/(byte) line_ydxd::x#1 line::@6/(byte) line_ydxd::x#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[125] (byte) line_ydxd::xd#2 ← phi( line::@10/(byte) line_ydxd::xd#1 line::@6/(byte) line_ydxd::xd#0 ) [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 ] )
[126] (byte) line_ydxd::e#0 ← (byte) line_ydxd::xd#2 >> (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::e#0 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::e#0 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::x#5 line_ydxd::y#6 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::e#0 ] )
to:line_ydxd::@1
line_ydxd::@1: scope:[line_ydxd] from line_ydxd line_ydxd::@2
[132] (byte) line_ydxd::e#3 ← phi( line_ydxd/(byte) line_ydxd::e#0 line_ydxd::@2/(byte) line_ydxd::e#6 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[132] (byte) line_ydxd::y#3 ← phi( line_ydxd/(byte) line_ydxd::y#6 line_ydxd::@2/(byte) line_ydxd::y#2 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[132] (byte) line_ydxd::x#3 ← phi( line_ydxd/(byte) line_ydxd::x#5 line_ydxd::@2/(byte) line_ydxd::x#6 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[133] (byte) plot::x#3 ← (byte) line_ydxd::x#3 [ plot::x#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 plot::x#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 plot::x#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[134] (byte) plot::y#3 ← (byte) line_ydxd::y#3 [ plot::x#3 plot::y#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 plot::x#3 plot::y#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 plot::x#3 plot::y#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[135] call plot param-assignment [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[127] (byte) line_ydxd::e#3 ← phi( line_ydxd/(byte) line_ydxd::e#0 line_ydxd::@2/(byte) line_ydxd::e#6 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[127] (byte) line_ydxd::y#3 ← phi( line_ydxd/(byte) line_ydxd::y#6 line_ydxd::@2/(byte) line_ydxd::y#2 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[127] (byte) line_ydxd::x#3 ← phi( line_ydxd/(byte) line_ydxd::x#5 line_ydxd::@2/(byte) line_ydxd::x#6 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[128] (byte) plot::x#3 ← (byte) line_ydxd::x#3 [ plot::x#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 plot::x#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 plot::x#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[129] (byte) plot::y#3 ← (byte) line_ydxd::y#3 [ plot::x#3 plot::y#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 plot::x#3 plot::y#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 plot::x#3 plot::y#3 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
[130] call plot param-assignment [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#3 line_ydxd::e#3 ] )
to:line_ydxd::@5
line_ydxd::@5: scope:[line_ydxd] from line_ydxd::@1
[136] (byte) line_ydxd::y#2 ← (byte) line_ydxd::y#3 + (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::e#3 line_ydxd::y#2 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::e#3 line_ydxd::y#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::e#3 line_ydxd::y#2 ] )
[137] (byte) line_ydxd::e#1 ← (byte) line_ydxd::e#3 + (byte) line_ydxd::xd#2 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] )
[138] if((byte) line_ydxd::yd#5>=(byte) line_ydxd::e#1) goto line_ydxd::@2 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] )
[131] (byte) line_ydxd::y#2 ← (byte) line_ydxd::y#3 + (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::e#3 line_ydxd::y#2 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::e#3 line_ydxd::y#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::e#3 line_ydxd::y#2 ] )
[132] (byte) line_ydxd::e#1 ← (byte) line_ydxd::e#3 + (byte) line_ydxd::xd#2 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] )
[133] if((byte) line_ydxd::yd#5>=(byte) line_ydxd::e#1) goto line_ydxd::@2 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#3 line_ydxd::y#2 line_ydxd::e#1 ] )
to:line_ydxd::@3
line_ydxd::@3: scope:[line_ydxd] from line_ydxd::@5
[139] (byte) line_ydxd::x#2 ← (byte) line_ydxd::x#3 - (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::e#1 line_ydxd::x#2 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::e#1 line_ydxd::x#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::e#1 line_ydxd::x#2 ] )
[140] (byte) line_ydxd::e#2 ← (byte) line_ydxd::e#1 - (byte) line_ydxd::yd#5 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::x#2 line_ydxd::e#2 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::x#2 line_ydxd::e#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::x#2 line_ydxd::e#2 ] )
[134] (byte) line_ydxd::x#2 ← (byte) line_ydxd::x#3 - (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::e#1 line_ydxd::x#2 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::e#1 line_ydxd::x#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::e#1 line_ydxd::x#2 ] )
[135] (byte) line_ydxd::e#2 ← (byte) line_ydxd::e#1 - (byte) line_ydxd::yd#5 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::x#2 line_ydxd::e#2 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::x#2 line_ydxd::e#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::y#2 line_ydxd::x#2 line_ydxd::e#2 ] )
to:line_ydxd::@2
line_ydxd::@2: scope:[line_ydxd] from line_ydxd::@3 line_ydxd::@5
[141] (byte) line_ydxd::e#6 ← phi( line_ydxd::@3/(byte) line_ydxd::e#2 line_ydxd::@5/(byte) line_ydxd::e#1 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] )
[141] (byte) line_ydxd::x#6 ← phi( line_ydxd::@3/(byte) line_ydxd::x#2 line_ydxd::@5/(byte) line_ydxd::x#3 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] )
[142] (byte~) line_ydxd::$8 ← (byte) line_ydxd::y1#6 + (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 line_ydxd::$8 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 line_ydxd::$8 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 line_ydxd::$8 ] )
[143] if((byte) line_ydxd::y#2<(byte~) line_ydxd::$8) goto line_ydxd::@1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] )
[136] (byte) line_ydxd::e#6 ← phi( line_ydxd::@3/(byte) line_ydxd::e#2 line_ydxd::@5/(byte) line_ydxd::e#1 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] )
[136] (byte) line_ydxd::x#6 ← phi( line_ydxd::@3/(byte) line_ydxd::x#2 line_ydxd::@5/(byte) line_ydxd::x#3 ) [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] )
[137] (byte~) line_ydxd::$8 ← (byte) line_ydxd::y1#6 + (byte/signed byte/word/signed word) 1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 line_ydxd::$8 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 line_ydxd::$8 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 line_ydxd::$8 ] )
[138] if((byte) line_ydxd::y#2<(byte~) line_ydxd::$8) goto line_ydxd::@1 [ line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 line_ydxd::xd#2 line_ydxd::yd#5 line_ydxd::y1#6 line_ydxd::x#6 line_ydxd::y#2 line_ydxd::e#6 ] )
to:line_ydxd::@return
line_ydxd::@return: scope:[line_ydxd] from line_ydxd::@2
[144] return [ ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 ] )
[139] return [ ] ( main:2::lines:12::line:21::line_ydxd:56 [ lines::l#2 ] main:2::lines:12::line:21::line_ydxd:72 [ lines::l#2 ] )
to:@return
line_xdyd: scope:[line_xdyd] from line::@20 line::@24
[145] (byte) line_xdyd::x1#6 ← phi( line::@20/(byte) line_xdyd::x1#0 line::@24/(byte) line_xdyd::x1#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[145] (byte) line_xdyd::xd#5 ← phi( line::@20/(byte) line_xdyd::xd#0 line::@24/(byte) line_xdyd::xd#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[145] (byte) line_xdyd::y#5 ← phi( line::@20/(byte) line_xdyd::y#0 line::@24/(byte) line_xdyd::y#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[145] (byte) line_xdyd::x#6 ← phi( line::@20/(byte) line_xdyd::x#0 line::@24/(byte) line_xdyd::x#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[145] (byte) line_xdyd::yd#2 ← phi( line::@20/(byte) line_xdyd::yd#0 line::@24/(byte) line_xdyd::yd#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[146] (byte) line_xdyd::e#0 ← (byte) line_xdyd::yd#2 >> (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::e#0 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::e#0 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::e#0 ] )
[140] (byte) line_xdyd::x1#6 ← phi( line::@20/(byte) line_xdyd::x1#0 line::@24/(byte) line_xdyd::x1#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[140] (byte) line_xdyd::xd#5 ← phi( line::@20/(byte) line_xdyd::xd#0 line::@24/(byte) line_xdyd::xd#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[140] (byte) line_xdyd::y#5 ← phi( line::@20/(byte) line_xdyd::y#0 line::@24/(byte) line_xdyd::y#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[140] (byte) line_xdyd::x#6 ← phi( line::@20/(byte) line_xdyd::x#0 line::@24/(byte) line_xdyd::x#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[140] (byte) line_xdyd::yd#2 ← phi( line::@20/(byte) line_xdyd::yd#0 line::@24/(byte) line_xdyd::yd#1 ) [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 ] )
[141] (byte) line_xdyd::e#0 ← (byte) line_xdyd::yd#2 >> (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::e#0 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::e#0 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::x#6 line_xdyd::y#5 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::e#0 ] )
to:line_xdyd::@1
line_xdyd::@1: scope:[line_xdyd] from line_xdyd line_xdyd::@2
[147] (byte) line_xdyd::e#3 ← phi( line_xdyd/(byte) line_xdyd::e#0 line_xdyd::@2/(byte) line_xdyd::e#6 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[147] (byte) line_xdyd::y#3 ← phi( line_xdyd/(byte) line_xdyd::y#5 line_xdyd::@2/(byte) line_xdyd::y#6 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[147] (byte) line_xdyd::x#3 ← phi( line_xdyd/(byte) line_xdyd::x#6 line_xdyd::@2/(byte) line_xdyd::x#2 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[148] (byte) plot::x#1 ← (byte) line_xdyd::x#3 [ plot::x#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 plot::x#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 plot::x#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[149] (byte) plot::y#1 ← (byte) line_xdyd::y#3 [ plot::x#1 plot::y#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 plot::x#1 plot::y#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 plot::x#1 plot::y#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[150] call plot param-assignment [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[142] (byte) line_xdyd::e#3 ← phi( line_xdyd/(byte) line_xdyd::e#0 line_xdyd::@2/(byte) line_xdyd::e#6 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[142] (byte) line_xdyd::y#3 ← phi( line_xdyd/(byte) line_xdyd::y#5 line_xdyd::@2/(byte) line_xdyd::y#6 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[142] (byte) line_xdyd::x#3 ← phi( line_xdyd/(byte) line_xdyd::x#6 line_xdyd::@2/(byte) line_xdyd::x#2 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[143] (byte) plot::x#1 ← (byte) line_xdyd::x#3 [ plot::x#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 plot::x#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 plot::x#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[144] (byte) plot::y#1 ← (byte) line_xdyd::y#3 [ plot::x#1 plot::y#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 plot::x#1 plot::y#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 plot::x#1 plot::y#1 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
[145] call plot param-assignment [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#3 line_xdyd::y#3 line_xdyd::e#3 ] )
to:line_xdyd::@5
line_xdyd::@5: scope:[line_xdyd] from line_xdyd::@1
[151] (byte) line_xdyd::x#2 ← (byte) line_xdyd::x#3 + (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::e#3 line_xdyd::x#2 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::e#3 line_xdyd::x#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::e#3 line_xdyd::x#2 ] )
[152] (byte) line_xdyd::e#1 ← (byte) line_xdyd::e#3 + (byte) line_xdyd::yd#2 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] )
[153] if((byte) line_xdyd::xd#5>=(byte) line_xdyd::e#1) goto line_xdyd::@2 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] )
[146] (byte) line_xdyd::x#2 ← (byte) line_xdyd::x#3 + (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::e#3 line_xdyd::x#2 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::e#3 line_xdyd::x#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::e#3 line_xdyd::x#2 ] )
[147] (byte) line_xdyd::e#1 ← (byte) line_xdyd::e#3 + (byte) line_xdyd::yd#2 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] )
[148] if((byte) line_xdyd::xd#5>=(byte) line_xdyd::e#1) goto line_xdyd::@2 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::y#3 line_xdyd::x#2 line_xdyd::e#1 ] )
to:line_xdyd::@3
line_xdyd::@3: scope:[line_xdyd] from line_xdyd::@5
[154] (byte) line_xdyd::y#2 ← (byte) line_xdyd::y#3 - (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::e#1 line_xdyd::y#2 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::e#1 line_xdyd::y#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::e#1 line_xdyd::y#2 ] )
[155] (byte) line_xdyd::e#2 ← (byte) line_xdyd::e#1 - (byte) line_xdyd::xd#5 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#2 line_xdyd::e#2 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#2 line_xdyd::e#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#2 line_xdyd::e#2 ] )
[149] (byte) line_xdyd::y#2 ← (byte) line_xdyd::y#3 - (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::e#1 line_xdyd::y#2 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::e#1 line_xdyd::y#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::e#1 line_xdyd::y#2 ] )
[150] (byte) line_xdyd::e#2 ← (byte) line_xdyd::e#1 - (byte) line_xdyd::xd#5 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#2 line_xdyd::e#2 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#2 line_xdyd::e#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#2 line_xdyd::e#2 ] )
to:line_xdyd::@2
line_xdyd::@2: scope:[line_xdyd] from line_xdyd::@3 line_xdyd::@5
[156] (byte) line_xdyd::e#6 ← phi( line_xdyd::@3/(byte) line_xdyd::e#2 line_xdyd::@5/(byte) line_xdyd::e#1 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] )
[156] (byte) line_xdyd::y#6 ← phi( line_xdyd::@3/(byte) line_xdyd::y#2 line_xdyd::@5/(byte) line_xdyd::y#3 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] )
[157] (byte~) line_xdyd::$8 ← (byte) line_xdyd::x1#6 + (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$8 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$8 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$8 ] )
[158] if((byte) line_xdyd::x#2<(byte~) line_xdyd::$8) goto line_xdyd::@1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] )
[151] (byte) line_xdyd::e#6 ← phi( line_xdyd::@3/(byte) line_xdyd::e#2 line_xdyd::@5/(byte) line_xdyd::e#1 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] )
[151] (byte) line_xdyd::y#6 ← phi( line_xdyd::@3/(byte) line_xdyd::y#2 line_xdyd::@5/(byte) line_xdyd::y#3 ) [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] )
[152] (byte~) line_xdyd::$8 ← (byte) line_xdyd::x1#6 + (byte/signed byte/word/signed word) 1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$8 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$8 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 line_xdyd::$8 ] )
[153] if((byte) line_xdyd::x#2<(byte~) line_xdyd::$8) goto line_xdyd::@1 [ line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 line_xdyd::yd#2 line_xdyd::xd#5 line_xdyd::x1#6 line_xdyd::x#2 line_xdyd::y#6 line_xdyd::e#6 ] )
to:line_xdyd::@return
line_xdyd::@return: scope:[line_xdyd] from line_xdyd::@2
[159] return [ ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 ] )
[154] return [ ] ( main:2::lines:12::line:21::line_xdyd:50 [ lines::l#2 ] main:2::lines:12::line:21::line_xdyd:66 [ lines::l#2 ] )
to:@return
init_plot_tables: scope:[init_plot_tables] from main::@3
[160] phi() [ ] ( main:2::init_plot_tables:10 [ ] )
[155] phi() [ ] ( main:2::init_plot_tables:10 [ ] )
to:init_plot_tables::@1
init_plot_tables::@1: scope:[init_plot_tables] from init_plot_tables init_plot_tables::@2
[161] (byte) init_plot_tables::bits#3 ← phi( init_plot_tables/(byte/word/signed word) 128 init_plot_tables::@2/(byte) init_plot_tables::bits#4 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[161] (byte) init_plot_tables::x#2 ← phi( init_plot_tables/(byte/signed byte/word/signed word) 0 init_plot_tables::@2/(byte) init_plot_tables::x#1 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[162] (byte~) init_plot_tables::$0 ← (byte) init_plot_tables::x#2 & (byte/word/signed word) 248 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] )
[163] *((const byte[]) plot_xlo#0 + (byte) init_plot_tables::x#2) ← (byte~) init_plot_tables::$0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[164] *((const byte[]) plot_xhi#0 + (byte) init_plot_tables::x#2) ← >(const byte*) BITMAP#0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[165] *((const byte[]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[166] (byte) init_plot_tables::bits#1 ← (byte) init_plot_tables::bits#3 >> (byte/signed byte/word/signed word) 1 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[167] if((byte) init_plot_tables::bits#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[156] (byte) init_plot_tables::bits#3 ← phi( init_plot_tables/(byte/word/signed word) 128 init_plot_tables::@2/(byte) init_plot_tables::bits#4 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[156] (byte) init_plot_tables::x#2 ← phi( init_plot_tables/(byte/signed byte/word/signed word) 0 init_plot_tables::@2/(byte) init_plot_tables::x#1 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[157] (byte~) init_plot_tables::$0 ← (byte) init_plot_tables::x#2 & (byte/word/signed word) 248 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] )
[158] *((const byte[]) plot_xlo#0 + (byte) init_plot_tables::x#2) ← (byte~) init_plot_tables::$0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[159] *((const byte[]) plot_xhi#0 + (byte) init_plot_tables::x#2) ← >(const byte*) BITMAP#0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[160] *((const byte[]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[161] (byte) init_plot_tables::bits#1 ← (byte) init_plot_tables::bits#3 >> (byte/signed byte/word/signed word) 1 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[162] if((byte) init_plot_tables::bits#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
to:init_plot_tables::@2
init_plot_tables::@2: scope:[init_plot_tables] from init_plot_tables::@1 init_plot_tables::@10
[168] (byte) init_plot_tables::bits#4 ← phi( init_plot_tables::@10/(byte) init_plot_tables::bits#1 init_plot_tables::@1/(byte/word/signed word) 128 ) [ init_plot_tables::x#2 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#4 ] )
[169] (byte) init_plot_tables::x#1 ← ++ (byte) init_plot_tables::x#2 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
[170] if((byte) init_plot_tables::x#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@1 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
[163] (byte) init_plot_tables::bits#4 ← phi( init_plot_tables::@10/(byte) init_plot_tables::bits#1 init_plot_tables::@1/(byte/word/signed word) 128 ) [ init_plot_tables::x#2 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#4 ] )
[164] (byte) init_plot_tables::x#1 ← ++ (byte) init_plot_tables::x#2 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
[165] if((byte) init_plot_tables::x#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@1 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
to:init_plot_tables::@3
init_plot_tables::@3: scope:[init_plot_tables] from init_plot_tables::@2 init_plot_tables::@4
[171] (byte*) init_plot_tables::yoffs#2 ← phi( init_plot_tables::@4/(byte*) init_plot_tables::yoffs#4 init_plot_tables::@2/((byte*))(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[171] (byte) init_plot_tables::y#2 ← phi( init_plot_tables::@4/(byte) init_plot_tables::y#1 init_plot_tables::@2/(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[172] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] )
[173] (byte~) init_plot_tables::$7 ← < (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] )
[174] (byte~) init_plot_tables::$8 ← (byte~) init_plot_tables::$6 | (byte~) init_plot_tables::$7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] )
[175] *((const byte[]) plot_ylo#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$8 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[176] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] )
[177] *((const byte[]) plot_yhi#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$9 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[178] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] )
[179] if((byte~) init_plot_tables::$10!=(byte/signed byte/word/signed word) 7) goto init_plot_tables::@4 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[166] (byte*) init_plot_tables::yoffs#2 ← phi( init_plot_tables::@4/(byte*) init_plot_tables::yoffs#4 init_plot_tables::@2/((byte*))(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[166] (byte) init_plot_tables::y#2 ← phi( init_plot_tables::@4/(byte) init_plot_tables::y#1 init_plot_tables::@2/(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[167] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] )
[168] (byte~) init_plot_tables::$7 ← < (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] )
[169] (byte~) init_plot_tables::$8 ← (byte~) init_plot_tables::$6 | (byte~) init_plot_tables::$7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] )
[170] *((const byte[]) plot_ylo#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$8 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[171] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] )
[172] *((const byte[]) plot_yhi#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$9 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[173] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] )
[174] if((byte~) init_plot_tables::$10!=(byte/signed byte/word/signed word) 7) goto init_plot_tables::@4 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
to:init_plot_tables::@7
init_plot_tables::@7: scope:[init_plot_tables] from init_plot_tables::@3
[180] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] )
[175] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] )
to:init_plot_tables::@4
init_plot_tables::@4: scope:[init_plot_tables] from init_plot_tables::@3 init_plot_tables::@7
[181] (byte*) init_plot_tables::yoffs#4 ← phi( init_plot_tables::@3/(byte*) init_plot_tables::yoffs#2 init_plot_tables::@7/(byte*) init_plot_tables::yoffs#1 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] )
[182] (byte) init_plot_tables::y#1 ← ++ (byte) init_plot_tables::y#2 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
[183] if((byte) init_plot_tables::y#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@3 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
[176] (byte*) init_plot_tables::yoffs#4 ← phi( init_plot_tables::@3/(byte*) init_plot_tables::yoffs#2 init_plot_tables::@7/(byte*) init_plot_tables::yoffs#1 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] )
[177] (byte) init_plot_tables::y#1 ← ++ (byte) init_plot_tables::y#2 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
[178] if((byte) init_plot_tables::y#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@3 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
to:init_plot_tables::@return
init_plot_tables::@return: scope:[init_plot_tables] from init_plot_tables::@4
[184] return [ ] ( main:2::init_plot_tables:10 [ ] )
[179] return [ ] ( main:2::init_plot_tables:10 [ ] )
to:@return
init_plot_tables::@10: scope:[init_plot_tables] from init_plot_tables::@1
[185] phi() [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[180] phi() [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
to:init_plot_tables::@2
init_screen: scope:[init_screen] from main
[186] phi() [ ] ( main:2::init_screen:8 [ ] )
[181] phi() [ ] ( main:2::init_screen:8 [ ] )
to:init_screen::@1
init_screen::@1: scope:[init_screen] from init_screen init_screen::@1
[187] (byte*) init_screen::b#2 ← phi( init_screen/(const byte*) BITMAP#0 init_screen::@1/(byte*) init_screen::b#1 ) [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[188] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[189] (byte*) init_screen::b#1 ← ++ (byte*) init_screen::b#2 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
[190] if((byte*) init_screen::b#1!=(const byte*) BITMAP#0+(word/signed word) 8192) goto init_screen::@1 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
[182] (byte*) init_screen::b#2 ← phi( init_screen/(const byte*) BITMAP#0 init_screen::@1/(byte*) init_screen::b#1 ) [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[183] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[184] (byte*) init_screen::b#1 ← ++ (byte*) init_screen::b#2 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
[185] if((byte*) init_screen::b#1!=(const byte*) BITMAP#0+(word/signed word) 8192) goto init_screen::@1 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
to:init_screen::@2
init_screen::@2: scope:[init_screen] from init_screen::@1 init_screen::@2
[191] (byte*) init_screen::c#2 ← phi( init_screen::@2/(byte*) init_screen::c#1 init_screen::@1/(const byte*) SCREEN#0 ) [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[192] *((byte*) init_screen::c#2) ← (byte/signed byte/word/signed word) 20 [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[193] (byte*) init_screen::c#1 ← ++ (byte*) init_screen::c#2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
[194] if((byte*) init_screen::c#1!=(const byte*) SCREEN#0+(word/signed word) 1024) goto init_screen::@2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
[186] (byte*) init_screen::c#2 ← phi( init_screen::@2/(byte*) init_screen::c#1 init_screen::@1/(const byte*) SCREEN#0 ) [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[187] *((byte*) init_screen::c#2) ← (byte/signed byte/word/signed word) 20 [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[188] (byte*) init_screen::c#1 ← ++ (byte*) init_screen::c#2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
[189] if((byte*) init_screen::c#1!=(const byte*) SCREEN#0+(word/signed word) 1024) goto init_screen::@2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
to:init_screen::@return
init_screen::@return: scope:[init_screen] from init_screen::@2
[195] return [ ] ( main:2::init_screen:8 [ ] )
[190] return [ ] ( main:2::init_screen:8 [ ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -260,18 +260,13 @@
(label) main::@5
(label) main::@return
(void()) plot((byte) plot::x , (byte) plot::y)
(byte~) plot::$0 reg byte a 2.0
(byte~) plot::$1 reg byte alu 4.0
(byte~) plot::$2 $2 zp ZP_BYTE:10 2.0
(byte~) plot::$3 reg byte a 4.0
(word~) plot::$4 $4 zp ZP_WORD:8 4.0
(byte~) plot::$5 reg byte a 4.0
(byte~) plot::$6 reg byte a 4.0
(word~) plot::$0 $0 zp ZP_WORD:8 4.0
(byte~) plot::$1 reg byte a 4.0
(label) plot::@return
(byte*) plot::plotter
(byte*) plot::plotter#0 plotter zp ZP_WORD:8 2.0
(byte*) plot::plotter#0 plotter zp ZP_WORD:8 3.0
(word) plot::plotter_x
(word) plot::plotter_x#0 plotter_x zp ZP_WORD:8 1.0
(word) plot::plotter_x#0 plotter_x zp ZP_WORD:8 2.0
(word) plot::plotter_y
(word) plot::plotter_y#0 plotter_y zp ZP_WORD:11 4.0
(byte) plot::x
@ -279,13 +274,13 @@
(byte) plot::x#1 reg byte x 11.0
(byte) plot::x#2 reg byte x 11.0
(byte) plot::x#3 reg byte x 11.0
(byte) plot::x#4 reg byte x 5.555555555555556
(byte) plot::x#4 reg byte x 10.000000000000002
(byte) plot::y
(byte) plot::y#0 reg byte y 22.0
(byte) plot::y#1 reg byte y 22.0
(byte) plot::y#2 reg byte y 22.0
(byte) plot::y#3 reg byte y 22.0
(byte) plot::y#4 reg byte y 9.600000000000001
(byte) plot::y#4 reg byte y 24.0
(byte[]) plot_bit
(const byte[]) plot_bit#0 plot_bit = ((byte*))(word/signed word) 5120
(byte[]) plot_xhi
@ -312,16 +307,12 @@ reg byte x [ line_xdyd::x#3 line_xdyd::x#6 line_xdyd::x#0 line_xdyd::x#1 line_xd
reg byte x [ init_plot_tables::x#2 init_plot_tables::x#1 ]
reg byte y [ init_plot_tables::bits#3 init_plot_tables::bits#4 init_plot_tables::bits#1 ]
reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ]
zp ZP_WORD:8 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 init_screen::b#2 init_screen::b#1 init_screen::c#2 init_screen::c#1 plot::plotter_x#0 plot::$4 plot::plotter#0 ]
zp ZP_WORD:8 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 init_screen::b#2 init_screen::b#1 init_screen::c#2 init_screen::c#1 plot::plotter_x#0 plot::$0 plot::plotter#0 ]
reg byte y [ line::y0#0 ]
zp ZP_BYTE:10 [ line::yd#1 line::yd#0 line::yd#3 line::yd#10 plot::$2 line_xdyi::$8 line_xdyd::$8 ]
zp ZP_BYTE:10 [ line::yd#1 line::yd#0 line::yd#3 line::yd#10 line_xdyi::$8 line_xdyd::$8 ]
reg byte a [ line_ydxi::$8 ]
reg byte a [ plot::$0 ]
reg byte alu [ plot::$1 ]
reg byte a [ plot::$3 ]
zp ZP_WORD:11 [ plot::plotter_y#0 ]
reg byte a [ plot::$5 ]
reg byte a [ plot::$6 ]
reg byte a [ plot::$1 ]
reg byte a [ line_ydxd::$8 ]
reg byte a [ init_plot_tables::$0 ]
reg byte a [ init_plot_tables::$7 ]

View File

@ -37,8 +37,8 @@ plots: scope:[plots] from main::@3
to:plots::@1
plots::@1: scope:[plots] from plots plots::@3
[18] (byte) plots::i#2 ← phi( plots/(byte/signed byte/word/signed word) 0 plots::@3/(byte) plots::i#1 ) [ plots::i#2 ] ( main:2::plots:13 [ plots::i#2 ] )
[19] (byte) plot::x#0 ← (const byte[]) plots_x#0 *idx (byte) plots::i#2 [ plots::i#2 plot::x#0 ] ( main:2::plots:13 [ plots::i#2 plot::x#0 ] )
[20] (byte) plot::y#0 ← (const byte[]) plots_y#0 *idx (byte) plots::i#2 [ plots::i#2 plot::x#0 plot::y#0 ] ( main:2::plots:13 [ plots::i#2 plot::x#0 plot::y#0 ] )
[19] (byte) plot::x#0 ← *((const byte[]) plots_x#0 + (byte) plots::i#2) [ plots::i#2 plot::x#0 ] ( main:2::plots:13 [ plots::i#2 plot::x#0 ] )
[20] (byte) plot::y#0 ← *((const byte[]) plots_y#0 + (byte) plots::i#2) [ plots::i#2 plot::x#0 plot::y#0 ] ( main:2::plots:13 [ plots::i#2 plot::x#0 plot::y#0 ] )
[21] call plot param-assignment [ plots::i#2 ] ( main:2::plots:13 [ plots::i#2 ] )
to:plots::@3
plots::@3: scope:[plots] from plots::@1
@ -49,81 +49,80 @@ plots::@return: scope:[plots] from plots::@3
[24] return [ ] ( main:2::plots:13 [ ] )
to:@return
plot: scope:[plot] from plots::@1
[25] (byte~) plot::$0 ← (const byte[]) plot_xhi#0 *idx (byte) plot::x#0 [ plot::x#0 plot::y#0 plot::$0 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::$0 ] )
[26] (byte*) plot::plotter_x#1 ← ((byte*))(byte/signed byte/word/signed word) 0 hi= (byte~) plot::$0 [ plot::x#0 plot::y#0 plot::plotter_x#1 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#1 ] )
[27] (byte~) plot::$1 ← (const byte[]) plot_xlo#0 *idx (byte) plot::x#0 [ plot::x#0 plot::y#0 plot::plotter_x#1 plot::$1 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#1 plot::$1 ] )
[28] (byte*) plot::plotter_x#2 ← (byte*) plot::plotter_x#1 lo= (byte~) plot::$1 [ plot::x#0 plot::y#0 plot::plotter_x#2 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#2 ] )
[29] (byte~) plot::$2 ← (const byte[]) plot_yhi#0 *idx (byte) plot::y#0 [ plot::x#0 plot::y#0 plot::plotter_x#2 plot::$2 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#2 plot::$2 ] )
[30] (word) plot::plotter_y#1 ← (byte/signed byte/word/signed word) 0 hi= (byte~) plot::$2 [ plot::x#0 plot::y#0 plot::plotter_x#2 plot::plotter_y#1 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#2 plot::plotter_y#1 ] )
[31] (byte~) plot::$3 ← (const byte[]) plot_ylo#0 *idx (byte) plot::y#0 [ plot::x#0 plot::plotter_x#2 plot::plotter_y#1 plot::$3 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::plotter_x#2 plot::plotter_y#1 plot::$3 ] )
[32] (word) plot::plotter_y#2 ← (word) plot::plotter_y#1 lo= (byte~) plot::$3 [ plot::x#0 plot::plotter_x#2 plot::plotter_y#2 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::plotter_x#2 plot::plotter_y#2 ] )
[25] (byte~) plot::$6 ← *((const byte[]) plot_xhi#0 + (byte) plot::x#0) [ plot::x#0 plot::y#0 plot::$6 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::$6 ] )
[26] (byte*) plot::plotter_x#1 ← ((byte*))(byte/signed byte/word/signed word) 0 hi= (byte~) plot::$6 [ plot::x#0 plot::y#0 plot::plotter_x#1 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#1 ] )
[27] (byte~) plot::$7 ← *((const byte[]) plot_xlo#0 + (byte) plot::x#0) [ plot::x#0 plot::y#0 plot::plotter_x#1 plot::$7 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#1 plot::$7 ] )
[28] (byte*) plot::plotter_x#2 ← (byte*) plot::plotter_x#1 lo= (byte~) plot::$7 [ plot::x#0 plot::y#0 plot::plotter_x#2 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#2 ] )
[29] (byte~) plot::$8 ← *((const byte[]) plot_yhi#0 + (byte) plot::y#0) [ plot::x#0 plot::y#0 plot::plotter_x#2 plot::$8 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#2 plot::$8 ] )
[30] (word) plot::plotter_y#1 ← (byte/signed byte/word/signed word) 0 hi= (byte~) plot::$8 [ plot::x#0 plot::y#0 plot::plotter_x#2 plot::plotter_y#1 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::y#0 plot::plotter_x#2 plot::plotter_y#1 ] )
[31] (byte~) plot::$9 ← *((const byte[]) plot_ylo#0 + (byte) plot::y#0) [ plot::x#0 plot::plotter_x#2 plot::plotter_y#1 plot::$9 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::plotter_x#2 plot::plotter_y#1 plot::$9 ] )
[32] (word) plot::plotter_y#2 ← (word) plot::plotter_y#1 lo= (byte~) plot::$9 [ plot::x#0 plot::plotter_x#2 plot::plotter_y#2 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::plotter_x#2 plot::plotter_y#2 ] )
[33] (byte*) plot::plotter#0 ← (byte*) plot::plotter_x#2 + (word) plot::plotter_y#2 [ plot::x#0 plot::plotter#0 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::x#0 plot::plotter#0 ] )
[34] (byte~) plot::$5 ← (const byte[]) plot_bit#0 *idx (byte) plot::x#0 [ plot::plotter#0 plot::$5 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::plotter#0 plot::$5 ] )
[35] (byte~) plot::$6 ← *((byte*) plot::plotter#0) | (byte~) plot::$5 [ plot::plotter#0 plot::$6 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::plotter#0 plot::$6 ] )
[36] *((byte*) plot::plotter#0) ← (byte~) plot::$6 [ ] ( main:2::plots:13::plot:21 [ plots::i#2 ] )
[34] (byte~) plot::$5 ← *((byte*) plot::plotter#0) | *((const byte[]) plot_bit#0 + (byte) plot::x#0) [ plot::plotter#0 plot::$5 ] ( main:2::plots:13::plot:21 [ plots::i#2 plot::plotter#0 plot::$5 ] )
[35] *((byte*) plot::plotter#0) ← (byte~) plot::$5 [ ] ( main:2::plots:13::plot:21 [ plots::i#2 ] )
to:plot::@return
plot::@return: scope:[plot] from plot
[37] return [ ] ( main:2::plots:13::plot:21 [ plots::i#2 ] )
[36] return [ ] ( main:2::plots:13::plot:21 [ plots::i#2 ] )
to:@return
init_plot_tables: scope:[init_plot_tables] from main::@5
[38] phi() [ ] ( main:2::init_plot_tables:10 [ ] )
[37] phi() [ ] ( main:2::init_plot_tables:10 [ ] )
to:init_plot_tables::@1
init_plot_tables::@1: scope:[init_plot_tables] from init_plot_tables init_plot_tables::@2
[39] (byte) init_plot_tables::bits#3 ← phi( init_plot_tables/(byte/word/signed word) 128 init_plot_tables::@2/(byte) init_plot_tables::bits#4 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[39] (byte) init_plot_tables::x#2 ← phi( init_plot_tables/(byte/signed byte/word/signed word) 0 init_plot_tables::@2/(byte) init_plot_tables::x#1 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[40] (byte~) init_plot_tables::$0 ← (byte) init_plot_tables::x#2 & (byte/word/signed word) 248 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] )
[41] *((const byte[]) plot_xlo#0 + (byte) init_plot_tables::x#2) ← (byte~) init_plot_tables::$0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[42] *((const byte[]) plot_xhi#0 + (byte) init_plot_tables::x#2) ← >(const byte*) BITMAP#0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[43] *((const byte[]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[44] (byte) init_plot_tables::bits#1 ← (byte) init_plot_tables::bits#3 >> (byte/signed byte/word/signed word) 1 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[45] if((byte) init_plot_tables::bits#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[38] (byte) init_plot_tables::bits#3 ← phi( init_plot_tables/(byte/word/signed word) 128 init_plot_tables::@2/(byte) init_plot_tables::bits#4 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[38] (byte) init_plot_tables::x#2 ← phi( init_plot_tables/(byte/signed byte/word/signed word) 0 init_plot_tables::@2/(byte) init_plot_tables::x#1 ) [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[39] (byte~) init_plot_tables::$0 ← (byte) init_plot_tables::x#2 & (byte/word/signed word) 248 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 init_plot_tables::$0 ] )
[40] *((const byte[]) plot_xlo#0 + (byte) init_plot_tables::x#2) ← (byte~) init_plot_tables::$0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[41] *((const byte[]) plot_xhi#0 + (byte) init_plot_tables::x#2) ← >(const byte*) BITMAP#0 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[42] *((const byte[]) plot_bit#0 + (byte) init_plot_tables::x#2) ← (byte) init_plot_tables::bits#3 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#3 ] )
[43] (byte) init_plot_tables::bits#1 ← (byte) init_plot_tables::bits#3 >> (byte/signed byte/word/signed word) 1 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[44] if((byte) init_plot_tables::bits#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
to:init_plot_tables::@2
init_plot_tables::@2: scope:[init_plot_tables] from init_plot_tables::@1 init_plot_tables::@10
[46] (byte) init_plot_tables::bits#4 ← phi( init_plot_tables::@10/(byte) init_plot_tables::bits#1 init_plot_tables::@1/(byte/word/signed word) 128 ) [ init_plot_tables::x#2 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#4 ] )
[47] (byte) init_plot_tables::x#1 ← ++ (byte) init_plot_tables::x#2 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
[48] if((byte) init_plot_tables::x#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@1 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
[45] (byte) init_plot_tables::bits#4 ← phi( init_plot_tables::@10/(byte) init_plot_tables::bits#1 init_plot_tables::@1/(byte/word/signed word) 128 ) [ init_plot_tables::x#2 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#4 ] )
[46] (byte) init_plot_tables::x#1 ← ++ (byte) init_plot_tables::x#2 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
[47] if((byte) init_plot_tables::x#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@1 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#1 init_plot_tables::bits#4 ] )
to:init_plot_tables::@3
init_plot_tables::@3: scope:[init_plot_tables] from init_plot_tables::@2 init_plot_tables::@4
[49] (byte*) init_plot_tables::yoffs#2 ← phi( init_plot_tables::@4/(byte*) init_plot_tables::yoffs#4 init_plot_tables::@2/((byte*))(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[49] (byte) init_plot_tables::y#2 ← phi( init_plot_tables::@4/(byte) init_plot_tables::y#1 init_plot_tables::@2/(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[50] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] )
[51] (byte~) init_plot_tables::$7 ← < (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] )
[52] (byte~) init_plot_tables::$8 ← (byte~) init_plot_tables::$6 | (byte~) init_plot_tables::$7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] )
[53] *((const byte[]) plot_ylo#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$8 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[54] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] )
[55] *((const byte[]) plot_yhi#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$9 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[56] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] )
[57] if((byte~) init_plot_tables::$10!=(byte/signed byte/word/signed word) 7) goto init_plot_tables::@4 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[48] (byte*) init_plot_tables::yoffs#2 ← phi( init_plot_tables::@4/(byte*) init_plot_tables::yoffs#4 init_plot_tables::@2/((byte*))(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[48] (byte) init_plot_tables::y#2 ← phi( init_plot_tables::@4/(byte) init_plot_tables::y#1 init_plot_tables::@2/(byte/signed byte/word/signed word) 0 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[49] (byte~) init_plot_tables::$6 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 ] )
[50] (byte~) init_plot_tables::$7 ← < (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$6 init_plot_tables::$7 ] )
[51] (byte~) init_plot_tables::$8 ← (byte~) init_plot_tables::$6 | (byte~) init_plot_tables::$7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$8 ] )
[52] *((const byte[]) plot_ylo#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$8 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[53] (byte~) init_plot_tables::$9 ← > (byte*) init_plot_tables::yoffs#2 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$9 ] )
[54] *((const byte[]) plot_yhi#0 + (byte) init_plot_tables::y#2) ← (byte~) init_plot_tables::$9 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
[55] (byte~) init_plot_tables::$10 ← (byte) init_plot_tables::y#2 & (byte/signed byte/word/signed word) 7 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 init_plot_tables::$10 ] )
[56] if((byte~) init_plot_tables::$10!=(byte/signed byte/word/signed word) 7) goto init_plot_tables::@4 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#2 ] )
to:init_plot_tables::@7
init_plot_tables::@7: scope:[init_plot_tables] from init_plot_tables::@3
[58] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] )
[57] (byte*) init_plot_tables::yoffs#1 ← (byte*) init_plot_tables::yoffs#2 + (byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 8 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#1 ] )
to:init_plot_tables::@4
init_plot_tables::@4: scope:[init_plot_tables] from init_plot_tables::@3 init_plot_tables::@7
[59] (byte*) init_plot_tables::yoffs#4 ← phi( init_plot_tables::@3/(byte*) init_plot_tables::yoffs#2 init_plot_tables::@7/(byte*) init_plot_tables::yoffs#1 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] )
[60] (byte) init_plot_tables::y#1 ← ++ (byte) init_plot_tables::y#2 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
[61] if((byte) init_plot_tables::y#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@3 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
[58] (byte*) init_plot_tables::yoffs#4 ← phi( init_plot_tables::@3/(byte*) init_plot_tables::yoffs#2 init_plot_tables::@7/(byte*) init_plot_tables::yoffs#1 ) [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#2 init_plot_tables::yoffs#4 ] )
[59] (byte) init_plot_tables::y#1 ← ++ (byte) init_plot_tables::y#2 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
[60] if((byte) init_plot_tables::y#1!=(byte/signed byte/word/signed word) 0) goto init_plot_tables::@3 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] ( main:2::init_plot_tables:10 [ init_plot_tables::y#1 init_plot_tables::yoffs#4 ] )
to:init_plot_tables::@return
init_plot_tables::@return: scope:[init_plot_tables] from init_plot_tables::@4
[62] return [ ] ( main:2::init_plot_tables:10 [ ] )
[61] return [ ] ( main:2::init_plot_tables:10 [ ] )
to:@return
init_plot_tables::@10: scope:[init_plot_tables] from init_plot_tables::@1
[63] phi() [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
[62] phi() [ init_plot_tables::x#2 init_plot_tables::bits#1 ] ( main:2::init_plot_tables:10 [ init_plot_tables::x#2 init_plot_tables::bits#1 ] )
to:init_plot_tables::@2
init_screen: scope:[init_screen] from main
[64] phi() [ ] ( main:2::init_screen:8 [ ] )
[63] phi() [ ] ( main:2::init_screen:8 [ ] )
to:init_screen::@1
init_screen::@1: scope:[init_screen] from init_screen init_screen::@1
[65] (byte*) init_screen::b#2 ← phi( init_screen/(const byte*) BITMAP#0 init_screen::@1/(byte*) init_screen::b#1 ) [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[66] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[67] (byte*) init_screen::b#1 ← ++ (byte*) init_screen::b#2 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
[68] if((byte*) init_screen::b#1!=(const byte*) BITMAP#0+(word/signed word) 8192) goto init_screen::@1 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
[64] (byte*) init_screen::b#2 ← phi( init_screen/(const byte*) BITMAP#0 init_screen::@1/(byte*) init_screen::b#1 ) [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[65] *((byte*) init_screen::b#2) ← (byte/signed byte/word/signed word) 0 [ init_screen::b#2 ] ( main:2::init_screen:8 [ init_screen::b#2 ] )
[66] (byte*) init_screen::b#1 ← ++ (byte*) init_screen::b#2 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
[67] if((byte*) init_screen::b#1!=(const byte*) BITMAP#0+(word/signed word) 8192) goto init_screen::@1 [ init_screen::b#1 ] ( main:2::init_screen:8 [ init_screen::b#1 ] )
to:init_screen::@2
init_screen::@2: scope:[init_screen] from init_screen::@1 init_screen::@2
[69] (byte*) init_screen::c#2 ← phi( init_screen::@2/(byte*) init_screen::c#1 init_screen::@1/(const byte*) SCREEN#0 ) [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[70] *((byte*) init_screen::c#2) ← (byte/signed byte/word/signed word) 20 [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[71] (byte*) init_screen::c#1 ← ++ (byte*) init_screen::c#2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
[72] if((byte*) init_screen::c#1!=(const byte*) SCREEN#0+(word/signed word) 1024) goto init_screen::@2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
[68] (byte*) init_screen::c#2 ← phi( init_screen::@2/(byte*) init_screen::c#1 init_screen::@1/(const byte*) SCREEN#0 ) [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[69] *((byte*) init_screen::c#2) ← (byte/signed byte/word/signed word) 20 [ init_screen::c#2 ] ( main:2::init_screen:8 [ init_screen::c#2 ] )
[70] (byte*) init_screen::c#1 ← ++ (byte*) init_screen::c#2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
[71] if((byte*) init_screen::c#1!=(const byte*) SCREEN#0+(word/signed word) 1024) goto init_screen::@2 [ init_screen::c#1 ] ( main:2::init_screen:8 [ init_screen::c#1 ] )
to:init_screen::@return
init_screen::@return: scope:[init_screen] from init_screen::@2
[73] return [ ] ( main:2::init_screen:8 [ ] )
[72] return [ ] ( main:2::init_screen:8 [ ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -66,15 +66,14 @@
(label) main::@7
(label) main::@return
(void()) plot((byte) plot::x , (byte) plot::y)
(byte~) plot::$0 reg byte a 4.0
(byte~) plot::$1 reg byte a 4.0
(byte~) plot::$2 reg byte a 4.0
(byte~) plot::$3 reg byte a 4.0
(byte~) plot::$5 reg byte a 4.0
(byte~) plot::$6 reg byte a 4.0
(byte~) plot::$7 reg byte a 4.0
(byte~) plot::$8 reg byte a 4.0
(byte~) plot::$9 reg byte a 4.0
(label) plot::@return
(byte*) plot::plotter
(byte*) plot::plotter#0 plotter zp ZP_WORD:3 2.0
(byte*) plot::plotter#0 plotter zp ZP_WORD:3 3.0
(byte*) plot::plotter_x
(byte*) plot::plotter_x#1 plotter_x zp ZP_WORD:3 2.0
(byte*) plot::plotter_x#2 plotter_x zp ZP_WORD:3 0.8
@ -116,13 +115,12 @@ reg byte x [ init_plot_tables::y#2 init_plot_tables::y#1 ]
zp ZP_WORD:3 [ init_plot_tables::yoffs#2 init_plot_tables::yoffs#4 init_plot_tables::yoffs#1 init_screen::b#2 init_screen::b#1 init_screen::c#2 init_screen::c#1 plot::plotter_x#1 plot::plotter_x#2 plot::plotter#0 ]
reg byte y [ plot::x#0 ]
reg byte x [ plot::y#0 ]
reg byte a [ plot::$0 ]
reg byte a [ plot::$1 ]
reg byte a [ plot::$2 ]
zp ZP_WORD:5 [ plot::plotter_y#1 plot::plotter_y#2 ]
reg byte a [ plot::$3 ]
reg byte a [ plot::$5 ]
reg byte a [ plot::$6 ]
reg byte a [ plot::$7 ]
reg byte a [ plot::$8 ]
zp ZP_WORD:5 [ plot::plotter_y#1 plot::plotter_y#2 ]
reg byte a [ plot::$9 ]
reg byte a [ plot::$5 ]
reg byte a [ init_plot_tables::$0 ]
reg byte a [ init_plot_tables::$7 ]
reg byte a [ init_plot_tables::$8 ]

View File

@ -14,14 +14,14 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
[6] (byte*) main::sc#7 ← phi( main/(const byte*) SCREEN#0 main::@5/(byte*) main::sc#2 ) [ main::y#2 main::sc#7 ] ( main:2 [ main::y#2 main::sc#7 ] )
[6] (byte) main::y#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte) main::y#1 ) [ main::y#2 main::sc#7 ] ( main:2 [ main::y#2 main::sc#7 ] )
[7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] )
[7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[8] (byte) main::x#2 ← phi( main::@1/(byte/signed byte/word/signed word) 0 main::@3/(byte) main::x#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[8] (byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[8] (byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] )
[10] if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] )
[10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
to:main::@4
main::@4: scope:[main] from main::@2
[11] phi() [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )

View File

@ -37,29 +37,28 @@ proc (void()) main()
(byte*) main::sc ← (byte*) SCREEN
(byte) main::y ← (byte/signed byte/word/signed word) 0
main::@1:
(byte~) main::$1 ← (byte*) main::CHAR_A *idx (byte) main::y
(byte) main::bits ← (byte~) main::$1
(byte) main::bits ← *((byte*) main::CHAR_A + (byte) main::y)
(byte) main::x ← (byte/signed byte/word/signed word) 0
main::@2:
(byte) main::c ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
(boolean~) main::$4 ← ! (boolean~) main::$3
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
(boolean~) main::$3 ← ! (boolean~) main::$2
if((boolean~) main::$3) goto main::@3
(byte) main::c ← (byte) '*'
main::@3:
*((byte*) main::sc) ← (byte) main::c
(byte*) main::sc ← ++ (byte*) main::sc
(byte~) main::$5 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$4
(byte) main::x ← ++ (byte) main::x
(boolean~) main::$6 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(byte*~) main::$7 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$7
(boolean~) main::$5 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
(byte*~) main::$6 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$6
(byte) main::y ← ++ (byte) main::y
(boolean~) main::$8 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
*((byte*) PROCPORT) ← (byte/signed byte/word/signed word) 55
asm { cli }
main::@return:
@ -74,13 +73,12 @@ SYMBOLS
(void()) main()
(byte*~) main::$0
(byte~) main::$1
(byte~) main::$2
(boolean~) main::$2
(boolean~) main::$3
(boolean~) main::$4
(byte~) main::$5
(boolean~) main::$6
(byte*~) main::$7
(boolean~) main::$8
(byte~) main::$4
(boolean~) main::$5
(byte*~) main::$6
(boolean~) main::$7
(label) main::@1
(label) main::@2
(label) main::@3
@ -110,35 +108,34 @@ main: scope:[main] from
(byte) main::y ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@5
(byte~) main::$1 ← (byte*) main::CHAR_A *idx (byte) main::y
(byte) main::bits ← (byte~) main::$1
(byte) main::bits ← *((byte*) main::CHAR_A + (byte) main::y)
(byte) main::x ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::c ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
(boolean~) main::$4 ← ! (boolean~) main::$3
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
(boolean~) main::$3 ← ! (boolean~) main::$2
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
*((byte*) main::sc) ← (byte) main::c
(byte*) main::sc ← ++ (byte*) main::sc
(byte~) main::$5 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$4
(byte) main::x ← ++ (byte) main::x
(boolean~) main::$6 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte) main::c ← (byte) '*'
to:main::@3
main::@5: scope:[main] from main::@3
(byte*~) main::$7 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$7
(byte*~) main::$6 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$6
(byte) main::y ← ++ (byte) main::y
(boolean~) main::$8 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
*((byte*) PROCPORT) ← (byte/signed byte/word/signed word) 55
@ -167,35 +164,34 @@ main: scope:[main] from
(byte) main::y ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@5
(byte~) main::$1 ← (byte*) main::CHAR_A *idx (byte) main::y
(byte) main::bits ← (byte~) main::$1
(byte) main::bits ← *((byte*) main::CHAR_A + (byte) main::y)
(byte) main::x ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::c ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
(boolean~) main::$4 ← ! (boolean~) main::$3
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
(boolean~) main::$3 ← ! (boolean~) main::$2
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
*((byte*) main::sc) ← (byte) main::c
(byte*) main::sc ← ++ (byte*) main::sc
(byte~) main::$5 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$4
(byte) main::x ← ++ (byte) main::x
(boolean~) main::$6 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte) main::c ← (byte) '*'
to:main::@3
main::@5: scope:[main] from main::@3
(byte*~) main::$7 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$7
(byte*~) main::$6 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$6
(byte) main::y ← ++ (byte) main::y
(boolean~) main::$8 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
*((byte*) PROCPORT) ← (byte/signed byte/word/signed word) 55
@ -226,35 +222,34 @@ main: scope:[main] from @1
(byte) main::y ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@5
(byte~) main::$1 ← (byte*) main::CHAR_A *idx (byte) main::y
(byte) main::bits ← (byte~) main::$1
(byte) main::bits ← *((byte*) main::CHAR_A + (byte) main::y)
(byte) main::x ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::c ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
(boolean~) main::$4 ← ! (boolean~) main::$3
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits & (byte/word/signed word) 128
(boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
(boolean~) main::$3 ← ! (boolean~) main::$2
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
*((byte*) main::sc) ← (byte) main::c
(byte*) main::sc ← ++ (byte*) main::sc
(byte~) main::$5 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits << (byte/signed byte/word/signed word) 1
(byte) main::bits ← (byte~) main::$4
(byte) main::x ← ++ (byte) main::x
(boolean~) main::$6 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte) main::c ← (byte) '*'
to:main::@3
main::@5: scope:[main] from main::@3
(byte*~) main::$7 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$7
(byte*~) main::$6 ← (byte*) main::sc + (byte/signed byte/word/signed word) 32
(byte*) main::sc ← (byte*~) main::$6
(byte) main::y ← ++ (byte) main::y
(boolean~) main::$8 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
*((byte*) PROCPORT) ← (byte/signed byte/word/signed word) 55
@ -297,8 +292,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#2 )
(byte~) main::$1 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← (byte~) main::$1
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -309,10 +303,10 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#5 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
(boolean~) main::$4 ← ! (boolean~) main::$3
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
(boolean~) main::$3 ← ! (boolean~) main::$2
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte*) PROCPORT#5 ← phi( main::@2/(byte*) PROCPORT#6 main::@4/(byte*) PROCPORT#7 )
@ -324,11 +318,11 @@ main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
*((byte*) main::sc#3) ← (byte) main::c#2
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte~) main::$5 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$4
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte*) PROCPORT#7 ← phi( main::@2/(byte*) PROCPORT#6 )
@ -344,11 +338,11 @@ main::@5: scope:[main] from main::@3
(byte*) main::CHAR_A#2 ← phi( main::@3/(byte*) main::CHAR_A#3 )
(byte) main::y#3 ← phi( main::@3/(byte) main::y#4 )
(byte*) main::sc#4 ← phi( main::@3/(byte*) main::sc#1 )
(byte*~) main::$7 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$7
(byte*~) main::$6 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$6
(byte) main::y#1 ← ++ (byte) main::y#3
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
(byte*) PROCPORT#2 ← phi( main::@5/(byte*) PROCPORT#4 )
@ -390,8 +384,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#2 )
(byte~) main::$1 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← (byte~) main::$1
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -402,10 +395,10 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#5 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
(boolean~) main::$4 ← ! (boolean~) main::$3
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
(boolean~) main::$3 ← ! (boolean~) main::$2
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte*) PROCPORT#5 ← phi( main::@2/(byte*) PROCPORT#6 main::@4/(byte*) PROCPORT#7 )
@ -417,11 +410,11 @@ main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
*((byte*) main::sc#3) ← (byte) main::c#2
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte~) main::$5 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$4
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte*) PROCPORT#7 ← phi( main::@2/(byte*) PROCPORT#6 )
@ -437,11 +430,11 @@ main::@5: scope:[main] from main::@3
(byte*) main::CHAR_A#2 ← phi( main::@3/(byte*) main::CHAR_A#3 )
(byte) main::y#3 ← phi( main::@3/(byte) main::y#4 )
(byte*) main::sc#4 ← phi( main::@3/(byte*) main::sc#1 )
(byte*~) main::$7 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$7
(byte*~) main::$6 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$6
(byte) main::y#1 ← ++ (byte) main::y#3
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
(byte*) PROCPORT#2 ← phi( main::@5/(byte*) PROCPORT#4 )
@ -487,13 +480,12 @@ INITIAL SSA SYMBOL TABLE
(void()) main()
(byte*~) main::$0
(byte~) main::$1
(byte~) main::$2
(boolean~) main::$2
(boolean~) main::$3
(boolean~) main::$4
(byte~) main::$5
(boolean~) main::$6
(byte*~) main::$7
(boolean~) main::$8
(byte~) main::$4
(boolean~) main::$5
(byte*~) main::$6
(boolean~) main::$7
(label) main::@1
(label) main::@2
(label) main::@3
@ -566,8 +558,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#2 )
(byte~) main::$1 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← (byte~) main::$1
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -578,10 +569,10 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#5 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
(boolean~) main::$4 ← ! (boolean~) main::$3
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
(boolean~) main::$3 ← ! (boolean~) main::$2
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte*) PROCPORT#5 ← phi( main::@2/(byte*) PROCPORT#6 main::@4/(byte*) PROCPORT#7 )
@ -593,11 +584,11 @@ main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
*((byte*) main::sc#3) ← (byte) main::c#2
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte~) main::$5 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$4
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte*) PROCPORT#7 ← phi( main::@2/(byte*) PROCPORT#6 )
@ -613,11 +604,11 @@ main::@5: scope:[main] from main::@3
(byte*) main::CHAR_A#2 ← phi( main::@3/(byte*) main::CHAR_A#3 )
(byte) main::y#3 ← phi( main::@3/(byte) main::y#4 )
(byte*) main::sc#4 ← phi( main::@3/(byte*) main::sc#1 )
(byte*~) main::$7 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$7
(byte*~) main::$6 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$6
(byte) main::y#1 ← ++ (byte) main::y#3
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
(byte*) PROCPORT#2 ← phi( main::@5/(byte*) PROCPORT#4 )
@ -635,7 +626,7 @@ main::@return: scope:[main] from main::@6
to:@end
@end: scope:[] from @1
Inversing boolean not (boolean~) main::$4 ← (byte~) main::$2 == (byte/signed byte/word/signed word) 0 from (boolean~) main::$3 ← (byte~) main::$2 != (byte/signed byte/word/signed word) 0
Inversing boolean not (boolean~) main::$3 ← (byte~) main::$1 == (byte/signed byte/word/signed word) 0 from (boolean~) main::$2 ← (byte~) main::$1 != (byte/signed byte/word/signed word) 0
Succesful SSA optimization Pass2UnaryNotSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -659,8 +650,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#2 )
(byte~) main::$1 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← (byte~) main::$1
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -671,9 +661,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#5 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$4 ← (byte~) main::$2 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$1 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte*) PROCPORT#5 ← phi( main::@2/(byte*) PROCPORT#6 main::@4/(byte*) PROCPORT#7 )
@ -685,11 +675,11 @@ main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
*((byte*) main::sc#3) ← (byte) main::c#2
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte~) main::$5 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$5
(byte~) main::$4 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::bits#1 ← (byte~) main::$4
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte*) PROCPORT#7 ← phi( main::@2/(byte*) PROCPORT#6 )
@ -705,11 +695,11 @@ main::@5: scope:[main] from main::@3
(byte*) main::CHAR_A#2 ← phi( main::@3/(byte*) main::CHAR_A#3 )
(byte) main::y#3 ← phi( main::@3/(byte) main::y#4 )
(byte*) main::sc#4 ← phi( main::@3/(byte*) main::sc#1 )
(byte*~) main::$7 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$7
(byte*~) main::$6 ← (byte*) main::sc#4 + (byte/signed byte/word/signed word) 32
(byte*) main::sc#2 ← (byte*~) main::$6
(byte) main::y#1 ← ++ (byte) main::y#3
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
(byte*) PROCPORT#2 ← phi( main::@5/(byte*) PROCPORT#4 )
@ -732,8 +722,7 @@ Not aliassing across scopes: PROCPORT#1 PROCPORT#3
Not aliassing across scopes: SCREEN#1 SCREEN#2
Not aliassing across scopes: main::sc#0 SCREEN#1
Alias (byte*) main::CHAR_A#0 = (byte*~) main::$0
Alias (byte) main::bits#0 = (byte~) main::$1
Alias (byte) main::bits#1 = (byte~) main::$5
Alias (byte) main::bits#1 = (byte~) main::$4
Alias (byte*) main::sc#5 = (byte*) main::sc#6
Alias (byte) main::bits#2 = (byte) main::bits#4
Alias (byte) main::x#3 = (byte) main::x#4
@ -744,7 +733,7 @@ Alias (byte*) main::sc#1 = (byte*) main::sc#4
Alias (byte) main::y#3 = (byte) main::y#4
Alias (byte*) main::CHAR_A#2 = (byte*) main::CHAR_A#3
Alias (byte*) PROCPORT#2 = (byte*) PROCPORT#4 (byte*) PROCPORT#5
Alias (byte*) main::sc#2 = (byte*~) main::$7
Alias (byte*) main::sc#2 = (byte*~) main::$6
Alias (byte*) CHARGEN#0 = (byte*) CHARGEN#2
Alias (byte*) PROCPORT#0 = (byte*) PROCPORT#3
Alias (byte*) SCREEN#0 = (byte*) SCREEN#2
@ -770,7 +759,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#2 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -781,9 +770,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#5 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$4 ← (byte~) main::$2 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$1 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte*) PROCPORT#2 ← phi( main::@2/(byte*) PROCPORT#6 main::@4/(byte*) PROCPORT#6 )
@ -797,8 +786,8 @@ main::@3: scope:[main] from main::@2 main::@4
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte) main::bits#1 ← (byte) main::bits#3 << (byte/signed byte/word/signed word) 1
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte) main::c#1 ← (byte) '*'
@ -806,8 +795,8 @@ main::@4: scope:[main] from main::@2
main::@5: scope:[main] from main::@3
(byte*) main::sc#2 ← (byte*) main::sc#1 + (byte/signed byte/word/signed word) 32
(byte) main::y#1 ← ++ (byte) main::y#3
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
*((byte*) PROCPORT#2) ← (byte/signed byte/word/signed word) 55
@ -853,7 +842,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#2 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -864,9 +853,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$4 ← (byte~) main::$2 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$1 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
@ -874,8 +863,8 @@ main::@3: scope:[main] from main::@2 main::@4
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte) main::bits#1 ← (byte) main::bits#2 << (byte/signed byte/word/signed word) 1
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte) main::c#1 ← (byte) '*'
@ -883,8 +872,8 @@ main::@4: scope:[main] from main::@2
main::@5: scope:[main] from main::@3
(byte*) main::sc#2 ← (byte*) main::sc#1 + (byte/signed byte/word/signed word) 32
(byte) main::y#1 ← ++ (byte) main::y#3
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
*((byte*) PROCPORT#2) ← (byte/signed byte/word/signed word) 55
@ -927,7 +916,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#2 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -938,9 +927,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$4 ← (byte~) main::$2 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$1 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
@ -948,8 +937,8 @@ main::@3: scope:[main] from main::@2 main::@4
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte) main::bits#1 ← (byte) main::bits#2 << (byte/signed byte/word/signed word) 1
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte) main::c#1 ← (byte) '*'
@ -957,8 +946,8 @@ main::@4: scope:[main] from main::@2
main::@5: scope:[main] from main::@3
(byte*) main::sc#2 ← (byte*) main::sc#1 + (byte/signed byte/word/signed word) 32
(byte) main::y#1 ← ++ (byte) main::y#3
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
*((byte*) PROCPORT#2) ← (byte/signed byte/word/signed word) 55
@ -997,7 +986,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#1 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -1005,9 +994,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$4 ← (byte~) main::$2 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$4) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
(boolean~) main::$3 ← (byte~) main::$1 == (byte/signed byte/word/signed word) 0
if((boolean~) main::$3) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
@ -1015,8 +1004,8 @@ main::@3: scope:[main] from main::@2 main::@4
(byte*) main::sc#1 ← ++ (byte*) main::sc#3
(byte) main::bits#1 ← (byte) main::bits#2 << (byte/signed byte/word/signed word) 1
(byte) main::x#1 ← ++ (byte) main::x#2
(boolean~) main::$6 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$6) goto main::@2
(boolean~) main::$5 ← (byte) main::x#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$5) goto main::@2
to:main::@5
main::@4: scope:[main] from main::@2
(byte) main::c#1 ← (byte) '*'
@ -1024,8 +1013,8 @@ main::@4: scope:[main] from main::@2
main::@5: scope:[main] from main::@3
(byte*) main::sc#2 ← (byte*) main::sc#1 + (byte/signed byte/word/signed word) 32
(byte) main::y#1 ← ++ (byte) main::y#2
(boolean~) main::$8 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$8) goto main::@1
(boolean~) main::$7 ← (byte) main::y#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$7) goto main::@1
to:main::@6
main::@6: scope:[main] from main::@5
*((byte*) PROCPORT#8) ← (byte/signed byte/word/signed word) 55
@ -1039,9 +1028,9 @@ main::@return: scope:[main] from main::@6
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$4 if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
Simple Condition (boolean~) main::$6 if((byte) main::x#1!=(byte/signed byte/word/signed word) 8) goto main::@2
Simple Condition (boolean~) main::$8 if((byte) main::y#1!=(byte/signed byte/word/signed word) 8) goto main::@1
Simple Condition (boolean~) main::$3 if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
Simple Condition (boolean~) main::$5 if((byte) main::x#1!=(byte/signed byte/word/signed word) 8) goto main::@2
Simple Condition (boolean~) main::$7 if((byte) main::y#1!=(byte/signed byte/word/signed word) 8) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -1061,7 +1050,7 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#1 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
(byte) main::x#0 ← (byte/signed byte/word/signed word) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
@ -1069,8 +1058,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte) main::c#0 ← (byte) '.'
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) main::c#0 main::@4/(byte) main::c#1 )
@ -1122,14 +1111,14 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(const byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#1 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::x#2 ← phi( main::@1/(const byte) main::x#0 main::@3/(byte) main::x#1 )
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(const byte) main::c#0 main::@4/(const byte) main::c#1 )
@ -1173,14 +1162,14 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(const byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(const byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(const byte*) main::CHAR_A#0 main::@5/(byte*) main::CHAR_A#1 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::x#2 ← phi( main::@1/(const byte) main::x#0 main::@3/(byte) main::x#1 )
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(const byte) main::c#0 main::@4/(const byte) main::c#1 )
@ -1226,14 +1215,14 @@ main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(const byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(const byte) main::y#0 main::@5/(byte) main::y#1 )
(byte*) main::CHAR_A#1 ← phi( main/(const byte*) main::CHAR_A#0 )
(byte) main::bits#0 ← (byte*) main::CHAR_A#1 *idx (byte) main::y#2
(byte) main::bits#0 ← *((byte*) main::CHAR_A#1 + (byte) main::y#2)
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::x#2 ← phi( main::@1/(const byte) main::x#0 main::@3/(byte) main::x#1 )
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(const byte) main::c#0 main::@4/(const byte) main::c#1 )
@ -1275,14 +1264,14 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(const byte*) main::sc#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(const byte) main::y#0 main::@5/(byte) main::y#1 )
(byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2
(byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2)
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::x#2 ← phi( main::@1/(const byte) main::x#0 main::@3/(byte) main::x#1 )
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(const byte) main::c#0 main::@4/(const byte) main::c#1 )
@ -1311,10 +1300,8 @@ main::@return: scope:[main] from main::@6
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::y#2
Multiple usages for variable. Not optimizing sub-constant (byte*) main::sc#1
Not culling empty block because it shares successor with its predecessor. (label) main::@4
Multiple usages for variable. Not optimizing sub-constant (byte) main::y#2
Multiple usages for variable. Not optimizing sub-constant (byte*) main::sc#1
Inlining constant with var siblings (const byte) main::y#0
Inlining constant with var siblings (const byte) main::y#0
@ -1344,14 +1331,14 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
(byte*) main::sc#7 ← phi( main/(const byte*) SCREEN#0 main::@5/(byte*) main::sc#2 )
(byte) main::y#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte) main::y#1 )
(byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2
(byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2)
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
(byte) main::x#2 ← phi( main::@1/(byte/signed byte/word/signed word) 0 main::@3/(byte) main::x#1 )
(byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 )
(byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 )
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
to:main::@4
main::@3: scope:[main] from main::@2 main::@4
(byte) main::c#2 ← phi( main::@2/(byte) '.' main::@4/(byte) '*' )
@ -1391,7 +1378,7 @@ FINAL SYMBOL TABLE
(byte*) SCREEN
(const byte*) SCREEN#0 = ((byte*))(word/signed word) 1024
(void()) main()
(byte~) main::$2
(byte~) main::$1
(label) main::@1
(label) main::@2
(label) main::@3
@ -1437,7 +1424,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@7
(byte*) main::sc#7 ← phi( main/(const byte*) SCREEN#0 main::@7/(byte*~) main::sc#8 )
(byte) main::y#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@7/(byte~) main::y#7 )
(byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2
(byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2)
(byte~) main::bits#5 ← (byte) main::bits#0
(byte*~) main::sc#9 ← (byte*) main::sc#7
to:main::@2
@ -1445,8 +1432,8 @@ main::@2: scope:[main] from main::@1 main::@8
(byte) main::x#2 ← phi( main::@1/(byte/signed byte/word/signed word) 0 main::@8/(byte~) main::x#5 )
(byte*) main::sc#3 ← phi( main::@1/(byte*~) main::sc#9 main::@8/(byte*~) main::sc#10 )
(byte) main::bits#2 ← phi( main::@1/(byte~) main::bits#5 main::@8/(byte~) main::bits#6 )
(byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3
(byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128
if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@2
to:main::@3
@ -1518,7 +1505,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@7
[6] (byte*) main::sc#7 ← phi( main/(const byte*) SCREEN#0 main::@7/(byte*~) main::sc#8 ) [ main::y#2 main::sc#7 ]
[6] (byte) main::y#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@7/(byte~) main::y#7 ) [ main::y#2 main::sc#7 ]
[7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ]
[7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ]
[8] (byte~) main::bits#5 ← (byte) main::bits#0 [ main::y#2 main::sc#7 main::bits#5 ]
[9] (byte*~) main::sc#9 ← (byte*) main::sc#7 [ main::y#2 main::bits#5 main::sc#9 ]
to:main::@2
@ -1526,8 +1513,8 @@ main::@2: scope:[main] from main::@1 main::@8
[10] (byte) main::x#2 ← phi( main::@1/(byte/signed byte/word/signed word) 0 main::@8/(byte~) main::x#5 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[10] (byte*) main::sc#3 ← phi( main::@1/(byte*~) main::sc#9 main::@8/(byte*~) main::sc#10 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[10] (byte) main::bits#2 ← phi( main::@1/(byte~) main::bits#5 main::@8/(byte~) main::bits#6 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[11] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ]
[12] if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[11] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ]
[12] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
to:main::@4
main::@4: scope:[main] from main::@2
[13] phi() [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
@ -1608,14 +1595,14 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
[6] (byte*) main::sc#7 ← phi( main/(const byte*) SCREEN#0 main::@5/(byte*) main::sc#2 ) [ main::y#2 main::sc#7 ]
[6] (byte) main::y#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte) main::y#1 ) [ main::y#2 main::sc#7 ]
[7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ]
[7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ]
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[8] (byte) main::x#2 ← phi( main::@1/(byte/signed byte/word/signed word) 0 main::@3/(byte) main::x#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[8] (byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[8] (byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ]
[10] if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
[9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ]
[10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
to:main::@4
main::@4: scope:[main] from main::@2
[11] phi() [ main::y#2 main::bits#2 main::sc#3 main::x#2 ]
@ -1658,14 +1645,14 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
[6] (byte*) main::sc#7 ← phi( main/(const byte*) SCREEN#0 main::@5/(byte*) main::sc#2 ) [ main::y#2 main::sc#7 ] ( main:2 [ main::y#2 main::sc#7 ] )
[6] (byte) main::y#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte) main::y#1 ) [ main::y#2 main::sc#7 ] ( main:2 [ main::y#2 main::sc#7 ] )
[7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] )
[7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[8] (byte) main::x#2 ← phi( main::@1/(byte/signed byte/word/signed word) 0 main::@3/(byte) main::x#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[8] (byte*) main::sc#3 ← phi( main::@1/(byte*) main::sc#7 main::@3/(byte*) main::sc#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[8] (byte) main::bits#2 ← phi( main::@1/(byte) main::bits#0 main::@3/(byte) main::bits#1 ) [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] )
[10] if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
[9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] )
[10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
to:main::@4
main::@4: scope:[main] from main::@2
[11] phi() [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] )
@ -1726,7 +1713,7 @@ VARIABLE REGISTER WEIGHTS
(byte*) PROCPORT
(byte*) SCREEN
(void()) main()
(byte~) main::$2 202.0
(byte~) main::$1 202.0
(byte*) main::CHAR_A
(byte) main::bits
(byte) main::bits#0 22.0
@ -1752,20 +1739,20 @@ Initial phi equivalence classes
[ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ]
[ main::x#2 main::x#1 ]
[ main::c#2 ]
Added variable main::$2 to zero page equivalence class [ main::$2 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Complete equivalence classes
[ main::y#2 main::y#1 ]
[ main::bits#2 main::bits#0 main::bits#1 ]
[ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ]
[ main::x#2 main::x#1 ]
[ main::c#2 ]
[ main::$2 ]
[ main::$1 ]
Allocated zp ZP_BYTE:2 [ main::y#2 main::y#1 ]
Allocated zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ]
Allocated zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ]
Allocated zp ZP_BYTE:6 [ main::x#2 main::x#1 ]
Allocated zp ZP_BYTE:7 [ main::c#2 ]
Allocated zp ZP_BYTE:8 [ main::$2 ]
Allocated zp ZP_BYTE:8 [ main::$1 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -1792,7 +1779,7 @@ bend:
//SEG8 main
main: {
.const CHAR_A = CHARGEN+8
.label _2 = 8
.label _1 = 8
.label bits = 3
.label sc = 4
.label x = 6
@ -1821,7 +1808,7 @@ main: {
jmp b1
//SEG17 main::@1
b1:
//SEG18 [7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG18 [7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx y
lda CHAR_A,x
sta bits
@ -1841,12 +1828,12 @@ main: {
jmp b2
//SEG27 main::@2
b2:
//SEG28 [9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ) -- vbuz1=vbuz2_band_vbuc1
//SEG28 [9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ) -- vbuz1=vbuz2_band_vbuc1
lda bits
and #$80
sta _2
//SEG29 [10] if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuz1_eq_0_then_la1
lda _2
sta _1
//SEG29 [10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuz1_eq_0_then_la1
lda _1
beq b3_from_b2
//SEG30 [11] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
b4_from_b2:
@ -1918,7 +1905,7 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [5] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word) 50 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ) always clobbers reg byte a
Statement [9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::y#2 main::y#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:6 [ main::x#2 main::x#1 ]
@ -1929,8 +1916,8 @@ Removing always clobbered register reg byte y as potential for zp ZP_BYTE:6 [ ma
Statement [18] (byte*) main::sc#2 ← (byte*) main::sc#1 + (byte/signed byte/word/signed word) 32 [ main::y#2 main::sc#2 ] ( main:2 [ main::y#2 main::sc#2 ] ) always clobbers reg byte a
Statement [21] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word) 55 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [5] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word) 50 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) always clobbers reg byte a
Statement [9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ) always clobbers reg byte a
Statement [7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) always clobbers reg byte a
Statement [9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ) always clobbers reg byte a
Statement [13] *((byte*) main::sc#3) ← (byte) main::c#2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) always clobbers reg byte y
Statement [18] (byte*) main::sc#2 ← (byte*) main::sc#1 + (byte/signed byte/word/signed word) 32 [ main::y#2 main::sc#2 ] ( main:2 [ main::y#2 main::sc#2 ] ) always clobbers reg byte a
Statement [21] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word) 55 [ ] ( main:2 [ ] ) always clobbers reg byte a
@ -1939,13 +1926,13 @@ Potential registers zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] : zp
Potential registers zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] : zp ZP_WORD:4 ,
Potential registers zp ZP_BYTE:6 [ main::x#2 main::x#1 ] : zp ZP_BYTE:6 , reg byte x ,
Potential registers zp ZP_BYTE:7 [ main::c#2 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:8 [ main::$2 ] : zp ZP_BYTE:8 , 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 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 202: zp ZP_BYTE:8 [ main::$2 ] 176.75: zp ZP_BYTE:6 [ main::x#2 main::x#1 ] 134.19: zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] 123.92: zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] 101: zp ZP_BYTE:7 [ main::c#2 ] 19.04: zp ZP_BYTE:2 [ main::y#2 main::y#1 ]
Uplift Scope [main] 202: zp ZP_BYTE:8 [ main::$1 ] 176.75: zp ZP_BYTE:6 [ main::x#2 main::x#1 ] 134.19: zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] 123.92: zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] 101: zp ZP_BYTE:7 [ main::c#2 ] 19.04: zp ZP_BYTE:2 [ main::y#2 main::y#1 ]
Uplift Scope []
Uplifting [main] best 7352 combination reg byte a [ main::$2 ] reg byte x [ main::x#2 main::x#1 ] zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] reg byte a [ main::c#2 ] zp ZP_BYTE:2 [ main::y#2 main::y#1 ]
Uplifting [main] best 7352 combination reg byte a [ main::$1 ] reg byte x [ main::x#2 main::x#1 ] zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ] zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ] reg byte a [ main::c#2 ] zp ZP_BYTE:2 [ main::y#2 main::y#1 ]
Uplifting [] best 7352 combination
Attempting to uplift remaining variables inzp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ]
Uplifting [main] best 7352 combination zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ]
@ -2004,7 +1991,7 @@ main: {
jmp b1
//SEG17 main::@1
b1:
//SEG18 [7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG18 [7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx y
lda CHAR_A,x
sta bits
@ -2023,10 +2010,10 @@ main: {
jmp b2
//SEG27 main::@2
b2:
//SEG28 [9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ) -- vbuaa=vbuz1_band_vbuc1
//SEG28 [9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ) -- vbuaa=vbuz1_band_vbuc1
lda bits
and #$80
//SEG29 [10] if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuaa_eq_0_then_la1
//SEG29 [10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuaa_eq_0_then_la1
cmp #0
beq b3_from_b2
//SEG30 [11] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
@ -2140,7 +2127,7 @@ FINAL SYMBOL TABLE
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
(void()) main()
(byte~) main::$2 reg byte a 202.0
(byte~) main::$1 reg byte a 202.0
(label) main::@1
(label) main::@2
(label) main::@3
@ -2173,7 +2160,7 @@ zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ]
zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ]
reg byte x [ main::x#2 main::x#1 ]
reg byte a [ main::c#2 ]
reg byte a [ main::$2 ]
reg byte a [ main::$1 ]
FINAL CODE
//SEG0 Basic Upstart
@ -2216,7 +2203,7 @@ main: {
//SEG16 [6] phi (byte) main::y#2 = (byte) main::y#1 [phi:main::@5->main::@1#1] -- register_copy
//SEG17 main::@1
b1:
//SEG18 [7] (byte) main::bits#0 ← (const byte*) main::CHAR_A#0 *idx (byte) main::y#2 [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG18 [7] (byte) main::bits#0 ← *((const byte*) main::CHAR_A#0 + (byte) main::y#2) [ main::y#2 main::sc#7 main::bits#0 ] ( main:2 [ main::y#2 main::sc#7 main::bits#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx y
lda CHAR_A,x
sta bits
@ -2231,10 +2218,10 @@ main: {
//SEG26 [8] phi (byte) main::bits#2 = (byte) main::bits#1 [phi:main::@3->main::@2#2] -- register_copy
//SEG27 main::@2
b2:
//SEG28 [9] (byte~) main::$2 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$2 ] ) -- vbuaa=vbuz1_band_vbuc1
//SEG28 [9] (byte~) main::$1 ← (byte) main::bits#2 & (byte/word/signed word) 128 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 main::$1 ] ) -- vbuaa=vbuz1_band_vbuc1
lda bits
and #$80
//SEG29 [10] if((byte~) main::$2==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuaa_eq_0_then_la1
//SEG29 [10] if((byte~) main::$1==(byte/signed byte/word/signed word) 0) goto main::@3 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ( main:2 [ main::y#2 main::bits#2 main::sc#3 main::x#2 ] ) -- vbuaa_eq_0_then_la1
cmp #0
beq b4
//SEG30 [11] phi from main::@2 to main::@4 [phi:main::@2->main::@4]

View File

@ -8,7 +8,7 @@
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
(void()) main()
(byte~) main::$2 reg byte a 202.0
(byte~) main::$1 reg byte a 202.0
(label) main::@1
(label) main::@2
(label) main::@3
@ -41,4 +41,4 @@ zp ZP_BYTE:3 [ main::bits#2 main::bits#0 main::bits#1 ]
zp ZP_WORD:4 [ main::sc#3 main::sc#7 main::sc#2 main::sc#1 ]
reg byte x [ main::x#2 main::x#1 ]
reg byte a [ main::c#2 ]
reg byte a [ main::$2 ]
reg byte a [ main::$1 ]

View File

@ -48,11 +48,10 @@ line::@1: scope:[line] from line
to:line::@return
plot: scope:[plot] from line::@1 line::@2
[23] (byte) plot::x#2 ← phi( line::@1/(const byte) line::x0#0 line::@2/(byte) plot::x#1 ) [ plot::x#2 ] ( main:2::line:11::plot:17 [ line::x#2 plot::x#2 ] main:2::line:11::plot:22 [ plot::x#2 ] )
[24] (byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2 [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] )
[25] (byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0 [ plot::idx#0 plot::$1 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$1 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$1 ] )
[26] (byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$2 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$2 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$2 ] )
[27] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
[24] (byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2) [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] )
[25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$0 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$0 ] )
[26] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
to:plot::@return
plot::@return: scope:[plot] from plot
[28] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
[27] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
to:@return

View File

@ -62,11 +62,9 @@ line::@return:
return
endproc // line()
proc (void()) plot((byte) plot::x)
(byte~) plot::$0 ← (byte[]) plots *idx (byte) plot::x
(byte) plot::idx ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN *idx (byte) plot::idx
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$2
(byte) plot::idx ← *((byte[]) plots + (byte) plot::x)
(byte~) plot::$0 ← *((byte*) SCREEN + (byte) plot::idx) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$0
plot::@return:
return
endproc // plot()
@ -96,8 +94,6 @@ SYMBOLS
(byte) main::i
(void()) plot((byte) plot::x)
(byte~) plot::$0
(byte~) plot::$1
(byte~) plot::$2
(label) plot::@return
(byte) plot::idx
(byte) plot::x
@ -162,11 +158,9 @@ line::@return: scope:[line] from line::@3
@2: scope:[] from @1
to:@3
plot: scope:[plot] from
(byte~) plot::$0 ← (byte[]) plots *idx (byte) plot::x
(byte) plot::idx ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN *idx (byte) plot::idx
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$2
(byte) plot::idx ← *((byte[]) plots + (byte) plot::x)
(byte~) plot::$0 ← *((byte*) SCREEN + (byte) plot::idx) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -229,11 +223,9 @@ line::@return: scope:[line] from line::@1 line::@2
return
to:@return
plot: scope:[plot] from
(byte~) plot::$0 ← (byte[]) plots *idx (byte) plot::x
(byte) plot::idx ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN *idx (byte) plot::idx
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$2
(byte) plot::idx ← *((byte[]) plots + (byte) plot::x)
(byte~) plot::$0 ← *((byte*) SCREEN + (byte) plot::idx) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -298,11 +290,9 @@ line::@return: scope:[line] from line::@7 line::@8
return
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte~) plot::$0 ← (byte[]) plots *idx (byte) plot::x
(byte) plot::idx ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN *idx (byte) plot::idx
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$2
(byte) plot::idx ← *((byte[]) plots + (byte) plot::x)
(byte~) plot::$0 ← *((byte*) SCREEN + (byte) plot::idx) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN + (byte) plot::idx) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -381,11 +371,9 @@ line::@return: scope:[line] from line::@7 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte) plot::idx#0 ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -461,11 +449,9 @@ line::@return: scope:[line] from line::@7 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte) plot::idx#0 ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -522,8 +508,6 @@ INITIAL SSA SYMBOL TABLE
(byte) main::i#2
(void()) plot((byte) plot::x)
(byte~) plot::$0
(byte~) plot::$1
(byte~) plot::$2
(label) plot::@return
(byte) plot::idx
(byte) plot::idx#0
@ -599,11 +583,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte) plot::idx#0 ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -676,11 +658,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte) plot::idx#0 ← (byte~) plot::$0
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -699,7 +679,6 @@ Alias (byte) line::x0#1 = (byte) line::x0#2 (byte) line::x0#3 (byte) line::x#0
Alias (byte) line::x1#1 = (byte) line::x1#4
Alias (byte) line::x#2 = (byte) line::x#3
Alias (byte) line::x1#2 = (byte) line::x1#3
Alias (byte) plot::idx#0 = (byte~) plot::$0
Succesful SSA optimization Pass2AliasElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -756,10 +735,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -831,10 +809,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -900,10 +877,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -966,10 +942,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -1029,10 +1004,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -1087,10 +1061,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(const byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -1145,10 +1118,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(const byte) plot::x#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -1212,10 +1184,9 @@ line::@return: scope:[line] from line::@1 line::@8
to:@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(const byte) line::x0#0 line::@2/(byte) plot::x#1 )
(byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -1252,8 +1223,7 @@ FINAL SYMBOL TABLE
(byte) main::i#1
(byte) main::i#2
(void()) plot((byte) plot::x)
(byte~) plot::$1
(byte~) plot::$2
(byte~) plot::$0
(label) plot::@return
(byte) plot::idx
(byte) plot::idx#0
@ -1319,10 +1289,9 @@ line::@1: scope:[line] from line
to:line::@return
plot: scope:[plot] from line::@1 line::@2
(byte) plot::x#2 ← phi( line::@1/(const byte) line::x0#0 line::@2/(byte~) plot::x#3 )
(byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2
(byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
(byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2)
(byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1
*((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0
to:plot::@return
plot::@return: scope:[plot] from plot
return
@ -1401,13 +1370,12 @@ line::@1: scope:[line] from line
to:line::@return
plot: scope:[plot] from line::@1 line::@2
[26] (byte) plot::x#2 ← phi( line::@1/(const byte) line::x0#0 line::@2/(byte~) plot::x#3 ) [ plot::x#2 ]
[27] (byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2 [ plot::idx#0 ]
[28] (byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0 [ plot::idx#0 plot::$1 ]
[29] (byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$2 ]
[30] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2 [ ]
[27] (byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2) [ plot::idx#0 ]
[28] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ]
[29] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0 [ ]
to:plot::@return
plot::@return: scope:[plot] from plot
[31] return [ ]
[30] return [ ]
to:@return
Created 3 initial phi equivalence classes
@ -1478,13 +1446,12 @@ line::@1: scope:[line] from line
to:line::@return
plot: scope:[plot] from line::@1 line::@2
[23] (byte) plot::x#2 ← phi( line::@1/(const byte) line::x0#0 line::@2/(byte) plot::x#1 ) [ plot::x#2 ]
[24] (byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2 [ plot::idx#0 ]
[25] (byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0 [ plot::idx#0 plot::$1 ]
[26] (byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$2 ]
[27] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2 [ ]
[24] (byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2) [ plot::idx#0 ]
[25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ]
[26] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0 [ ]
to:plot::@return
plot::@return: scope:[plot] from plot
[28] return [ ]
[27] return [ ]
to:@return
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -1538,13 +1505,12 @@ line::@1: scope:[line] from line
to:line::@return
plot: scope:[plot] from line::@1 line::@2
[23] (byte) plot::x#2 ← phi( line::@1/(const byte) line::x0#0 line::@2/(byte) plot::x#1 ) [ plot::x#2 ] ( main:2::line:11::plot:17 [ line::x#2 plot::x#2 ] main:2::line:11::plot:22 [ plot::x#2 ] )
[24] (byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2 [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] )
[25] (byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0 [ plot::idx#0 plot::$1 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$1 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$1 ] )
[26] (byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$2 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$2 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$2 ] )
[27] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
[24] (byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2) [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] )
[25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$0 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$0 ] )
[26] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
to:plot::@return
plot::@return: scope:[plot] from plot
[28] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
[27] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
to:@return
DOMINATORS
@ -1601,10 +1567,9 @@ VARIABLE REGISTER WEIGHTS
(byte) main::i#1 16.5
(byte) main::i#2 18.333333333333332
(void()) plot((byte) plot::x)
(byte~) plot::$1 4.0
(byte~) plot::$2 4.0
(byte~) plot::$0 4.0
(byte) plot::idx
(byte) plot::idx#0 2.0
(byte) plot::idx#0 3.0
(byte) plot::x
(byte) plot::x#1 202.0
(byte) plot::x#2 103.0
@ -1615,21 +1580,18 @@ Initial phi equivalence classes
[ line::x#2 line::x#1 ]
[ plot::x#2 plot::x#1 ]
Added variable plot::idx#0 to zero page equivalence class [ plot::idx#0 ]
Added variable plot::$1 to zero page equivalence class [ plot::$1 ]
Added variable plot::$2 to zero page equivalence class [ plot::$2 ]
Added variable plot::$0 to zero page equivalence class [ plot::$0 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ line::x#2 line::x#1 ]
[ plot::x#2 plot::x#1 ]
[ plot::idx#0 ]
[ plot::$1 ]
[ plot::$2 ]
[ plot::$0 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ line::x#2 line::x#1 ]
Allocated zp ZP_BYTE:4 [ plot::x#2 plot::x#1 ]
Allocated zp ZP_BYTE:5 [ plot::idx#0 ]
Allocated zp ZP_BYTE:6 [ plot::$1 ]
Allocated zp ZP_BYTE:7 [ plot::$2 ]
Allocated zp ZP_BYTE:6 [ plot::$0 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -1762,56 +1724,54 @@ line: {
}
//SEG47 plot
plot: {
.label _1 = 6
.label _2 = 7
.label _0 = 6
.label x = 4
.label idx = 5
//SEG48 [24] (byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2 [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG48 [24] (byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2) [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx x
lda plots,x
sta idx
//SEG49 [25] (byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0 [ plot::idx#0 plot::$1 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$1 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$1 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG49 [25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$0 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2_plus_1
ldx idx
lda SCREEN,x
sta _1
//SEG50 [26] (byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$2 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$2 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$2 ] ) -- vbuz1=vbuz2_plus_1
lda _1
clc
adc #1
sta _2
//SEG51 [27] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _2
sta _0
//SEG50 [26] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _0
ldx idx
sta SCREEN,x
jmp breturn
//SEG52 plot::@return
//SEG51 plot::@return
breturn:
//SEG53 [28] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
//SEG52 [27] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Equivalence Class zp ZP_BYTE:6 [ plot::$1 ] has ALU potential.
Statement [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [14] if((const byte) line::x0#0>=(const byte) line::x1#0) goto line::@1 [ ] ( main:2::line:11 [ ] ) always clobbers reg byte a
Statement [25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$0 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ line::x#2 line::x#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ plot::idx#0 ]
Statement [6] *((const byte[]) plots#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [14] if((const byte) line::x0#0>=(const byte) line::x1#0) goto line::@1 [ ] ( main:2::line:11 [ ] ) always clobbers reg byte a
Statement [25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$0 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$0 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ line::x#2 line::x#1 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ line::x#2 line::x#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ plot::x#2 plot::x#1 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:5 [ plot::idx#0 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:6 [ plot::$1 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y , reg byte alu ,
Potential registers zp ZP_BYTE:7 [ plot::$2 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:5 [ plot::idx#0 ] : zp ZP_BYTE:5 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:6 [ plot::$0 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [plot] 305: zp ZP_BYTE:4 [ plot::x#2 plot::x#1 ] 4: zp ZP_BYTE:6 [ plot::$1 ] 4: zp ZP_BYTE:7 [ plot::$2 ] 2: zp ZP_BYTE:5 [ plot::idx#0 ]
Uplift Scope [plot] 305: zp ZP_BYTE:4 [ plot::x#2 plot::x#1 ] 4: zp ZP_BYTE:6 [ plot::$0 ] 3: zp ZP_BYTE:5 [ plot::idx#0 ]
Uplift Scope [line] 252.5: zp ZP_BYTE:3 [ line::x#2 line::x#1 ]
Uplift Scope [main] 34.83: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [plot] best 3894 combination reg byte y [ plot::x#2 plot::x#1 ] reg byte a [ plot::$1 ] reg byte a [ plot::$2 ] reg byte x [ plot::idx#0 ]
Uplifting [plot] best 3894 combination reg byte y [ plot::x#2 plot::x#1 ] reg byte a [ plot::$0 ] reg byte x [ plot::idx#0 ]
Uplifting [line] best 3894 combination zp ZP_BYTE:3 [ line::x#2 line::x#1 ]
Uplifting [main] best 3744 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 3744 combination
@ -1944,19 +1904,18 @@ line: {
}
//SEG47 plot
plot: {
//SEG48 [24] (byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2 [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] ) -- vbuxx=pbuc1_derefidx_vbuyy
//SEG48 [24] (byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2) [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] ) -- vbuxx=pbuc1_derefidx_vbuyy
ldx plots,y
//SEG49 [25] (byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0 [ plot::idx#0 plot::$1 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$1 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG49 [25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$0 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx_plus_1
lda SCREEN,x
//SEG50 [26] (byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$2 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$2 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$2 ] ) -- vbuaa=vbuaa_plus_1
clc
adc #1
//SEG51 [27] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] ) -- pbuc1_derefidx_vbuxx=vbuaa
//SEG50 [26] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN,x
jmp breturn
//SEG52 plot::@return
//SEG51 plot::@return
breturn:
//SEG53 [28] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
//SEG52 [27] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
rts
}
@ -2034,11 +1993,10 @@ FINAL SYMBOL TABLE
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 18.333333333333332
(void()) plot((byte) plot::x)
(byte~) plot::$1 reg byte a 4.0
(byte~) plot::$2 reg byte a 4.0
(byte~) plot::$0 reg byte a 4.0
(label) plot::@return
(byte) plot::idx
(byte) plot::idx#0 reg byte x 2.0
(byte) plot::idx#0 reg byte x 3.0
(byte) plot::x
(byte) plot::x#1 reg byte y 202.0
(byte) plot::x#2 reg byte y 103.0
@ -2049,8 +2007,7 @@ reg byte x [ main::i#2 main::i#1 ]
zp ZP_BYTE:2 [ line::x#2 line::x#1 ]
reg byte y [ plot::x#2 plot::x#1 ]
reg byte x [ plot::idx#0 ]
reg byte a [ plot::$1 ]
reg byte a [ plot::$2 ]
reg byte a [ plot::$0 ]
FINAL CODE
//SEG0 Basic Upstart
@ -2145,17 +2102,16 @@ line: {
}
//SEG47 plot
plot: {
//SEG48 [24] (byte) plot::idx#0 ← (const byte[]) plots#0 *idx (byte) plot::x#2 [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] ) -- vbuxx=pbuc1_derefidx_vbuyy
//SEG48 [24] (byte) plot::idx#0 ← *((const byte[]) plots#0 + (byte) plot::x#2) [ plot::idx#0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 ] main:2::line:11::plot:22 [ plot::idx#0 ] ) -- vbuxx=pbuc1_derefidx_vbuyy
ldx plots,y
//SEG49 [25] (byte~) plot::$1 ← (const byte*) SCREEN#0 *idx (byte) plot::idx#0 [ plot::idx#0 plot::$1 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$1 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG49 [25] (byte~) plot::$0 ← *((const byte*) SCREEN#0 + (byte) plot::idx#0) + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$0 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$0 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx_plus_1
lda SCREEN,x
//SEG50 [26] (byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1 [ plot::idx#0 plot::$2 ] ( main:2::line:11::plot:17 [ line::x#2 plot::idx#0 plot::$2 ] main:2::line:11::plot:22 [ plot::idx#0 plot::$2 ] ) -- vbuaa=vbuaa_plus_1
clc
adc #1
//SEG51 [27] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] ) -- pbuc1_derefidx_vbuxx=vbuaa
//SEG50 [26] *((const byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$0 [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN,x
//SEG52 plot::@return
//SEG53 [28] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
//SEG51 plot::@return
//SEG52 [27] return [ ] ( main:2::line:11::plot:17 [ line::x#2 ] main:2::line:11::plot:22 [ ] )
rts
}

View File

@ -24,11 +24,10 @@
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 18.333333333333332
(void()) plot((byte) plot::x)
(byte~) plot::$1 reg byte a 4.0
(byte~) plot::$2 reg byte a 4.0
(byte~) plot::$0 reg byte a 4.0
(label) plot::@return
(byte) plot::idx
(byte) plot::idx#0 reg byte x 2.0
(byte) plot::idx#0 reg byte x 3.0
(byte) plot::x
(byte) plot::x#1 reg byte y 202.0
(byte) plot::x#2 reg byte y 103.0
@ -39,5 +38,4 @@ reg byte x [ main::i#2 main::i#1 ]
zp ZP_BYTE:2 [ line::x#2 line::x#1 ]
reg byte y [ plot::x#2 plot::x#1 ]
reg byte x [ plot::idx#0 ]
reg byte a [ plot::$1 ]
reg byte a [ plot::$2 ]
reg byte a [ plot::$0 ]

View File

@ -0,0 +1,259 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.const BGCOL = $d021
.const GREEN = 5
.const RED = 2
.label char_cursor = 2
.label line_cursor = 7
jsr main
main: {
jsr print_cls
lda #GREEN
sta BGCOL
jsr test_bytes
jsr test_sbytes
rts
}
test_sbytes: {
.const bb = 0
.const bc = bb+2
.const bf = -$7f-$7f
.const bd = bc-4
.const be = -bd
lda #0
sta assert_sbyte.c
lda #bb
tax
lda #<msg
sta assert_sbyte.msg
lda #>msg
sta assert_sbyte.msg+1
jsr assert_sbyte
lda #2
sta assert_sbyte.c
lda #bc
tax
lda #<msg1
sta assert_sbyte.msg
lda #>msg1
sta assert_sbyte.msg+1
jsr assert_sbyte
lda #-2
sta assert_sbyte.c
lda #bd
tax
lda #<msg2
sta assert_sbyte.msg
lda #>msg2
sta assert_sbyte.msg+1
jsr assert_sbyte
lda #2
sta assert_sbyte.c
lda #be
tax
lda #<msg3
sta assert_sbyte.msg
lda #>msg3
sta assert_sbyte.msg+1
jsr assert_sbyte
lda #2
sta assert_sbyte.c
lda #bf
tax
lda #<msg4
sta assert_sbyte.msg
lda #>msg4
sta assert_sbyte.msg+1
jsr assert_sbyte
rts
msg: .text "0=0@"
msg1: .text "0+2=2@"
msg2: .text "0+2-4=-2@"
msg3: .text "-(0+2-4)=2@"
msg4: .text "-127-127=2@"
}
assert_sbyte: {
.label msg = 2
.label c = 4
lda msg
sta print_str.str
lda msg+1
sta print_str.str+1
lda line_cursor
sta char_cursor
lda line_cursor+1
sta char_cursor+1
jsr print_str
lda #<str
sta print_str.str
lda #>str
sta print_str.str+1
jsr print_str
cpx c
beq b1
lda #RED
sta BGCOL
lda #<str2
sta print_str.str
lda #>str2
sta print_str.str+1
jsr print_str
b2:
jsr print_ln
rts
b1:
lda #<str1
sta print_str.str
lda #>str1
sta print_str.str+1
jsr print_str
jmp b2
str: .text " @"
str1: .text "ok@"
str2: .text "fail!@"
}
print_str: {
.label str = 5
b1:
ldy #0
lda (str),y
cmp #'@'
bne b2
rts
b2:
ldy #0
lda (str),y
sta (char_cursor),y
inc char_cursor
bne !+
inc char_cursor+1
!:
inc str
bne !+
inc str+1
!:
jmp b1
}
print_ln: {
b1:
lda line_cursor
clc
adc #$28
sta line_cursor
bcc !+
inc line_cursor+1
!:
lda line_cursor+1
cmp char_cursor+1
bcc b1
bne !+
lda line_cursor
cmp char_cursor
bcc b1
!:
rts
}
test_bytes: {
.const bb = 0
.const bc = bb+2
.const bd = bc-4
lda #<$400
sta line_cursor
lda #>$400
sta line_cursor+1
lda #0
sta assert_byte.c
ldx #bb
lda #<$400
sta char_cursor
lda #>$400
sta char_cursor+1
lda #<msg
sta assert_byte.msg
lda #>msg
sta assert_byte.msg+1
jsr assert_byte
lda line_cursor
sta char_cursor
lda line_cursor+1
sta char_cursor+1
lda #2
sta assert_byte.c
ldx #bc
lda #<msg1
sta assert_byte.msg
lda #>msg1
sta assert_byte.msg+1
jsr assert_byte
lda line_cursor
sta char_cursor
lda line_cursor+1
sta char_cursor+1
lda #$fe
sta assert_byte.c
ldx #bd
lda #<msg2
sta assert_byte.msg
lda #>msg2
sta assert_byte.msg+1
jsr assert_byte
rts
msg: .text "0=0@"
msg1: .text "0+2=2@"
msg2: .text "0+2-4=254@"
}
assert_byte: {
.label msg = 5
.label c = 4
jsr print_str
lda #<str
sta print_str.str
lda #>str
sta print_str.str+1
jsr print_str
cpx c
beq b1
lda #RED
sta BGCOL
lda #<str2
sta print_str.str
lda #>str2
sta print_str.str+1
jsr print_str
b2:
jsr print_ln
rts
b1:
lda #<str1
sta print_str.str
lda #>str1
sta print_str.str+1
jsr print_str
jmp b2
str: .text " @"
str1: .text "ok@"
str2: .text "fail!@"
}
print_cls: {
.label sc = 2
lda #<$400
sta sc
lda #>$400
sta sc+1
b1:
ldy #0
lda #' '
sta (sc),y
inc sc
bne !+
inc sc+1
!:
lda sc+1
cmp #>$400+$3e8
bne b1
lda sc
cmp #<$400+$3e8
bne b1
rts
}

View File

@ -0,0 +1,163 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@11
@11: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @11
[3] phi() [ ] ( )
main: scope:[main] from @11
[4] phi() [ ] ( main:2 [ ] )
[5] call print_cls param-assignment [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main
[6] *((const byte*) BGCOL#0) ← (const byte) GREEN#0 [ ] ( main:2 [ ] )
[7] call test_bytes param-assignment [ line_cursor#1 ] ( main:2 [ line_cursor#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1
[8] phi() [ line_cursor#1 ] ( main:2 [ line_cursor#1 ] )
[9] call test_sbytes param-assignment [ ] ( main:2 [ ] )
to:main::@return
main::@return: scope:[main] from main::@2
[10] return [ ] ( main:2 [ ] )
to:@return
test_sbytes: scope:[test_sbytes] from main::@2
[11] phi() [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
[12] call assert_sbyte param-assignment [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
to:test_sbytes::@1
test_sbytes::@1: scope:[test_sbytes] from test_sbytes
[13] phi() [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
[14] call assert_sbyte param-assignment [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
to:test_sbytes::@2
test_sbytes::@2: scope:[test_sbytes] from test_sbytes::@1
[15] phi() [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
[16] call assert_sbyte param-assignment [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
to:test_sbytes::@3
test_sbytes::@3: scope:[test_sbytes] from test_sbytes::@2
[17] phi() [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
[18] call assert_sbyte param-assignment [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
to:test_sbytes::@4
test_sbytes::@4: scope:[test_sbytes] from test_sbytes::@3
[19] phi() [ line_cursor#1 ] ( main:2::test_sbytes:9 [ line_cursor#1 ] )
[20] call assert_sbyte param-assignment [ ] ( main:2::test_sbytes:9 [ ] )
to:test_sbytes::@return
test_sbytes::@return: scope:[test_sbytes] from test_sbytes::@4
[21] return [ ] ( main:2::test_sbytes:9 [ ] )
to:@return
assert_sbyte: scope:[assert_sbyte] from test_sbytes test_sbytes::@1 test_sbytes::@2 test_sbytes::@3 test_sbytes::@4
[22] (signed byte) assert_sbyte::c#5 ← phi( test_sbytes/(byte/signed byte/word/signed word) 0 test_sbytes::@1/(byte/signed byte/word/signed word) 2 test_sbytes::@2/-(byte/signed byte/word/signed word) 2 test_sbytes::@3/(byte/signed byte/word/signed word) 2 test_sbytes::@4/(byte/signed byte/word/signed word) 2 ) [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] )
[22] (signed byte) assert_sbyte::b#5 ← phi( test_sbytes/(const signed byte) test_sbytes::bb#0 test_sbytes::@1/(const signed byte) test_sbytes::bc#0 test_sbytes::@2/(const signed byte) test_sbytes::bd#0 test_sbytes::@3/(const signed byte) test_sbytes::be#0 test_sbytes::@4/(const signed byte) test_sbytes::bf#0 ) [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] )
[22] (byte*) assert_sbyte::msg#5 ← phi( test_sbytes/(const byte[]) test_sbytes::msg test_sbytes::@1/(const byte[]) test_sbytes::msg1 test_sbytes::@2/(const byte[]) test_sbytes::msg2 test_sbytes::@3/(const byte[]) test_sbytes::msg3 test_sbytes::@4/(const byte[]) test_sbytes::msg4 ) [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::msg#5 assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 ] )
[23] (byte*) print_str::str#5 ← (byte*) assert_sbyte::msg#5 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 line_cursor#1 ] )
[24] (byte*~) char_cursor#82 ← (byte*) line_cursor#1 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 char_cursor#82 line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 char_cursor#82 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 char_cursor#82 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 char_cursor#82 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 char_cursor#82 line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::b#5 assert_sbyte::c#5 print_str::str#5 char_cursor#82 line_cursor#1 ] )
[25] call print_str param-assignment [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] )
to:assert_sbyte::@5
assert_sbyte::@5: scope:[assert_sbyte] from assert_sbyte
[26] phi() [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] )
[27] call print_str param-assignment [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] )
to:assert_sbyte::@6
assert_sbyte::@6: scope:[assert_sbyte] from assert_sbyte::@5
[28] if((signed byte) assert_sbyte::b#5==(signed byte) assert_sbyte::c#5) goto assert_sbyte::@1 [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 char_cursor#2 ] )
to:assert_sbyte::@3
assert_sbyte::@3: scope:[assert_sbyte] from assert_sbyte::@6
[29] *((const byte*) BGCOL#0) ← (const byte) RED#0 [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 char_cursor#2 ] )
[30] call print_str param-assignment [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 char_cursor#2 ] )
to:assert_sbyte::@2
assert_sbyte::@2: scope:[assert_sbyte] from assert_sbyte::@1 assert_sbyte::@3
[31] phi() [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 char_cursor#2 ] )
[32] call print_ln param-assignment [ line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 ] )
to:assert_sbyte::@return
assert_sbyte::@return: scope:[assert_sbyte] from assert_sbyte::@2
[33] return [ line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 ] )
to:@return
assert_sbyte::@1: scope:[assert_sbyte] from assert_sbyte::@6
[34] phi() [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 char_cursor#2 ] )
[35] call print_str param-assignment [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20 [ line_cursor#1 char_cursor#2 ] )
to:assert_sbyte::@2
print_str: scope:[print_str] from assert_byte assert_byte::@1 assert_byte::@3 assert_byte::@5 assert_sbyte assert_sbyte::@1 assert_sbyte::@3 assert_sbyte::@5
[36] (byte*) char_cursor#75 ← phi( assert_byte/(byte*) char_cursor#65 assert_byte::@1/(byte*) char_cursor#2 assert_byte::@3/(byte*) char_cursor#2 assert_byte::@5/(byte*) char_cursor#2 assert_sbyte/(byte*~) char_cursor#82 assert_sbyte::@1/(byte*) char_cursor#2 assert_sbyte::@3/(byte*) char_cursor#2 assert_sbyte::@5/(byte*) char_cursor#2 ) [ print_str::str#11 char_cursor#75 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 print_str::str#11 char_cursor#75 ] )
[36] (byte*) print_str::str#11 ← phi( assert_byte/(byte*) print_str::str#1 assert_byte::@1/(const byte[]) assert_byte::str1 assert_byte::@3/(const byte[]) assert_byte::str2 assert_byte::@5/(const byte[]) assert_byte::str assert_sbyte/(byte*) print_str::str#5 assert_sbyte::@1/(const byte[]) assert_sbyte::str1 assert_sbyte::@3/(const byte[]) assert_sbyte::str2 assert_sbyte::@5/(const byte[]) assert_sbyte::str ) [ print_str::str#11 char_cursor#75 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 print_str::str#11 char_cursor#75 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 print_str::str#11 char_cursor#75 ] )
to:print_str::@1
print_str::@1: scope:[print_str] from print_str print_str::@2
[37] (byte*) char_cursor#2 ← phi( print_str/(byte*) char_cursor#75 print_str::@2/(byte*) char_cursor#1 ) [ char_cursor#2 print_str::str#10 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] )
[37] (byte*) print_str::str#10 ← phi( print_str/(byte*) print_str::str#11 print_str::@2/(byte*) print_str::str#0 ) [ char_cursor#2 print_str::str#10 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] )
[38] if(*((byte*) print_str::str#10)!=(byte) '@') goto print_str::@2 [ char_cursor#2 print_str::str#10 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] )
to:print_str::@return
print_str::@return: scope:[print_str] from print_str::@1
[39] return [ char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 char_cursor#2 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 char_cursor#2 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 char_cursor#2 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 char_cursor#2 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 char_cursor#2 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 char_cursor#2 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 char_cursor#2 ] )
to:@return
print_str::@2: scope:[print_str] from print_str::@1
[40] *((byte*) char_cursor#2) ← *((byte*) print_str::str#10) [ char_cursor#2 print_str::str#10 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 char_cursor#2 print_str::str#10 ] )
[41] (byte*) char_cursor#1 ← ++ (byte*) char_cursor#2 [ print_str::str#10 char_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 print_str::str#10 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 print_str::str#10 char_cursor#1 ] )
[42] (byte*) print_str::str#0 ← ++ (byte*) print_str::str#10 [ print_str::str#0 char_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:25 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:27 [ assert_sbyte::b#5 assert_sbyte::c#5 line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:30 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:30 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:30 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:30 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:30 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:12::print_str:35 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_str:35 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_str:35 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_str:35 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_str:35 [ line_cursor#1 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:57 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:59 [ line_cursor#45 assert_byte::b#3 assert_byte::c#3 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:62 [ line_cursor#45 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:62 [ line_cursor#45 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:62 [ line_cursor#45 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_str:67 [ line_cursor#45 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_str:67 [ line_cursor#45 print_str::str#0 char_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_str:67 [ line_cursor#45 print_str::str#0 char_cursor#1 ] )
to:print_str::@1
print_ln: scope:[print_ln] from assert_byte::@2 assert_sbyte::@2
[43] (byte*) line_cursor#42 ← phi( assert_byte::@2/(byte*) line_cursor#45 assert_sbyte::@2/(byte*) line_cursor#1 ) [ char_cursor#2 line_cursor#42 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_ln:32 [ char_cursor#2 line_cursor#42 ] main:2::test_sbytes:9::assert_sbyte:14::print_ln:32 [ char_cursor#2 line_cursor#42 ] main:2::test_sbytes:9::assert_sbyte:16::print_ln:32 [ char_cursor#2 line_cursor#42 ] main:2::test_sbytes:9::assert_sbyte:18::print_ln:32 [ char_cursor#2 line_cursor#42 ] main:2::test_sbytes:9::assert_sbyte:20::print_ln:32 [ char_cursor#2 line_cursor#42 ] main:2::test_bytes:7::assert_byte:49::print_ln:64 [ char_cursor#2 line_cursor#42 ] main:2::test_bytes:7::assert_byte:51::print_ln:64 [ char_cursor#2 line_cursor#42 ] main:2::test_bytes:7::assert_byte:53::print_ln:64 [ char_cursor#2 line_cursor#42 ] )
to:print_ln::@1
print_ln::@1: scope:[print_ln] from print_ln print_ln::@1
[44] (byte*) line_cursor#21 ← phi( print_ln/(byte*) line_cursor#42 print_ln::@1/(byte*) line_cursor#1 ) [ char_cursor#2 line_cursor#21 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_ln:32 [ char_cursor#2 line_cursor#21 ] main:2::test_sbytes:9::assert_sbyte:14::print_ln:32 [ char_cursor#2 line_cursor#21 ] main:2::test_sbytes:9::assert_sbyte:16::print_ln:32 [ char_cursor#2 line_cursor#21 ] main:2::test_sbytes:9::assert_sbyte:18::print_ln:32 [ char_cursor#2 line_cursor#21 ] main:2::test_sbytes:9::assert_sbyte:20::print_ln:32 [ char_cursor#2 line_cursor#21 ] main:2::test_bytes:7::assert_byte:49::print_ln:64 [ char_cursor#2 line_cursor#21 ] main:2::test_bytes:7::assert_byte:51::print_ln:64 [ char_cursor#2 line_cursor#21 ] main:2::test_bytes:7::assert_byte:53::print_ln:64 [ char_cursor#2 line_cursor#21 ] )
[45] (byte*) line_cursor#1 ← (byte*) line_cursor#21 + (byte/signed byte/word/signed word) 40 [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_bytes:7::assert_byte:49::print_ln:64 [ line_cursor#1 char_cursor#2 ] main:2::test_bytes:7::assert_byte:51::print_ln:64 [ line_cursor#1 char_cursor#2 ] main:2::test_bytes:7::assert_byte:53::print_ln:64 [ line_cursor#1 char_cursor#2 ] )
[46] if((byte*) line_cursor#1<(byte*) char_cursor#2) goto print_ln::@1 [ line_cursor#1 char_cursor#2 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:14::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:16::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:18::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_sbytes:9::assert_sbyte:20::print_ln:32 [ line_cursor#1 char_cursor#2 ] main:2::test_bytes:7::assert_byte:49::print_ln:64 [ line_cursor#1 char_cursor#2 ] main:2::test_bytes:7::assert_byte:51::print_ln:64 [ line_cursor#1 char_cursor#2 ] main:2::test_bytes:7::assert_byte:53::print_ln:64 [ line_cursor#1 char_cursor#2 ] )
to:print_ln::@return
print_ln::@return: scope:[print_ln] from print_ln::@1
[47] return [ line_cursor#1 ] ( main:2::test_sbytes:9::assert_sbyte:12::print_ln:32 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:14::print_ln:32 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:16::print_ln:32 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:18::print_ln:32 [ line_cursor#1 ] main:2::test_sbytes:9::assert_sbyte:20::print_ln:32 [ line_cursor#1 ] main:2::test_bytes:7::assert_byte:49::print_ln:64 [ line_cursor#1 ] main:2::test_bytes:7::assert_byte:51::print_ln:64 [ line_cursor#1 ] main:2::test_bytes:7::assert_byte:53::print_ln:64 [ line_cursor#1 ] )
to:@return
test_bytes: scope:[test_bytes] from main::@1
[48] phi() [ ] ( main:2::test_bytes:7 [ ] )
[49] call assert_byte param-assignment [ line_cursor#1 ] ( main:2::test_bytes:7 [ line_cursor#1 ] )
to:test_bytes::@1
test_bytes::@1: scope:[test_bytes] from test_bytes
[50] (byte*~) char_cursor#88 ← (byte*) line_cursor#1 [ line_cursor#1 char_cursor#88 ] ( main:2::test_bytes:7 [ line_cursor#1 char_cursor#88 ] )
[51] call assert_byte param-assignment [ line_cursor#1 ] ( main:2::test_bytes:7 [ line_cursor#1 ] )
to:test_bytes::@2
test_bytes::@2: scope:[test_bytes] from test_bytes::@1
[52] (byte*~) char_cursor#89 ← (byte*) line_cursor#1 [ line_cursor#1 char_cursor#89 ] ( main:2::test_bytes:7 [ line_cursor#1 char_cursor#89 ] )
[53] call assert_byte param-assignment [ line_cursor#1 ] ( main:2::test_bytes:7 [ line_cursor#1 ] )
to:test_bytes::@return
test_bytes::@return: scope:[test_bytes] from test_bytes::@2
[54] return [ line_cursor#1 ] ( main:2::test_bytes:7 [ line_cursor#1 ] )
to:@return
assert_byte: scope:[assert_byte] from test_bytes test_bytes::@1 test_bytes::@2
[55] (byte*) line_cursor#45 ← phi( test_bytes/((byte*))(word/signed word) 1024 test_bytes::@1/(byte*) line_cursor#1 test_bytes::@2/(byte*) line_cursor#1 ) [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] )
[55] (byte) assert_byte::c#3 ← phi( test_bytes/(byte/signed byte/word/signed word) 0 test_bytes::@1/(byte/signed byte/word/signed word) 2 test_bytes::@2/(byte/word/signed word) 254 ) [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] )
[55] (byte) assert_byte::b#3 ← phi( test_bytes/(const byte) test_bytes::bb#0 test_bytes::@1/(const byte) test_bytes::bc#0 test_bytes::@2/(const byte) test_bytes::bd#0 ) [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] )
[55] (byte*) char_cursor#65 ← phi( test_bytes/((byte*))(word/signed word) 1024 test_bytes::@1/(byte*~) char_cursor#88 test_bytes::@2/(byte*~) char_cursor#89 ) [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] )
[55] (byte*) assert_byte::msg#3 ← phi( test_bytes/(const byte[]) test_bytes::msg test_bytes::@1/(const byte[]) test_bytes::msg1 test_bytes::@2/(const byte[]) test_bytes::msg2 ) [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#65 line_cursor#45 assert_byte::msg#3 assert_byte::b#3 assert_byte::c#3 ] )
[56] (byte*) print_str::str#1 ← (byte*) assert_byte::msg#3 [ print_str::str#1 char_cursor#65 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ print_str::str#1 char_cursor#65 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ print_str::str#1 char_cursor#65 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ print_str::str#1 char_cursor#65 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] )
[57] call print_str param-assignment [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] )
to:assert_byte::@5
assert_byte::@5: scope:[assert_byte] from assert_byte
[58] phi() [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] )
[59] call print_str param-assignment [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 assert_byte::b#3 assert_byte::c#3 ] )
to:assert_byte::@6
assert_byte::@6: scope:[assert_byte] from assert_byte::@5
[60] if((byte) assert_byte::b#3==(byte) assert_byte::c#3) goto assert_byte::@1 [ char_cursor#2 line_cursor#45 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 ] )
to:assert_byte::@3
assert_byte::@3: scope:[assert_byte] from assert_byte::@6
[61] *((const byte*) BGCOL#0) ← (const byte) RED#0 [ char_cursor#2 line_cursor#45 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 ] )
[62] call print_str param-assignment [ char_cursor#2 line_cursor#45 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 ] )
to:assert_byte::@2
assert_byte::@2: scope:[assert_byte] from assert_byte::@1 assert_byte::@3
[63] phi() [ char_cursor#2 line_cursor#45 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 ] )
[64] call print_ln param-assignment [ line_cursor#1 ] ( main:2::test_bytes:7::assert_byte:49 [ line_cursor#1 ] main:2::test_bytes:7::assert_byte:51 [ line_cursor#1 ] main:2::test_bytes:7::assert_byte:53 [ line_cursor#1 ] )
to:assert_byte::@return
assert_byte::@return: scope:[assert_byte] from assert_byte::@2
[65] return [ line_cursor#1 ] ( main:2::test_bytes:7::assert_byte:49 [ line_cursor#1 ] main:2::test_bytes:7::assert_byte:51 [ line_cursor#1 ] main:2::test_bytes:7::assert_byte:53 [ line_cursor#1 ] )
to:@return
assert_byte::@1: scope:[assert_byte] from assert_byte::@6
[66] phi() [ char_cursor#2 line_cursor#45 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 ] )
[67] call print_str param-assignment [ char_cursor#2 line_cursor#45 ] ( main:2::test_bytes:7::assert_byte:49 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:51 [ char_cursor#2 line_cursor#45 ] main:2::test_bytes:7::assert_byte:53 [ char_cursor#2 line_cursor#45 ] )
to:assert_byte::@2
print_cls: scope:[print_cls] from main
[68] phi() [ ] ( main:2::print_cls:5 [ ] )
to:print_cls::@1
print_cls::@1: scope:[print_cls] from print_cls print_cls::@1
[69] (byte*) print_cls::sc#2 ← phi( print_cls/((byte*))(word/signed word) 1024 print_cls::@1/(byte*) print_cls::sc#1 ) [ print_cls::sc#2 ] ( main:2::print_cls:5 [ print_cls::sc#2 ] )
[70] *((byte*) print_cls::sc#2) ← (byte) ' ' [ print_cls::sc#2 ] ( main:2::print_cls:5 [ print_cls::sc#2 ] )
[71] (byte*) print_cls::sc#1 ← ++ (byte*) print_cls::sc#2 [ print_cls::sc#1 ] ( main:2::print_cls:5 [ print_cls::sc#1 ] )
[72] if((byte*) print_cls::sc#1!=(word/signed word) 1024+(word/signed word) 1000) goto print_cls::@1 [ print_cls::sc#1 ] ( main:2::print_cls:5 [ print_cls::sc#1 ] )
to:print_cls::@return
print_cls::@return: scope:[print_cls] from print_cls::@1
[73] return [ ] ( main:2::print_cls:5 [ ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,118 @@
(label) @11
(label) @begin
(label) @end
(byte*) BGCOL
(const byte*) BGCOL#0 BGCOL = ((byte*))(word) 53281
(byte) GREEN
(const byte) GREEN#0 GREEN = (byte/signed byte/word/signed word) 5
(byte) RED
(const byte) RED#0 RED = (byte/signed byte/word/signed word) 2
(void()) assert_byte((byte*) assert_byte::msg , (byte) assert_byte::b , (byte) assert_byte::c)
(label) assert_byte::@1
(label) assert_byte::@2
(label) assert_byte::@3
(label) assert_byte::@5
(label) assert_byte::@6
(label) assert_byte::@return
(byte) assert_byte::b
(byte) assert_byte::b#3 reg byte x 0.4
(byte) assert_byte::c
(byte) assert_byte::c#3 c zp ZP_BYTE:4 0.4
(byte*) assert_byte::msg
(byte*) assert_byte::msg#3 msg zp ZP_WORD:5 2.0
(const byte[]) assert_byte::str str = (string) " @"
(const byte[]) assert_byte::str1 str1 = (string) "ok@"
(const byte[]) assert_byte::str2 str2 = (string) "fail!@"
(void()) assert_sbyte((byte*) assert_sbyte::msg , (signed byte) assert_sbyte::b , (signed byte) assert_sbyte::c)
(label) assert_sbyte::@1
(label) assert_sbyte::@2
(label) assert_sbyte::@3
(label) assert_sbyte::@5
(label) assert_sbyte::@6
(label) assert_sbyte::@return
(signed byte) assert_sbyte::b
(signed byte) assert_sbyte::b#5 reg byte x 0.3333333333333333
(signed byte) assert_sbyte::c
(signed byte) assert_sbyte::c#5 c zp ZP_BYTE:4 0.3333333333333333
(byte*) assert_sbyte::msg
(byte*) assert_sbyte::msg#5 msg zp ZP_WORD:2 2.0
(const byte[]) assert_sbyte::str str = (string) " @"
(const byte[]) assert_sbyte::str1 str1 = (string) "ok@"
(const byte[]) assert_sbyte::str2 str2 = (string) "fail!@"
(byte*) char_cursor
(byte*) char_cursor#1 char_cursor zp ZP_WORD:2 11.0
(byte*) char_cursor#2 char_cursor zp ZP_WORD:2 2.230769230769231
(byte*) char_cursor#65 char_cursor zp ZP_WORD:2 3.0
(byte*) char_cursor#75 char_cursor zp ZP_WORD:2 18.0
(byte*~) char_cursor#82 char_cursor zp ZP_WORD:2 4.0
(byte*~) char_cursor#88 char_cursor zp ZP_WORD:2 4.0
(byte*~) char_cursor#89 char_cursor zp ZP_WORD:2 4.0
(byte*) line_cursor
(byte*) line_cursor#1 line_cursor zp ZP_WORD:7 1.2500000000000002
(byte*) line_cursor#21 line_cursor zp ZP_WORD:7 24.0
(byte*) line_cursor#42 line_cursor zp ZP_WORD:7 6.0
(byte*) line_cursor#45 line_cursor zp ZP_WORD:7 0.5454545454545454
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@return
(void()) print_cls()
(label) print_cls::@1
(label) print_cls::@return
(byte*) print_cls::sc
(byte*) print_cls::sc#1 sc zp ZP_WORD:2 16.5
(byte*) print_cls::sc#2 sc zp ZP_WORD:2 16.5
(void()) print_ln()
(label) print_ln::@1
(label) print_ln::@return
(void()) print_str((byte*) print_str::str)
(label) print_str::@1
(label) print_str::@2
(label) print_str::@return
(byte*) print_str::str
(byte*) print_str::str#0 str zp ZP_WORD:5 22.0
(byte*) print_str::str#1 str zp ZP_WORD:5 4.0
(byte*) print_str::str#10 str zp ZP_WORD:5 11.5
(byte*) print_str::str#11 str zp ZP_WORD:5 6.0
(byte*) print_str::str#5 str zp ZP_WORD:5 2.0
(void()) test_bytes()
(label) test_bytes::@1
(label) test_bytes::@2
(label) test_bytes::@return
(byte) test_bytes::bb
(const byte) test_bytes::bb#0 bb = (byte/signed byte/word/signed word) 0
(byte) test_bytes::bc
(const byte) test_bytes::bc#0 bc = (const byte) test_bytes::bb#0+(byte/signed byte/word/signed word) 2
(byte) test_bytes::bd
(const byte) test_bytes::bd#0 bd = (const byte) test_bytes::bc#0-(byte/signed byte/word/signed word) 4
(const byte[]) test_bytes::msg msg = (string) "0=0@"
(const byte[]) test_bytes::msg1 msg1 = (string) "0+2=2@"
(const byte[]) test_bytes::msg2 msg2 = (string) "0+2-4=254@"
(void()) test_sbytes()
(label) test_sbytes::@1
(label) test_sbytes::@2
(label) test_sbytes::@3
(label) test_sbytes::@4
(label) test_sbytes::@return
(signed byte) test_sbytes::bb
(const signed byte) test_sbytes::bb#0 bb = (byte/signed byte/word/signed word) 0
(signed byte) test_sbytes::bc
(const signed byte) test_sbytes::bc#0 bc = (const signed byte) test_sbytes::bb#0+(byte/signed byte/word/signed word) 2
(signed byte) test_sbytes::bd
(const signed byte) test_sbytes::bd#0 bd = (const signed byte) test_sbytes::bc#0-(byte/signed byte/word/signed word) 4
(signed byte) test_sbytes::be
(const signed byte) test_sbytes::be#0 be = -(const signed byte) test_sbytes::bd#0
(signed byte) test_sbytes::bf
(const signed byte) test_sbytes::bf#0 bf = -(byte/signed byte/word/signed word) 127-(byte/signed byte/word/signed word) 127
(const byte[]) test_sbytes::msg msg = (string) "0=0@"
(const byte[]) test_sbytes::msg1 msg1 = (string) "0+2=2@"
(const byte[]) test_sbytes::msg2 msg2 = (string) "0+2-4=-2@"
(const byte[]) test_sbytes::msg3 msg3 = (string) "-(0+2-4)=2@"
(const byte[]) test_sbytes::msg4 msg4 = (string) "-127-127=2@"
zp ZP_WORD:2 [ assert_sbyte::msg#5 char_cursor#75 char_cursor#65 char_cursor#2 char_cursor#82 char_cursor#1 char_cursor#88 char_cursor#89 print_cls::sc#2 print_cls::sc#1 ]
reg byte x [ assert_sbyte::b#5 ]
zp ZP_BYTE:4 [ assert_sbyte::c#5 assert_byte::c#3 ]
zp ZP_WORD:5 [ print_str::str#10 print_str::str#11 print_str::str#1 print_str::str#5 print_str::str#0 assert_byte::msg#3 ]
zp ZP_WORD:7 [ line_cursor#21 line_cursor#42 line_cursor#45 line_cursor#1 ]
reg byte x [ assert_byte::b#3 ]

View File

@ -13,13 +13,11 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] )
[8] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] ( main:2 [ main::i#2 main::$1 main::$3 ] )
[9] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] ( main:2 [ main::i#2 main::$4 ] )
[10] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[12] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] )
[8] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[10] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ] ( main:2 [ ] )
[11] return [ ] ( main:2 [ ] )
to:@return

View File

@ -17,14 +17,12 @@ proc (void()) main()
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs *idx (byte) main::i
(byte~) main::$2 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs + (byte) main::i) + *((byte[15]) fibs + (byte~) main::$1)
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$5 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
main::@return:
return
endproc // main()
@ -36,9 +34,7 @@ SYMBOLS
(byte~) main::$0
(byte~) main::$1
(byte~) main::$2
(byte~) main::$3
(byte~) main::$4
(boolean~) main::$5
(boolean~) main::$3
(label) main::@1
(label) main::@return
(byte) main::i
@ -55,14 +51,12 @@ main: scope:[main] from
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs *idx (byte) main::i
(byte~) main::$2 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs + (byte) main::i) + *((byte[15]) fibs + (byte~) main::$1)
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$5 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
to:main::@return
@ -86,14 +80,12 @@ main: scope:[main] from
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs *idx (byte) main::i
(byte~) main::$2 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs + (byte) main::i) + *((byte[15]) fibs + (byte~) main::$1)
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$5 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -116,14 +108,12 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs *idx (byte) main::i
(byte~) main::$2 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs + (byte) main::i) + *((byte[15]) fibs + (byte~) main::$1)
*((byte[15]) fibs + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$5 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -151,14 +141,12 @@ main::@1: scope:[main] from main main::@1
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#1 main::@1/(byte[15]) fibs#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs#2 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs#2 + (byte) main::i#2) + *((byte[15]) fibs#2 + (byte~) main::$1)
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$5 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -185,14 +173,12 @@ main::@1: scope:[main] from main main::@1
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#1 main::@1/(byte[15]) fibs#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs#2 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs#2 + (byte) main::i#2) + *((byte[15]) fibs#2 + (byte~) main::$1)
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$5 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -219,9 +205,7 @@ INITIAL SSA SYMBOL TABLE
(byte~) main::$0
(byte~) main::$1
(byte~) main::$2
(byte~) main::$3
(byte~) main::$4
(boolean~) main::$5
(boolean~) main::$3
(label) main::@1
(label) main::@return
(byte) main::i
@ -245,14 +229,12 @@ main::@1: scope:[main] from main main::@1
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#1 main::@1/(byte[15]) fibs#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs#2 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs#2 + (byte) main::i#2) + *((byte[15]) fibs#2 + (byte~) main::$1)
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$5 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -280,14 +262,12 @@ main::@1: scope:[main] from main main::@1
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#1 main::@1/(byte[15]) fibs#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs#2 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs#2 + (byte) main::i#2) + *((byte[15]) fibs#2 + (byte~) main::$1)
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$5 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -314,14 +294,12 @@ main::@1: scope:[main] from main main::@1
(byte[15]) fibs#2 ← phi( main/(byte[15]) fibs#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs#2 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs#2 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs#2 + (byte) main::i#2) + *((byte[15]) fibs#2 + (byte~) main::$1)
*((byte[15]) fibs#2 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$5 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -346,14 +324,12 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs#0 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs#0 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs#0 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs#0 + (byte) main::i#2) + *((byte[15]) fibs#0 + (byte~) main::$1)
*((byte[15]) fibs#0 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$5 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$5) goto main::@1
(boolean~) main::$3 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 15
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -363,7 +339,7 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$5 if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1
Simple Condition (boolean~) main::$3 if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -377,11 +353,9 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (byte[15]) fibs#0 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (byte[15]) fibs#0 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((byte[15]) fibs#0 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((byte[15]) fibs#0 + (byte) main::i#2) + *((byte[15]) fibs#0 + (byte~) main::$1)
*((byte[15]) fibs#0 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1
to:main::@return
@ -406,11 +380,9 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$3 ← (const byte[15]) fibs#0 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((const byte[15]) fibs#0 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 1
(byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0 + (byte~) main::$1)
*((const byte[15]) fibs#0 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1
to:main::@return
@ -422,13 +394,13 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Consolidated assigned array index constant in assignment *(fibs#0+0)
Consolidated assigned array index constant in assignment *(fibs#0+1)
Consolidated array index constant in *(fibs#0+0)
Consolidated array index constant in *(fibs#0+1)
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Consolidated referenced array index constant in assignment main::$3
Consolidated assigned array index constant in assignment *(fibs#0+2 + main::$0)
Consolidated array index constant in assignment *(fibs#0+1 + main::$1)
Consolidated array index constant in assignment *(fibs#0+2 + main::$0)
Succesful SSA optimization Pass2ConstantAdditionElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -440,11 +412,9 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2
(byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2
(byte~) main::$2 ← (byte) main::i#2
(byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte~) main::$2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte~) main::$0) ← (byte~) main::$4
(byte~) main::$1 ← (byte) main::i#2
(byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte~) main::$1)
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte~) main::$0) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1
to:main::@return
@ -457,7 +427,7 @@ main::@return: scope:[main] from main::@1
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Alias (byte) main::i#2 = (byte~) main::$0 (byte~) main::$2
Alias (byte) main::i#2 = (byte~) main::$0 (byte~) main::$1
Succesful SSA optimization Pass2AliasElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -468,10 +438,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2
(byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4
(byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2)
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1
to:main::@return
@ -483,12 +451,6 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word) 0
@ -502,10 +464,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 )
(byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2
(byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4
(byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2)
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1
to:main::@return
@ -524,9 +484,7 @@ FINAL SYMBOL TABLE
(byte[15]) fibs
(const byte[15]) fibs#0 = ((byte*))(word/signed word) 4352
(void()) main()
(byte~) main::$1
(byte~) main::$3
(byte~) main::$4
(byte~) main::$2
(label) main::@1
(label) main::@return
(byte) main::i
@ -549,10 +507,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 )
(byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2
(byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2
(byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4
(byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2)
*((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@3
to:main::@return
@ -569,7 +525,6 @@ Adding NOP phi() at start of @end
CALL GRAPH
Calls in [] to main:2
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - LIVE RANGES FOUND
@ -588,22 +543,20 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 ) [ main::i#2 ]
[7] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
[8] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
[9] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ]
[10] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[12] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@3 [ main::i#1 ]
[7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ]
[8] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ]
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[10] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@3 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ]
[11] return [ ]
to:@return
main::@3: scope:[main] from main::@1
[14] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ]
[12] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ]
to:main::@1
Created 1 initial phi equivalence classes
Coalesced [14] main::i#3 ← main::i#1
Coalesced [12] main::i#3 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@3
Block Sequence Planned @begin @1 @end main main::@1 main::@return
@ -612,7 +565,6 @@ Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - BEFORE EFFECTIVE LIVE RANGES
@begin: scope:[] from
[0] phi() [ ]
@ -629,15 +581,13 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ]
[7] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
[8] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ]
[9] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ]
[10] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[12] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ]
[7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ]
[8] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ]
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[10] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ]
[11] return [ ]
to:@return
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -656,15 +606,13 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] )
[8] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] ( main:2 [ main::i#2 main::$1 main::$3 ] )
[9] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] ( main:2 [ main::i#2 main::$4 ] )
[10] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[12] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] )
[8] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[10] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ] ( main:2 [ ] )
[11] return [ ] ( main:2 [ ] )
to:@return
DOMINATORS
@ -690,27 +638,19 @@ Loop head: main::@1 tails: main::@1 blocks: main::@1 depth: 1
VARIABLE REGISTER WEIGHTS
(byte[15]) fibs
(void()) main()
(byte~) main::$1 11.0
(byte~) main::$3 22.0
(byte~) main::$4 22.0
(byte~) main::$2 22.0
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 11.0
(byte) main::i#2 18.333333333333332
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Added variable main::$3 to zero page equivalence class [ main::$3 ]
Added variable main::$4 to zero page equivalence class [ main::$4 ]
Added variable main::$2 to zero page equivalence class [ main::$2 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::$1 ]
[ main::$3 ]
[ main::$4 ]
[ main::$2 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::$1 ]
Allocated zp ZP_BYTE:4 [ main::$3 ]
Allocated zp ZP_BYTE:5 [ main::$4 ]
Allocated zp ZP_BYTE:3 [ main::$2 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -734,9 +674,7 @@ bend_from_b1:
bend:
//SEG8 main
main: {
.label _1 = 3
.label _3 = 4
.label _4 = 5
.label _2 = 3
.label i = 2
//SEG9 [4] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 0) ← (byte/signed byte/word/signed word) 0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #0
@ -756,50 +694,45 @@ main: {
jmp b1
//SEG15 main::@1
b1:
//SEG16 [7] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
//SEG16 [7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuz1=pbuc1_derefidx_vbuz2_plus_pbuc2_derefidx_vbuz2
lda fibs,x
sta _1
//SEG17 [8] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] ( main:2 [ main::i#2 main::$1 main::$3 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
lda fibs+1,x
sta _3
//SEG18 [9] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] ( main:2 [ main::i#2 main::$4 ] ) -- vbuz1=vbuz2_plus_vbuz3
lda _1
clc
adc _3
sta _4
//SEG19 [10] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _4
adc fibs+1,x
ldx i
sta _2
//SEG17 [8] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _2
ldx i
sta fibs+2,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG21 [12] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_lt_vbuc1_then_la1
//SEG19 [10] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i
cmp #$f
bcc b1_from_b1
jmp breturn
//SEG22 main::@return
//SEG20 main::@return
breturn:
//SEG23 [13] return [ ] ( main:2 [ ] )
//SEG21 [11] return [ ] ( main:2 [ ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Equivalence Class zp ZP_BYTE:4 [ main::$3 ] has ALU potential.
Statement [4] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 0) ← (byte/signed byte/word/signed word) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [5] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) always clobbers reg byte a
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::$1 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::$3 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y , reg byte alu ,
Potential registers zp ZP_BYTE:5 [ main::$4 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Statement [7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [4] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 0) ← (byte/signed byte/word/signed word) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [5] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::$2 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 27.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:4 [ main::$3 ] 22: zp ZP_BYTE:5 [ main::$4 ] 11: zp ZP_BYTE:3 [ main::$1 ]
Uplift Scope [main] 34.83: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:3 [ main::$2 ]
Uplift Scope []
Uplifting [main] best 365 combination reg byte x [ main::i#2 main::i#1 ] reg byte alu [ main::$3 ] reg byte a [ main::$4 ] reg byte a [ main::$1 ]
Uplifting [main] best 365 combination reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::$2 ]
Uplifting [] best 365 combination
ASSEMBLER BEFORE OPTIMIZATION
@ -842,24 +775,21 @@ main: {
jmp b1
//SEG15 main::@1
b1:
//SEG16 [7] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG16 [7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx_plus_pbuc2_derefidx_vbuxx
lda fibs,x
//SEG17 [8] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] ( main:2 [ main::i#2 main::$1 main::$3 ] )
// [8] main::$3 ← fibs#0+1 *idx main::i#2 // ALU
//SEG18 [9] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] ( main:2 [ main::i#2 main::$4 ] ) -- vbuaa=vbuaa_plus_pbuc1_derefidx_vbuxx
clc
adc fibs+1,x
//SEG19 [10] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
//SEG17 [8] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta fibs+2,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG21 [12] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG19 [10] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$f
bcc b1_from_b1
jmp breturn
//SEG22 main::@return
//SEG20 main::@return
breturn:
//SEG23 [13] return [ ] ( main:2 [ ] )
//SEG21 [11] return [ ] ( main:2 [ ] )
rts
}
@ -890,19 +820,15 @@ FINAL SYMBOL TABLE
(byte[15]) fibs
(const byte[15]) fibs#0 fibs = ((byte*))(word/signed word) 4352
(void()) main()
(byte~) main::$1 reg byte a 11.0
(byte~) main::$3 reg byte alu 22.0
(byte~) main::$4 reg byte a 22.0
(byte~) main::$2 reg byte a 22.0
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 11.0
(byte) main::i#2 reg byte x 18.333333333333332
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$1 ]
reg byte alu [ main::$3 ]
reg byte a [ main::$4 ]
reg byte a [ main::$2 ]
FINAL CODE
//SEG0 Basic Upstart
@ -933,22 +859,19 @@ main: {
//SEG14 [6] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 main::@1
b1:
//SEG16 [7] (byte~) main::$1 ← (const byte[15]) fibs#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG16 [7] (byte~) main::$2 ← *((const byte[15]) fibs#0 + (byte) main::i#2) + *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx_plus_pbuc2_derefidx_vbuxx
lda fibs,x
//SEG17 [8] (byte~) main::$3 ← (const byte[15]) fibs#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] ( main:2 [ main::i#2 main::$1 main::$3 ] )
// [8] main::$3 ← fibs#0+1 *idx main::i#2 // ALU
//SEG18 [9] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] ( main:2 [ main::i#2 main::$4 ] ) -- vbuaa=vbuaa_plus_pbuc1_derefidx_vbuxx
clc
adc fibs+1,x
//SEG19 [10] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
//SEG17 [8] *((const byte[15]) fibs#0+(byte/signed byte/word/signed word) 2 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta fibs+2,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG21 [12] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG19 [10] if((byte) main::i#1<(byte/signed byte/word/signed word) 15) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$f
bcc b1
//SEG22 main::@return
//SEG23 [13] return [ ] ( main:2 [ ] )
//SEG20 main::@return
//SEG21 [11] return [ ] ( main:2 [ ] )
rts
}

View File

@ -4,16 +4,12 @@
(byte[15]) fibs
(const byte[15]) fibs#0 fibs = ((byte*))(word/signed word) 4352
(void()) main()
(byte~) main::$1 reg byte a 11.0
(byte~) main::$3 reg byte alu 22.0
(byte~) main::$4 reg byte a 22.0
(byte~) main::$2 reg byte a 22.0
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 11.0
(byte) main::i#2 reg byte x 18.333333333333332
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$1 ]
reg byte alu [ main::$3 ]
reg byte a [ main::$4 ]
reg byte a [ main::$2 ]

View File

@ -61,23 +61,23 @@ flip: {
.label r = 4
lda #$10
sta r
ldy #$f
ldx #0
ldx #$f
ldy #0
b1:
lda #$10
sta c
b2:
lda buffer1,x
sta buffer2,y
inx
tya
lda buffer1,y
sta buffer2,x
iny
txa
clc
adc #$10
tay
tax
dec c
lda c
bne b2
dey
dex
dec r
lda r
bne b1

View File

@ -47,63 +47,60 @@ plot::@1: scope:[plot] from plot plot::@3
plot::@2: scope:[plot] from plot::@1 plot::@2
[19] (byte) plot::x#2 ← phi( plot::@1/(byte/signed byte/word/signed word) 0 plot::@2/(byte) plot::x#1 ) [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] )
[19] (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] )
[20] (byte~) plot::$3 ← (const byte[256]) buffer1#0 *idx (byte) plot::i#2 [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 plot::$3 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 plot::$3 ] )
[21] *((byte*) plot::line#4 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] )
[22] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::line#4 plot::y#4 plot::i#1 plot::x#2 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#1 plot::x#2 ] )
[23] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] )
[24] if((byte) plot::x#1<(byte/signed byte/word/signed word) 16) goto plot::@2 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] )
[20] *((byte*) plot::line#4 + (byte) plot::x#2) ← *((const byte[256]) buffer1#0 + (byte) plot::i#2) [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#2 plot::x#2 ] )
[21] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::line#4 plot::y#4 plot::i#1 plot::x#2 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#1 plot::x#2 ] )
[22] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] )
[23] if((byte) plot::x#1<(byte/signed byte/word/signed word) 16) goto plot::@2 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] ( main:2::plot:14 [ plot::line#4 plot::y#4 plot::i#1 plot::x#1 ] )
to:plot::@3
plot::@3: scope:[plot] from plot::@2
[25] (byte*) plot::line#1 ← (byte*) plot::line#4 + (byte/signed byte/word/signed word) 40 [ plot::y#4 plot::i#1 plot::line#1 ] ( main:2::plot:14 [ plot::y#4 plot::i#1 plot::line#1 ] )
[26] (byte) plot::y#1 ← -- (byte) plot::y#4 [ plot::i#1 plot::line#1 plot::y#1 ] ( main:2::plot:14 [ plot::i#1 plot::line#1 plot::y#1 ] )
[27] if((byte) plot::y#1!=(byte/signed byte/word/signed word) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] ( main:2::plot:14 [ plot::i#1 plot::line#1 plot::y#1 ] )
[24] (byte*) plot::line#1 ← (byte*) plot::line#4 + (byte/signed byte/word/signed word) 40 [ plot::y#4 plot::i#1 plot::line#1 ] ( main:2::plot:14 [ plot::y#4 plot::i#1 plot::line#1 ] )
[25] (byte) plot::y#1 ← -- (byte) plot::y#4 [ plot::i#1 plot::line#1 plot::y#1 ] ( main:2::plot:14 [ plot::i#1 plot::line#1 plot::y#1 ] )
[26] if((byte) plot::y#1!=(byte/signed byte/word/signed word) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] ( main:2::plot:14 [ plot::i#1 plot::line#1 plot::y#1 ] )
to:plot::@return
plot::@return: scope:[plot] from plot::@3
[28] return [ ] ( main:2::plot:14 [ ] )
[27] return [ ] ( main:2::plot:14 [ ] )
to:@return
flip: scope:[flip] from main::@7
[29] phi() [ ] ( main:2::flip:12 [ ] )
[28] phi() [ ] ( main:2::flip:12 [ ] )
to:flip::@1
flip::@1: scope:[flip] from flip flip::@4
[30] (byte) flip::r#4 ← phi( flip/(byte/signed byte/word/signed word) 16 flip::@4/(byte) flip::r#1 ) [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] ( main:2::flip:12 [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] )
[30] (byte) flip::dstIdx#5 ← phi( flip/(byte/signed byte/word/signed word) 15 flip::@4/(byte) flip::dstIdx#2 ) [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] ( main:2::flip:12 [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] )
[30] (byte) flip::srcIdx#3 ← phi( flip/(byte/signed byte/word/signed word) 0 flip::@4/(byte) flip::srcIdx#1 ) [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] ( main:2::flip:12 [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] )
[29] (byte) flip::r#4 ← phi( flip/(byte/signed byte/word/signed word) 16 flip::@4/(byte) flip::r#1 ) [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] ( main:2::flip:12 [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] )
[29] (byte) flip::dstIdx#5 ← phi( flip/(byte/signed byte/word/signed word) 15 flip::@4/(byte) flip::dstIdx#2 ) [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] ( main:2::flip:12 [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] )
[29] (byte) flip::srcIdx#3 ← phi( flip/(byte/signed byte/word/signed word) 0 flip::@4/(byte) flip::srcIdx#1 ) [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] ( main:2::flip:12 [ flip::srcIdx#3 flip::dstIdx#5 flip::r#4 ] )
to:flip::@2
flip::@2: scope:[flip] from flip::@1 flip::@2
[31] (byte) flip::c#2 ← phi( flip::@1/(byte/signed byte/word/signed word) 16 flip::@2/(byte) flip::c#1 ) [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[31] (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[31] (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[32] (byte~) flip::$0 ← (const byte[256]) buffer1#0 *idx (byte) flip::srcIdx#2 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::$0 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::$0 ] )
[33] *((const byte[256]) buffer2#0 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[34] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#3 flip::c#2 ] )
[35] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte/signed byte/word/signed word) 16 [ flip::r#4 flip::srcIdx#1 flip::c#2 flip::dstIdx#1 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::c#2 flip::dstIdx#1 ] )
[36] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] )
[37] if((byte) flip::c#1!=(byte/signed byte/word/signed word) 0) goto flip::@2 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] )
[30] (byte) flip::c#2 ← phi( flip::@1/(byte/signed byte/word/signed word) 16 flip::@2/(byte) flip::c#1 ) [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[30] (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[30] (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[31] *((const byte[256]) buffer2#0 + (byte) flip::dstIdx#3) ← *((const byte[256]) buffer1#0 + (byte) flip::srcIdx#2) [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#2 flip::dstIdx#3 flip::c#2 ] )
[32] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#3 flip::c#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#3 flip::c#2 ] )
[33] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte/signed byte/word/signed word) 16 [ flip::r#4 flip::srcIdx#1 flip::c#2 flip::dstIdx#1 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::c#2 flip::dstIdx#1 ] )
[34] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] )
[35] if((byte) flip::c#1!=(byte/signed byte/word/signed word) 0) goto flip::@2 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#1 flip::c#1 ] )
to:flip::@4
flip::@4: scope:[flip] from flip::@2
[38] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#2 ] )
[39] (byte) flip::r#1 ← -- (byte) flip::r#4 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] ( main:2::flip:12 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] )
[40] if((byte) flip::r#1!=(byte/signed byte/word/signed word) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] ( main:2::flip:12 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] )
[36] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#2 ] ( main:2::flip:12 [ flip::r#4 flip::srcIdx#1 flip::dstIdx#2 ] )
[37] (byte) flip::r#1 ← -- (byte) flip::r#4 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] ( main:2::flip:12 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] )
[38] if((byte) flip::r#1!=(byte/signed byte/word/signed word) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] ( main:2::flip:12 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] )
to:flip::@3
flip::@3: scope:[flip] from flip::@3 flip::@4
[41] (byte) flip::i#2 ← phi( flip::@3/(byte) flip::i#1 flip::@4/(byte/signed byte/word/signed word) 0 ) [ flip::i#2 ] ( main:2::flip:12 [ flip::i#2 ] )
[42] (byte~) flip::$4 ← (const byte[256]) buffer2#0 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] ( main:2::flip:12 [ flip::i#2 flip::$4 ] )
[43] *((const byte[256]) buffer1#0 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] ( main:2::flip:12 [ flip::i#2 ] )
[44] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] ( main:2::flip:12 [ flip::i#1 ] )
[45] if((byte) flip::i#1!=(byte/signed byte/word/signed word) 0) goto flip::@3 [ flip::i#1 ] ( main:2::flip:12 [ flip::i#1 ] )
[39] (byte) flip::i#2 ← phi( flip::@3/(byte) flip::i#1 flip::@4/(byte/signed byte/word/signed word) 0 ) [ flip::i#2 ] ( main:2::flip:12 [ flip::i#2 ] )
[40] *((const byte[256]) buffer1#0 + (byte) flip::i#2) ← *((const byte[256]) buffer2#0 + (byte) flip::i#2) [ flip::i#2 ] ( main:2::flip:12 [ flip::i#2 ] )
[41] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] ( main:2::flip:12 [ flip::i#1 ] )
[42] if((byte) flip::i#1!=(byte/signed byte/word/signed word) 0) goto flip::@3 [ flip::i#1 ] ( main:2::flip:12 [ flip::i#1 ] )
to:flip::@return
flip::@return: scope:[flip] from flip::@3
[46] return [ ] ( main:2::flip:12 [ ] )
[43] return [ ] ( main:2::flip:12 [ ] )
to:@return
prepare: scope:[prepare] from main
[47] phi() [ ] ( main:2::prepare:5 [ ] )
[44] phi() [ ] ( main:2::prepare:5 [ ] )
to:prepare::@1
prepare::@1: scope:[prepare] from prepare prepare::@1
[48] (byte) prepare::i#2 ← phi( prepare/(byte/signed byte/word/signed word) 0 prepare::@1/(byte) prepare::i#1 ) [ prepare::i#2 ] ( main:2::prepare:5 [ prepare::i#2 ] )
[49] *((const byte[256]) buffer1#0 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] ( main:2::prepare:5 [ prepare::i#2 ] )
[50] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] ( main:2::prepare:5 [ prepare::i#1 ] )
[51] if((byte) prepare::i#1!=(byte/signed byte/word/signed word) 0) goto prepare::@1 [ prepare::i#1 ] ( main:2::prepare:5 [ prepare::i#1 ] )
[45] (byte) prepare::i#2 ← phi( prepare/(byte/signed byte/word/signed word) 0 prepare::@1/(byte) prepare::i#1 ) [ prepare::i#2 ] ( main:2::prepare:5 [ prepare::i#2 ] )
[46] *((const byte[256]) buffer1#0 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] ( main:2::prepare:5 [ prepare::i#2 ] )
[47] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] ( main:2::prepare:5 [ prepare::i#1 ] )
[48] if((byte) prepare::i#1!=(byte/signed byte/word/signed word) 0) goto prepare::@1 [ prepare::i#1 ] ( main:2::prepare:5 [ prepare::i#1 ] )
to:prepare::@return
prepare::@return: scope:[prepare] from prepare::@1
[52] return [ ] ( main:2::prepare:5 [ ] )
[49] return [ ] ( main:2::prepare:5 [ ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -10,8 +10,6 @@
(byte[256]) buffer2
(const byte[256]) buffer2#0 buffer2 = ((byte*))(word/signed word) 4352
(void()) flip()
(byte~) flip::$0 reg byte a 2002.0
(byte~) flip::$4 reg byte a 202.0
(label) flip::@1
(label) flip::@2
(label) flip::@3
@ -19,22 +17,22 @@
(label) flip::@return
(byte) flip::c
(byte) flip::c#1 c zp ZP_BYTE:5 1501.5
(byte) flip::c#2 c zp ZP_BYTE:5 400.4
(byte) flip::c#2 c zp ZP_BYTE:5 500.5
(byte) flip::dstIdx
(byte) flip::dstIdx#1 reg byte y 701.0
(byte) flip::dstIdx#2 reg byte y 67.33333333333333
(byte) flip::dstIdx#3 reg byte y 776.0
(byte) flip::dstIdx#5 reg byte y 202.0
(byte) flip::dstIdx#1 reg byte x 701.0
(byte) flip::dstIdx#2 reg byte x 67.33333333333333
(byte) flip::dstIdx#3 reg byte x 1034.6666666666667
(byte) flip::dstIdx#5 reg byte x 202.0
(byte) flip::i
(byte) flip::i#1 reg byte x 151.5
(byte) flip::i#2 reg byte x 134.66666666666666
(byte) flip::i#2 reg byte x 202.0
(byte) flip::r
(byte) flip::r#1 r zp ZP_BYTE:4 151.5
(byte) flip::r#4 r zp ZP_BYTE:4 22.444444444444443
(byte) flip::r#4 r zp ZP_BYTE:4 25.25
(byte) flip::srcIdx
(byte) flip::srcIdx#1 reg byte x 300.42857142857144
(byte) flip::srcIdx#2 reg byte x 1034.6666666666667
(byte) flip::srcIdx#3 reg byte x 202.0
(byte) flip::srcIdx#1 reg byte y 300.42857142857144
(byte) flip::srcIdx#2 reg byte y 1552.0
(byte) flip::srcIdx#3 reg byte y 202.0
(void()) main()
(label) main::@10
(label) main::@11
@ -47,24 +45,23 @@
(byte) main::c#1 reg byte x 151.5
(byte) main::c#4 reg byte x 67.33333333333333
(void()) plot()
(byte~) plot::$3 reg byte a 2002.0
(label) plot::@1
(label) plot::@2
(label) plot::@3
(label) plot::@return
(byte) plot::i
(byte) plot::i#1 reg byte x 350.5
(byte) plot::i#2 reg byte x 1034.6666666666667
(byte) plot::i#2 reg byte x 1552.0
(byte) plot::i#3 reg byte x 202.0
(byte*) plot::line
(byte*) plot::line#1 line zp ZP_WORD:2 67.33333333333333
(byte*) plot::line#4 line zp ZP_WORD:2 171.85714285714283
(byte*) plot::line#4 line zp ZP_WORD:2 200.50000000000003
(byte) plot::x
(byte) plot::x#1 reg byte y 1501.5
(byte) plot::x#2 reg byte y 750.75
(byte) plot::x#2 reg byte y 1001.0
(byte) plot::y
(byte) plot::y#1 y zp ZP_BYTE:4 151.5
(byte) plot::y#4 y zp ZP_BYTE:4 25.25
(byte) plot::y#4 y zp ZP_BYTE:4 28.857142857142858
(void()) prepare()
(label) prepare::@1
(label) prepare::@return
@ -77,11 +74,8 @@ zp ZP_WORD:2 [ plot::line#4 plot::line#1 ]
zp ZP_BYTE:4 [ plot::y#4 plot::y#1 flip::r#4 flip::r#1 ]
reg byte x [ plot::i#2 plot::i#3 plot::i#1 ]
reg byte y [ plot::x#2 plot::x#1 ]
reg byte x [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
reg byte y [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
reg byte y [ flip::srcIdx#2 flip::srcIdx#3 flip::srcIdx#1 ]
reg byte x [ flip::dstIdx#3 flip::dstIdx#5 flip::dstIdx#2 flip::dstIdx#1 ]
zp ZP_BYTE:5 [ flip::c#2 flip::c#1 ]
reg byte x [ flip::i#2 flip::i#1 ]
reg byte x [ prepare::i#2 prepare::i#1 ]
reg byte a [ plot::$3 ]
reg byte a [ flip::$0 ]
reg byte a [ flip::$4 ]

View File

@ -0,0 +1,16 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.const SCREEN = $400
jsr main
main: {
lda #0
b1:
tax
sta SCREEN,x
clc
adc #2
cmp #$28
bcc b1
rts
}

View File

@ -0,0 +1,21 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@1
@1: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @1
[3] phi() [ ] ( )
main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[8] if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[9] return [ ] ( main:2 [ ] )
to:@return

View File

@ -0,0 +1,723 @@
// Classic for() does not allow assignment as increment, eg. for(byte i=0;i<40;i=i+2) {}
// The following should give a program rendering a char on every second char of the first line - but results in a syntax error
byte* SCREEN = $0400;
void main() {
for(byte i=0;i<40;i=i+2) {
SCREEN[i] = i;
}
}
PROGRAM
(byte*) SCREEN ← (word/signed word) 1024
proc (void()) main()
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
*((byte*) SCREEN + (byte) main::i) ← (byte) main::i
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte) main::i ← (byte~) main::$0
(boolean~) main::$1 ← (byte) main::i < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
main::@return:
return
endproc // main()
call main
SYMBOLS
(byte*) SCREEN
(void()) main()
(byte~) main::$0
(boolean~) main::$1
(label) main::@1
(label) main::@return
(byte) main::i
Promoting word/signed word to byte* in SCREEN ← ((byte*)) 1024
INITIAL CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
*((byte*) SCREEN + (byte) main::i) ← (byte) main::i
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte) main::i ← (byte~) main::$0
(boolean~) main::$1 ← (byte) main::i < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
to:main::@return
main::@return: scope:[main] from main::@2
return
to:@return
@1: scope:[] from @begin
call main
to:@end
@end: scope:[] from @1
Removing empty block main::@2
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
*((byte*) SCREEN + (byte) main::i) ← (byte) main::i
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte) main::i ← (byte~) main::$0
(boolean~) main::$1 ← (byte) main::i < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main
to:@end
@end: scope:[] from @1
PROCEDURE MODIFY VARIABLE ANALYSIS
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL
@begin: scope:[] from
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
*((byte*) SCREEN + (byte) main::i) ← (byte) main::i
(byte~) main::$0 ← (byte) main::i + (byte/signed byte/word/signed word) 2
(byte) main::i ← (byte~) main::$0
(boolean~) main::$1 ← (byte) main::i < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte*) SCREEN#2 ← phi( @1/(byte*) SCREEN#3 )
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) main::i#2
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte) main::i#1 ← (byte~) main::$0
(boolean~) main::$1 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
(byte*) SCREEN#3 ← phi( @begin/(byte*) SCREEN#0 )
call main param-assignment
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte*) SCREEN#2 ← phi( @1/(byte*) SCREEN#3 )
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) main::i#2
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte) main::i#1 ← (byte~) main::$0
(boolean~) main::$1 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
(byte*) SCREEN#3 ← phi( @begin/(byte*) SCREEN#0 )
call main param-assignment
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
INITIAL SSA SYMBOL TABLE
(label) @1
(label) @2
(label) @begin
(label) @end
(byte*) SCREEN
(byte*) SCREEN#0
(byte*) SCREEN#1
(byte*) SCREEN#2
(byte*) SCREEN#3
(void()) main()
(byte~) main::$0
(boolean~) main::$1
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::i#2
Culled Empty Block (label) @2
Succesful SSA optimization Pass2CullEmptyBlocks
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte*) SCREEN#2 ← phi( @1/(byte*) SCREEN#3 )
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) main::i#2
(byte~) main::$0 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(byte) main::i#1 ← (byte~) main::$0
(boolean~) main::$1 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
(byte*) SCREEN#3 ← phi( @begin/(byte*) SCREEN#0 )
call main param-assignment
to:@end
@end: scope:[] from @1
Not aliassing across scopes: SCREEN#2 SCREEN#3
Alias (byte) main::i#1 = (byte~) main::$0
Alias (byte*) SCREEN#0 = (byte*) SCREEN#3
Succesful SSA optimization Pass2AliasElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte*) SCREEN#2 ← phi( @1/(byte*) SCREEN#0 )
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) main::i#2
(byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(boolean~) main::$1 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Not aliassing across scopes: SCREEN#2 SCREEN#0
Self Phi Eliminated (byte*) SCREEN#1
Succesful SSA optimization Pass2SelfPhiElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte*) SCREEN#2 ← phi( @1/(byte*) SCREEN#0 )
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) main::i#2
(byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(boolean~) main::$1 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Redundant Phi (byte*) SCREEN#2 (byte*) SCREEN#0
Redundant Phi (byte*) SCREEN#1 (byte*) SCREEN#2
Succesful SSA optimization Pass2RedundantPhiElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2
(byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
(boolean~) main::$1 ← (byte) main::i#1 < (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$1 if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2
(byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Constant (const byte*) SCREEN#0 = ((byte*))1024
Constant (const byte) main::i#0 = 0
Succesful SSA optimization Pass2ConstantIdentification
CONTROL FLOW GRAPH
@begin: scope:[] from
to:@1
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2
(byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word) 0
Succesful SSA optimization Pass2ConstantInlining
CONTROL FLOW GRAPH
@begin: scope:[] from
to:@1
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 )
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2
(byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 = ((byte*))(word/signed word) 1024
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1
(byte) main::i#2
Block Sequence Planned @begin @1 @end main main::@1 main::@return
Added new block during phi lifting main::@3(between main::@1 and main::@1)
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@3
CONTROL FLOW GRAPH - PHI LIFTED
@begin: scope:[] from
to:@1
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 )
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2
(byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2
if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@3
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
main::@3: scope:[main] from main::@1
(byte~) main::i#3 ← (byte) main::i#1
to:main::@1
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - LIVE RANGES FOUND
@begin: scope:[] from
[0] phi() [ ]
to:@1
@1: scope:[] from @begin
[1] phi() [ ]
[2] call main param-assignment [ ]
to:@end
@end: scope:[] from @1
[3] phi() [ ]
main: scope:[main] from @1
[4] phi() [ ]
to:main::@1
main::@1: scope:[main] from main main::@3
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 ) [ main::i#2 ]
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ]
[7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ]
[8] if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@3 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[9] return [ ]
to:@return
main::@3: scope:[main] from main::@1
[10] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ]
to:main::@1
Created 1 initial phi equivalence classes
Coalesced [10] main::i#3 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@3
Block Sequence Planned @begin @1 @end main main::@1 main::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - BEFORE EFFECTIVE LIVE RANGES
@begin: scope:[] from
[0] phi() [ ]
to:@1
@1: scope:[] from @begin
[1] phi() [ ]
[2] call main param-assignment [ ]
to:@end
@end: scope:[] from @1
[3] phi() [ ]
main: scope:[main] from @1
[4] phi() [ ]
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ]
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ]
[7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ]
[8] if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[9] return [ ]
to:@return
CONTROL FLOW GRAPH - PHI MEM COALESCED
@begin: scope:[] from
[0] phi() [ ] ( )
to:@1
@1: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @1
[3] phi() [ ] ( )
main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[8] if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[9] return [ ] ( main:2 [ ] )
to:@return
DOMINATORS
@begin dominated by @begin
@1 dominated by @1 @begin
@end dominated by @1 @begin @end
main dominated by @1 @begin main
main::@1 dominated by @1 @begin main::@1 main
main::@return dominated by main::@return @1 @begin main::@1 main
Found back edge: Loop head: main::@1 tails: main::@1 blocks: null
Populated: Loop head: main::@1 tails: main::@1 blocks: main::@1
NATURAL LOOPS
Loop head: main::@1 tails: main::@1 blocks: main::@1
Found 0 loops in scope []
Found 1 loops in scope [main]
Loop head: main::@1 tails: main::@1 blocks: main::@1
NATURAL LOOPS WITH DEPTH
Loop head: main::@1 tails: main::@1 blocks: main::@1 depth: 1
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 22.0
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.const SCREEN = $400
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG4 @1
b1:
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG7 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
.label i = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b1
//SEG12 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG13 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG14 main::@1
b1:
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz1
ldx i
txa
sta SCREEN,x
//SEG16 [7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=vbuz1_plus_vbuc1
lda i
clc
adc #2
sta i
//SEG17 [8] if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i
cmp #$28
bcc b1_from_b1
jmp breturn
//SEG18 main::@return
breturn:
//SEG19 [9] return [ ] ( main:2 [ ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) always clobbers reg byte a
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 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 38.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 283 combination reg byte a [ main::i#2 main::i#1 ]
Uplifting [] best 283 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.const SCREEN = $400
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG4 @1
b1:
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG7 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
jmp b1
//SEG12 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG13 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG14 main::@1
b1:
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuaa=vbuaa
tax
sta SCREEN,x
//SEG16 [7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa=vbuaa_plus_vbuc1
clc
adc #2
//SEG17 [8] if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_lt_vbuc1_then_la1
cmp #$28
bcc b1_from_b1
jmp breturn
//SEG18 main::@return
breturn:
//SEG19 [9] return [ ] ( main:2 [ ] )
rts
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1_from_b1 with b1
Removing instruction bbegin:
Removing instruction b1_from_bbegin:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b1:
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp b1
Succesful ASM optimization Pass5NextJumpElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte a 16.5
(byte) main::i#2 reg byte a 22.0
reg byte a [ main::i#2 main::i#1 ]
FINAL CODE
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.const SCREEN = $400
//SEG2 @begin
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
//SEG4 @1
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @1 to main [phi:@1->main]
jsr main
//SEG7 [3] phi from @1 to @end [phi:@1->@end]
//SEG8 @end
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
//SEG12 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
//SEG13 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG14 main::@1
b1:
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuaa=vbuaa
tax
sta SCREEN,x
//SEG16 [7] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa=vbuaa_plus_vbuc1
clc
adc #2
//SEG17 [8] if((byte) main::i#1<(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_lt_vbuc1_then_la1
cmp #$28
bcc b1
//SEG18 main::@return
//SEG19 [9] return [ ] ( main:2 [ ] )
rts
}

View File

@ -0,0 +1,13 @@
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte a 16.5
(byte) main::i#2 reg byte a 22.0
reg byte a [ main::i#2 main::i#1 ]

View File

@ -10,9 +10,9 @@
jsr main
main: {
.label _1 = 6
.label _12 = 9
.label _23 = 9
.label _33 = 9
.label _11 = 9
.label _21 = 9
.label _30 = 9
.label chargen1 = 7
.label bits_gen = 6
.label charset4 = 4
@ -62,12 +62,12 @@ main: {
ldy #0
lda (chargen),y
and #$18
sta _12
sta _11
lda (chargen1),y
and #$18
lsr
lsr
ora _12
ora _11
lsr
tax
lda bits_count,x
@ -80,11 +80,11 @@ main: {
lda (chargen),y
and #6
asl
sta _23
sta _21
lda (chargen1),y
and #6
lsr
ora _23
ora _21
tax
lda bits_count,x
cmp #2
@ -97,10 +97,10 @@ main: {
and #1
asl
asl
sta _33
sta _30
lda (chargen1),y
and #1
ora _33
ora _30
tax
lda bits_count,x
cmp #2

View File

@ -21,7 +21,7 @@ main::@1: scope:[main] from main main::@5
[11] (byte~) main::$4 ← (byte~) main::$1 | (byte~) main::$3 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$4 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$4 ] )
[12] (byte~) main::$5 ← (byte~) main::$4 >> (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$5 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$5 ] )
[13] (byte~) main::$6 ← (byte~) main::$5 >> (byte/signed byte/word/signed word) 2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$6 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::$6 ] )
[14] (byte) main::bits#0 ← (const byte[]) bits_count#0 *idx (byte~) main::$6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits#0 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits#0 ] )
[14] (byte) main::bits#0 ← *((const byte[]) bits_count#0 + (byte~) main::$6) [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits#0 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits#0 ] )
[15] if((byte) main::bits#0<(byte/signed byte/word/signed word) 2) goto main::@2 [ main::chargen#10 main::charset4#10 main::chargen1#0 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 ] )
to:main::@7
main::@7: scope:[main] from main::@1
@ -30,12 +30,12 @@ main::@7: scope:[main] from main::@1
main::@2: scope:[main] from main::@1 main::@7
[17] (byte) main::bits_gen#9 ← phi( main::@1/(byte/signed byte/word/signed word) 0 main::@7/(byte/signed byte/word/signed word) 0+(byte/signed byte/word/signed word) 1 ) [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#9 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#9 ] )
[18] (byte) main::bits_gen#1 ← (byte) main::bits_gen#9 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 ] )
[19] (byte~) main::$12 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$12 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$12 ] )
[20] (byte~) main::$13 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$12 main::$13 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$12 main::$13 ] )
[21] (byte~) main::$14 ← (byte~) main::$13 >> (byte/signed byte/word/signed word) 2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$12 main::$14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$12 main::$14 ] )
[22] (byte~) main::$15 ← (byte~) main::$12 | (byte~) main::$14 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$15 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$15 ] )
[23] (byte~) main::$16 ← (byte~) main::$15 >> (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$16 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$16 ] )
[24] (byte) main::bits#1 ← (const byte[]) bits_count#0 *idx (byte~) main::$16 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::bits#1 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::bits#1 ] )
[19] (byte~) main::$11 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 ] )
[20] (byte~) main::$12 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 24 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$12 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$12 ] )
[21] (byte~) main::$13 ← (byte~) main::$12 >> (byte/signed byte/word/signed word) 2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$13 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$11 main::$13 ] )
[22] (byte~) main::$14 ← (byte~) main::$11 | (byte~) main::$13 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$14 ] )
[23] (byte~) main::$15 ← (byte~) main::$14 >> (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$15 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::$15 ] )
[24] (byte) main::bits#1 ← *((const byte[]) bits_count#0 + (byte~) main::$15) [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::bits#1 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 main::bits#1 ] )
[25] if((byte) main::bits#1<(byte/signed byte/word/signed word) 2) goto main::@3 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#1 ] )
to:main::@8
main::@8: scope:[main] from main::@2
@ -44,12 +44,12 @@ main::@8: scope:[main] from main::@2
main::@3: scope:[main] from main::@2 main::@8
[27] (byte) main::bits_gen#11 ← phi( main::@2/(byte) main::bits_gen#1 main::@8/(byte) main::bits_gen#4 ) [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#11 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#11 ] )
[28] (byte) main::bits_gen#14 ← (byte) main::bits_gen#11 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] )
[29] (byte~) main::$22 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$22 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$22 ] )
[30] (byte~) main::$23 ← (byte~) main::$22 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$23 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$23 ] )
[31] (byte~) main::$24 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$23 main::$24 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$23 main::$24 ] )
[32] (byte~) main::$25 ← (byte~) main::$24 >> (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$23 main::$25 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$23 main::$25 ] )
[33] (byte~) main::$26 ← (byte~) main::$23 | (byte~) main::$25 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$26 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$26 ] )
[34] (byte) main::bits#2 ← (const byte[]) bits_count#0 *idx (byte~) main::$26 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::bits#2 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::bits#2 ] )
[29] (byte~) main::$20 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$20 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$20 ] )
[30] (byte~) main::$21 ← (byte~) main::$20 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 ] )
[31] (byte~) main::$22 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 6 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$22 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$22 ] )
[32] (byte~) main::$23 ← (byte~) main::$22 >> (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$23 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$21 main::$23 ] )
[33] (byte~) main::$24 ← (byte~) main::$21 | (byte~) main::$23 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$24 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::$24 ] )
[34] (byte) main::bits#2 ← *((const byte[]) bits_count#0 + (byte~) main::$24) [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::bits#2 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 main::bits#2 ] )
[35] if((byte) main::bits#2<(byte/signed byte/word/signed word) 2) goto main::@4 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#14 ] )
to:main::@9
main::@9: scope:[main] from main::@3
@ -58,11 +58,11 @@ main::@9: scope:[main] from main::@3
main::@4: scope:[main] from main::@3 main::@9
[37] (byte) main::bits_gen#13 ← phi( main::@3/(byte) main::bits_gen#14 main::@9/(byte) main::bits_gen#6 ) [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#13 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#13 ] )
[38] (byte) main::bits_gen#16 ← (byte) main::bits_gen#13 << (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 ] )
[39] (byte~) main::$32 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$32 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$32 ] )
[40] (byte~) main::$33 ← (byte~) main::$32 << (byte/signed byte/word/signed word) 2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$33 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$33 ] )
[41] (byte~) main::$34 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$33 main::$34 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$33 main::$34 ] )
[42] (byte~) main::$35 ← (byte~) main::$33 | (byte~) main::$34 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$35 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$35 ] )
[43] (byte) main::bits#3 ← (const byte[]) bits_count#0 *idx (byte~) main::$35 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::bits#3 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::bits#3 ] )
[39] (byte~) main::$29 ← *((byte*) main::chargen#10) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$29 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$29 ] )
[40] (byte~) main::$30 ← (byte~) main::$29 << (byte/signed byte/word/signed word) 2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$30 ] ( main:2 [ main::chargen#10 main::charset4#10 main::chargen1#0 main::bits_gen#16 main::$30 ] )
[41] (byte~) main::$31 ← *((byte*) main::chargen1#0) & (byte/signed byte/word/signed word) 1 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$30 main::$31 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$30 main::$31 ] )
[42] (byte~) main::$32 ← (byte~) main::$30 | (byte~) main::$31 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$32 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::$32 ] )
[43] (byte) main::bits#3 ← *((const byte[]) bits_count#0 + (byte~) main::$32) [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::bits#3 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 main::bits#3 ] )
[44] if((byte) main::bits#3<(byte/signed byte/word/signed word) 2) goto main::@5 [ main::chargen#10 main::charset4#10 main::bits_gen#16 ] ( main:2 [ main::chargen#10 main::charset4#10 main::bits_gen#16 ] )
to:main::@10
main::@10: scope:[main] from main::@4

File diff suppressed because it is too large Load Diff

View File

@ -15,22 +15,22 @@
(const byte[]) bits_count#0 bits_count = { (byte/signed byte/word/signed word) 0, (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 3, (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 3, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 3, (byte/signed byte/word/signed word) 3, (byte/signed byte/word/signed word) 4 }
(void()) main()
(byte~) main::$1 $1 zp ZP_BYTE:6 7.333333333333333
(byte~) main::$12 $12 zp ZP_BYTE:9 7.333333333333333
(byte~) main::$11 $11 zp ZP_BYTE:9 7.333333333333333
(byte~) main::$12 reg byte a 22.0
(byte~) main::$13 reg byte a 22.0
(byte~) main::$14 reg byte a 22.0
(byte~) main::$15 reg byte a 22.0
(byte~) main::$16 reg byte a 22.0
(byte~) main::$2 reg byte a 22.0
(byte~) main::$20 reg byte a 22.0
(byte~) main::$21 $21 zp ZP_BYTE:9 7.333333333333333
(byte~) main::$22 reg byte a 22.0
(byte~) main::$23 $23 zp ZP_BYTE:9 7.333333333333333
(byte~) main::$23 reg byte a 22.0
(byte~) main::$24 reg byte a 22.0
(byte~) main::$25 reg byte a 22.0
(byte~) main::$26 reg byte a 22.0
(byte~) main::$29 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0
(byte~) main::$30 $30 zp ZP_BYTE:9 11.0
(byte~) main::$31 reg byte a 22.0
(byte~) main::$32 reg byte a 22.0
(byte~) main::$33 $33 zp ZP_BYTE:9 11.0
(byte~) main::$34 reg byte a 22.0
(byte~) main::$35 reg byte a 22.0
(byte~) main::$4 reg byte a 22.0
(byte~) main::$5 reg byte a 22.0
(byte~) main::$6 reg byte a 22.0
@ -88,19 +88,19 @@ reg byte a [ main::$4 ]
reg byte a [ main::$5 ]
reg byte a [ main::$6 ]
reg byte a [ main::bits#0 ]
zp ZP_BYTE:9 [ main::$12 main::$23 main::$33 ]
zp ZP_BYTE:9 [ main::$11 main::$21 main::$30 ]
reg byte a [ main::$12 ]
reg byte a [ main::$13 ]
reg byte a [ main::$14 ]
reg byte a [ main::$15 ]
reg byte a [ main::$16 ]
reg byte a [ main::bits#1 ]
reg byte a [ main::$20 ]
reg byte a [ main::$22 ]
reg byte a [ main::$23 ]
reg byte a [ main::$24 ]
reg byte a [ main::$25 ]
reg byte a [ main::$26 ]
reg byte a [ main::bits#2 ]
reg byte a [ main::$29 ]
reg byte a [ main::$31 ]
reg byte a [ main::$32 ]
reg byte a [ main::$34 ]
reg byte a [ main::$35 ]
reg byte a [ main::bits#3 ]
reg byte a [ main::bits_gen#7 ]

View File

@ -0,0 +1,17 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.const SCREEN = $400
jsr main
main: {
ldx #0
b1:
txa
sta SCREEN,x
txa
sta SCREEN+$50,x
inx
cpx #$28
bne b1
rts
}

View File

@ -0,0 +1,22 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@1
@1: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @1
[3] phi() [ ] ( )
main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::a#0 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::a#0 ] ( main:2 [ main::a#0 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] )
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] )
[8] (byte) main::i#1 ← ++ (byte) main::a#0 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[10] return [ ] ( main:2 [ ] )
to:@return

View File

@ -0,0 +1,711 @@
const byte* SCREEN = $400;
void main() {
byte a;
for( byte i : 0..39) {
SCREEN[i] = a = i;
(SCREEN+80)[i] = a;
}
}
PROGRAM
(byte*) SCREEN ← (word/signed word) 1024
proc (void()) main()
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
(byte) main::a ← (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte) main::a
(byte*~) main::$0 ← (byte*) SCREEN + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::i) ← (byte) main::a
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
main::@return:
return
endproc // main()
call main
SYMBOLS
(byte*) SCREEN
(void()) main()
(byte*~) main::$0
(boolean~) main::$1
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::i
Promoting word/signed word to byte* in SCREEN ← ((byte*)) 1024
INITIAL CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a ← (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte) main::a
(byte*~) main::$0 ← (byte*) SCREEN + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::i) ← (byte) main::a
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
to:main::@return
main::@return: scope:[main] from main::@2
return
to:@return
@1: scope:[] from @begin
call main
to:@end
@end: scope:[] from @1
Removing empty block main::@2
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a ← (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte) main::a
(byte*~) main::$0 ← (byte*) SCREEN + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::i) ← (byte) main::a
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main
to:@end
@end: scope:[] from @1
PROCEDURE MODIFY VARIABLE ANALYSIS
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL
@begin: scope:[] from
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a ← (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte) main::a
(byte*~) main::$0 ← (byte*) SCREEN + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::i) ← (byte) main::a
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
Completing Phi functions...
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte) main::a#0 ← (byte) main::i#2
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::a#0
(byte*~) main::$0 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::i#2) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte) main::a#0 ← (byte) main::i#2
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::a#0
(byte*~) main::$0 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::i#2) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
INITIAL SSA SYMBOL TABLE
(label) @1
(label) @2
(label) @begin
(label) @end
(byte*) SCREEN
(byte*) SCREEN#0
(void()) main()
(byte*~) main::$0
(boolean~) main::$1
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::a#0
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::i#2
Culled Empty Block (label) @2
Succesful SSA optimization Pass2CullEmptyBlocks
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte) main::a#0 ← (byte) main::i#2
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) main::a#0
(byte*~) main::$0 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::i#2) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Alias (byte) main::a#0 = (byte) main::i#2
Succesful SSA optimization Pass2AliasElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a#0 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0
(byte*~) main::$0 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::a#0) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::a#0
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$1) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$1 if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a#0 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
*((byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0
(byte*~) main::$0 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::a#0) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::a#0
if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Constant (const byte*) SCREEN#0 = ((byte*))1024
Constant (const byte) main::i#0 = 0
Succesful SSA optimization Pass2ConstantIdentification
CONTROL FLOW GRAPH
@begin: scope:[] from
to:@1
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a#0 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
*((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0
(byte*~) main::$0 ← (const byte*) SCREEN#0 + (byte/signed byte/word/signed word) 80
*((byte*~) main::$0 + (byte) main::a#0) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::a#0
if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Constant (const byte*) main::$0 = SCREEN#0+80
Succesful SSA optimization Pass2ConstantIdentification
CONTROL FLOW GRAPH
@begin: scope:[] from
to:@1
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a#0 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
*((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0
*((const byte*) main::$0 + (byte) main::a#0) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::a#0
if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::a#0
Multiple usages for variable. Not optimizing sub-constant (byte) main::a#0
Multiple usages for variable. Not optimizing sub-constant (byte) main::a#0
Multiple usages for variable. Not optimizing sub-constant (byte) main::a#0
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word) 0
Constant inlined main::$0 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80
Succesful SSA optimization Pass2ConstantInlining
CONTROL FLOW GRAPH
@begin: scope:[] from
to:@1
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::a#0 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 )
*((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::a#0
if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 = ((byte*))(word/signed word) 1024
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::a#0
(byte) main::i
(byte) main::i#1
Block Sequence Planned @begin @1 @end main main::@1 main::@return
Added new block during phi lifting main::@3(between main::@1 and main::@1)
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@3
CONTROL FLOW GRAPH - PHI LIFTED
@begin: scope:[] from
to:@1
@1: scope:[] from @begin
call main param-assignment
to:@end
@end: scope:[] from @1
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
(byte) main::a#0 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::a#1 )
*((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0
(byte) main::i#1 ← ++ (byte) main::a#0
if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@3
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
main::@3: scope:[main] from main::@1
(byte~) main::a#1 ← (byte) main::i#1
to:main::@1
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - LIVE RANGES FOUND
@begin: scope:[] from
[0] phi() [ ]
to:@1
@1: scope:[] from @begin
[1] phi() [ ]
[2] call main param-assignment [ ]
to:@end
@end: scope:[] from @1
[3] phi() [ ]
main: scope:[main] from @1
[4] phi() [ ]
to:main::@1
main::@1: scope:[main] from main main::@3
[5] (byte) main::a#0 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::a#1 ) [ main::a#0 ]
[6] *((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ]
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ]
[8] (byte) main::i#1 ← ++ (byte) main::a#0 [ main::i#1 ]
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@3 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[10] return [ ]
to:@return
main::@3: scope:[main] from main::@1
[11] (byte~) main::a#1 ← (byte) main::i#1 [ main::a#1 ]
to:main::@1
Created 1 initial phi equivalence classes
Coalesced [11] main::a#1 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@3
Block Sequence Planned @begin @1 @end main main::@1 main::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - BEFORE EFFECTIVE LIVE RANGES
@begin: scope:[] from
[0] phi() [ ]
to:@1
@1: scope:[] from @begin
[1] phi() [ ]
[2] call main param-assignment [ ]
to:@end
@end: scope:[] from @1
[3] phi() [ ]
main: scope:[main] from @1
[4] phi() [ ]
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::a#0 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::a#0 ]
[6] *((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ]
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ]
[8] (byte) main::i#1 ← ++ (byte) main::a#0 [ main::i#1 ]
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[10] return [ ]
to:@return
CONTROL FLOW GRAPH - PHI MEM COALESCED
@begin: scope:[] from
[0] phi() [ ] ( )
to:@1
@1: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @1
[3] phi() [ ] ( )
main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::a#0 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::a#0 ] ( main:2 [ main::a#0 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] )
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] )
[8] (byte) main::i#1 ← ++ (byte) main::a#0 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[10] return [ ] ( main:2 [ ] )
to:@return
DOMINATORS
@begin dominated by @begin
@1 dominated by @1 @begin
@end dominated by @1 @begin @end
main dominated by @1 @begin main
main::@1 dominated by @1 @begin main::@1 main
main::@return dominated by main::@return @1 @begin main::@1 main
Found back edge: Loop head: main::@1 tails: main::@1 blocks: null
Populated: Loop head: main::@1 tails: main::@1 blocks: main::@1
NATURAL LOOPS
Loop head: main::@1 tails: main::@1 blocks: main::@1
Found 0 loops in scope []
Found 1 loops in scope [main]
Loop head: main::@1 tails: main::@1 blocks: main::@1
NATURAL LOOPS WITH DEPTH
Loop head: main::@1 tails: main::@1 blocks: main::@1 depth: 1
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(void()) main()
(byte) main::a
(byte) main::a#0 22.0
(byte) main::i
(byte) main::i#1 16.5
Initial phi equivalence classes
[ main::a#0 main::i#1 ]
Complete equivalence classes
[ main::a#0 main::i#1 ]
Allocated zp ZP_BYTE:2 [ main::a#0 main::i#1 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.const SCREEN = $400
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG4 @1
b1:
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG7 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
.label a = 2
.label i = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) main::a#0 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta a
jmp b1
//SEG12 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG13 [5] phi (byte) main::a#0 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG14 main::@1
b1:
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] ) -- pbuc1_derefidx_vbuz1=vbuz1
ldx a
txa
sta SCREEN,x
//SEG16 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] ) -- pbuc1_derefidx_vbuz1=vbuz1
ldx a
txa
sta SCREEN+$50,x
//SEG17 [8] (byte) main::i#1 ← ++ (byte) main::a#0 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG18 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$28
bne b1_from_b1
jmp breturn
//SEG19 main::@return
breturn:
//SEG20 [10] return [ ] ( main:2 [ ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_BYTE:2 [ main::a#0 main::i#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 38.5: zp ZP_BYTE:2 [ main::a#0 main::i#1 ]
Uplift Scope []
Uplifting [main] best 333 combination reg byte x [ main::a#0 main::i#1 ]
Uplifting [] best 333 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.const SCREEN = $400
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG4 @1
b1:
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG7 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) main::a#0 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
jmp b1
//SEG12 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG13 [5] phi (byte) main::a#0 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG14 main::@1
b1:
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] ) -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN,x
//SEG16 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] ) -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN+$50,x
//SEG17 [8] (byte) main::i#1 ← ++ (byte) main::a#0 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG18 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$28
bne b1_from_b1
jmp breturn
//SEG19 main::@return
breturn:
//SEG20 [10] return [ ] ( main:2 [ ] )
rts
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1_from_b1 with b1
Removing instruction bbegin:
Removing instruction b1_from_bbegin:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b1:
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp b1
Succesful ASM optimization Pass5NextJumpElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::a#0 reg byte x 22.0
(byte) main::i
(byte) main::i#1 reg byte x 16.5
reg byte x [ main::a#0 main::i#1 ]
FINAL CODE
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.const SCREEN = $400
//SEG2 @begin
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
//SEG4 @1
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @1 to main [phi:@1->main]
jsr main
//SEG7 [3] phi from @1 to @end [phi:@1->@end]
//SEG8 @end
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (byte) main::a#0 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
//SEG12 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
//SEG13 [5] phi (byte) main::a#0 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG14 main::@1
b1:
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] ) -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN,x
//SEG16 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 80 + (byte) main::a#0) ← (byte) main::a#0 [ main::a#0 ] ( main:2 [ main::a#0 ] ) -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN+$50,x
//SEG17 [8] (byte) main::i#1 ← ++ (byte) main::a#0 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG18 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$28
bne b1
//SEG19 main::@return
//SEG20 [10] return [ ] ( main:2 [ ] )
rts
}

View File

@ -0,0 +1,14 @@
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::a#0 reg byte x 22.0
(byte) main::i
(byte) main::i#1 reg byte x 16.5
reg byte x [ main::a#0 main::i#1 ]

View File

@ -6,26 +6,26 @@
main: {
.label w = 3
.label sc = 3
.label l = 2
ldx #0
.label h = 2
lda #0
sta h
b1:
lda #4
sta l
ldx #4
b2:
lda his,x
ldy h
lda his,y
sta w+1
lda l
sta w
stx w
ldy #0
lda #'*'
sta (sc),y
inc l
lda l
cmp #8
bne b2
inx
cpx #2
cpx #8
bne b2
inc h
lda h
cmp #3
bne b1
rts
his: .byte >SCREEN, >SCREEN+$100
his: .byte >SCREEN, >SCREEN+$100, >SCREEN+$200
}

View File

@ -15,17 +15,16 @@ main::@1: scope:[main] from main main::@3
to:main::@2
main::@2: scope:[main] from main::@1 main::@2
[6] (byte) main::l#2 ← phi( main::@1/(byte/signed byte/word/signed word) 4 main::@2/(byte) main::l#1 ) [ main::h#4 main::l#2 ] ( main:2 [ main::h#4 main::l#2 ] )
[7] (byte~) main::$3 ← (const byte[]) main::his#0 *idx (byte) main::h#4 [ main::h#4 main::l#2 main::$3 ] ( main:2 [ main::h#4 main::l#2 main::$3 ] )
[8] (word) main::w#0 ← (byte~) main::$3 w= (byte) main::l#2 [ main::h#4 main::l#2 main::w#0 ] ( main:2 [ main::h#4 main::l#2 main::w#0 ] )
[9] (byte*) main::sc#0 ← ((byte*)) (word) main::w#0 [ main::h#4 main::l#2 main::sc#0 ] ( main:2 [ main::h#4 main::l#2 main::sc#0 ] )
[10] *((byte*) main::sc#0) ← (byte) '*' [ main::h#4 main::l#2 ] ( main:2 [ main::h#4 main::l#2 ] )
[11] (byte) main::l#1 ← ++ (byte) main::l#2 [ main::h#4 main::l#1 ] ( main:2 [ main::h#4 main::l#1 ] )
[12] if((byte) main::l#1!=(byte/signed byte/word/signed word) 8) goto main::@2 [ main::h#4 main::l#1 ] ( main:2 [ main::h#4 main::l#1 ] )
[7] (word) main::w#0 ← *((const byte[]) main::his#0 + (byte) main::h#4) w= (byte) main::l#2 [ main::h#4 main::l#2 main::w#0 ] ( main:2 [ main::h#4 main::l#2 main::w#0 ] )
[8] (byte*) main::sc#0 ← ((byte*)) (word) main::w#0 [ main::h#4 main::l#2 main::sc#0 ] ( main:2 [ main::h#4 main::l#2 main::sc#0 ] )
[9] *((byte*) main::sc#0) ← (byte) '*' [ main::h#4 main::l#2 ] ( main:2 [ main::h#4 main::l#2 ] )
[10] (byte) main::l#1 ← ++ (byte) main::l#2 [ main::h#4 main::l#1 ] ( main:2 [ main::h#4 main::l#1 ] )
[11] if((byte) main::l#1!=(byte/signed byte/word/signed word) 8) goto main::@2 [ main::h#4 main::l#1 ] ( main:2 [ main::h#4 main::l#1 ] )
to:main::@3
main::@3: scope:[main] from main::@2
[13] (byte) main::h#1 ← ++ (byte) main::h#4 [ main::h#1 ] ( main:2 [ main::h#1 ] )
[14] if((byte) main::h#1!=(byte/signed byte/word/signed word) 2) goto main::@1 [ main::h#1 ] ( main:2 [ main::h#1 ] )
[12] (byte) main::h#1 ← ++ (byte) main::h#4 [ main::h#1 ] ( main:2 [ main::h#1 ] )
[13] if((byte) main::h#1!=(byte/signed byte/word/signed word) 3) goto main::@1 [ main::h#1 ] ( main:2 [ main::h#1 ] )
to:main::@return
main::@return: scope:[main] from main::@3
[15] return [ ] ( main:2 [ ] )
[14] return [ ] ( main:2 [ ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -4,25 +4,23 @@
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
(void()) main()
(byte~) main::$3 reg byte a 202.0
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@return
(byte) main::h
(byte) main::h#1 reg byte x 16.5
(byte) main::h#4 reg byte x 15.375
(byte) main::h#1 h zp ZP_BYTE:2 16.5
(byte) main::h#4 h zp ZP_BYTE:2 17.571428571428573
(byte[]) main::his
(const byte[]) main::his#0 his = { >(const byte*) SCREEN#0, >(const byte*) SCREEN#0+(word/signed word) 256 }
(const byte[]) main::his#0 his = { >(const byte*) SCREEN#0, >(const byte*) SCREEN#0+(word/signed word) 256, >(const byte*) SCREEN#0+(word/signed word) 512 }
(byte) main::l
(byte) main::l#1 l zp ZP_BYTE:2 151.5
(byte) main::l#2 l zp ZP_BYTE:2 60.599999999999994
(byte) main::l#1 reg byte x 151.5
(byte) main::l#2 reg byte x 75.75
(byte*) main::sc
(byte*) main::sc#0 sc zp ZP_WORD:3 202.0
(word) main::w
(word) main::w#0 w zp ZP_WORD:3 202.0
reg byte x [ main::h#4 main::h#1 ]
zp ZP_BYTE:2 [ main::l#2 main::l#1 ]
reg byte a [ main::$3 ]
zp ZP_BYTE:2 [ main::h#4 main::h#1 ]
reg byte x [ main::l#2 main::l#1 ]
zp ZP_WORD:3 [ main::w#0 main::sc#0 ]

View File

@ -12,13 +12,11 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] (byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] )
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[8] (byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] )
[9] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[12] return [ ] ( main:2 [ ] )
[10] return [ ] ( main:2 [ ] )
to:@return

View File

@ -20,13 +20,11 @@ proc (void()) main()
(byte[]) main::data ← { (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 3 }
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
(byte~) main::$0 ← (byte[]) main::txt *idx (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data *idx (byte) main::i
*((byte*) SCREEN2 + (byte) main::i) ← (byte~) main::$1
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) main::txt + (byte) main::i)
*((byte*) SCREEN2 + (byte) main::i) ← *((byte[]) main::data + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
main::@return:
return
endproc // main()
@ -37,9 +35,7 @@ SYMBOLS
(byte*) SCREEN
(byte*) SCREEN2
(void()) main()
(byte~) main::$0
(byte~) main::$1
(boolean~) main::$2
(boolean~) main::$0
(label) main::@1
(label) main::@return
(byte[]) main::data
@ -60,13 +56,11 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte[]) main::txt *idx (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data *idx (byte) main::i
*((byte*) SCREEN2 + (byte) main::i) ← (byte~) main::$1
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) main::txt + (byte) main::i)
*((byte*) SCREEN2 + (byte) main::i) ← *((byte[]) main::data + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
to:main::@return
@ -91,13 +85,11 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte[]) main::txt *idx (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data *idx (byte) main::i
*((byte*) SCREEN2 + (byte) main::i) ← (byte~) main::$1
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) main::txt + (byte) main::i)
*((byte*) SCREEN2 + (byte) main::i) ← *((byte[]) main::data + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -121,13 +113,11 @@ main: scope:[main] from @1
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte[]) main::txt *idx (byte) main::i
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data *idx (byte) main::i
*((byte*) SCREEN2 + (byte) main::i) ← (byte~) main::$1
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) main::txt + (byte) main::i)
*((byte*) SCREEN2 + (byte) main::i) ← *((byte[]) main::data + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -161,13 +151,11 @@ main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte[]) main::txt#1 ← phi( main/(byte[]) main::txt#0 main::@1/(byte[]) main::txt#1 )
(byte~) main::$0 ← (byte[]) main::txt#1 *idx (byte) main::i#2
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data#1 *idx (byte) main::i#2
*((byte*) SCREEN2#1 + (byte) main::i#2) ← (byte~) main::$1
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) main::txt#1 + (byte) main::i#2)
*((byte*) SCREEN2#1 + (byte) main::i#2) ← *((byte[]) main::data#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -200,13 +188,11 @@ main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte[]) main::txt#1 ← phi( main/(byte[]) main::txt#0 main::@1/(byte[]) main::txt#1 )
(byte~) main::$0 ← (byte[]) main::txt#1 *idx (byte) main::i#2
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data#1 *idx (byte) main::i#2
*((byte*) SCREEN2#1 + (byte) main::i#2) ← (byte~) main::$1
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) main::txt#1 + (byte) main::i#2)
*((byte*) SCREEN2#1 + (byte) main::i#2) ← *((byte[]) main::data#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -237,9 +223,7 @@ INITIAL SSA SYMBOL TABLE
(byte*) SCREEN2#2
(byte*) SCREEN2#3
(void()) main()
(byte~) main::$0
(byte~) main::$1
(boolean~) main::$2
(boolean~) main::$0
(label) main::@1
(label) main::@return
(byte[]) main::data
@ -274,13 +258,11 @@ main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte[]) main::txt#1 ← phi( main/(byte[]) main::txt#0 main::@1/(byte[]) main::txt#1 )
(byte~) main::$0 ← (byte[]) main::txt#1 *idx (byte) main::i#2
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data#1 *idx (byte) main::i#2
*((byte*) SCREEN2#1 + (byte) main::i#2) ← (byte~) main::$1
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) main::txt#1 + (byte) main::i#2)
*((byte*) SCREEN2#1 + (byte) main::i#2) ← *((byte[]) main::data#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -316,13 +298,11 @@ main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@1/(byte*) SCREEN#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte[]) main::txt#1 ← phi( main/(byte[]) main::txt#0 main::@1/(byte[]) main::txt#1 )
(byte~) main::$0 ← (byte[]) main::txt#1 *idx (byte) main::i#2
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data#1 *idx (byte) main::i#2
*((byte*) SCREEN2#1 + (byte) main::i#2) ← (byte~) main::$1
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) main::txt#1 + (byte) main::i#2)
*((byte*) SCREEN2#1 + (byte) main::i#2) ← *((byte[]) main::data#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -358,13 +338,11 @@ main::@1: scope:[main] from main main::@1
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte[]) main::txt#1 ← phi( main/(byte[]) main::txt#0 )
(byte~) main::$0 ← (byte[]) main::txt#1 *idx (byte) main::i#2
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data#1 *idx (byte) main::i#2
*((byte*) SCREEN2#1 + (byte) main::i#2) ← (byte~) main::$1
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) main::txt#1 + (byte) main::i#2)
*((byte*) SCREEN2#1 + (byte) main::i#2) ← *((byte[]) main::data#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -394,13 +372,11 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte[]) main::txt#0 *idx (byte) main::i#2
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data#0 *idx (byte) main::i#2
*((byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1
*((byte*) SCREEN#0 + (byte) main::i#2) ← *((byte[]) main::txt#0 + (byte) main::i#2)
*((byte*) SCREEN2#0 + (byte) main::i#2) ← *((byte[]) main::data#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -410,7 +386,7 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$2 if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
Simple Condition (boolean~) main::$0 if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -425,10 +401,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte[]) main::txt#0 *idx (byte) main::i#2
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (byte[]) main::data#0 *idx (byte) main::i#2
*((byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1
*((byte*) SCREEN#0 + (byte) main::i#2) ← *((byte[]) main::txt#0 + (byte) main::i#2)
*((byte*) SCREEN2#0 + (byte) main::i#2) ← *((byte[]) main::data#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -454,10 +428,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2
*((byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1
*((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2)
*((byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -478,10 +450,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2
*((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1
*((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2)
*((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -493,14 +463,6 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::i#0
Constant inlined $0 = (word/signed word) 1024+(byte/signed byte/word/signed word) 40
@ -513,10 +475,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2
*((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1
*((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2)
*((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -537,8 +497,6 @@ FINAL SYMBOL TABLE
(byte*) SCREEN2
(const byte*) SCREEN2#0 = ((byte*))(word/signed word) 1024+(byte/signed byte/word/signed word) 40
(void()) main()
(byte~) main::$0
(byte~) main::$1
(label) main::@1
(label) main::@return
(byte[]) main::data
@ -563,10 +521,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 )
(byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
(byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2
*((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1
*((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2)
*((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@3
to:main::@return
@ -601,22 +557,20 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 ) [ main::i#2 ]
[6] (byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ]
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 ]
[8] (byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
[9] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ]
[10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@3 [ main::i#1 ]
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ]
[7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ]
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@3 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[12] return [ ]
[10] return [ ]
to:@return
main::@3: scope:[main] from main::@1
[13] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ]
[11] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ]
to:main::@1
Created 1 initial phi equivalence classes
Coalesced [13] main::i#3 ← main::i#1
Coalesced [11] main::i#3 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@3
Block Sequence Planned @begin @1 @end main main::@1 main::@return
@ -641,15 +595,13 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ]
[6] (byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ]
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 ]
[8] (byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
[9] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ]
[10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ]
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ]
[7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ]
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[12] return [ ]
[10] return [ ]
to:@return
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -667,15 +619,13 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] (byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] )
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[8] (byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] )
[9] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[12] return [ ] ( main:2 [ ] )
[10] return [ ] ( main:2 [ ] )
to:@return
DOMINATORS
@ -702,25 +652,17 @@ VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(byte*) SCREEN2
(void()) main()
(byte~) main::$0 22.0
(byte~) main::$1 22.0
(byte[]) main::data
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 13.2
(byte) main::i#2 22.0
(byte[]) main::txt
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Added variable main::$0 to zero page equivalence class [ main::$0 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::$0 ]
[ main::$1 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::$0 ]
Allocated zp ZP_BYTE:4 [ main::$1 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -747,8 +689,6 @@ bend_from_b1:
bend:
//SEG9 main
main: {
.label _0 = 3
.label _1 = 4
.label i = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
@ -762,47 +702,42 @@ main: {
jmp b1
//SEG14 main::@1
b1:
//SEG15 [6] (byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
lda txt,x
sta _0
//SEG16 [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _0
ldx i
sta SCREEN,x
//SEG17 [8] (byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
//SEG16 [7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
lda data,x
sta _1
//SEG18 [9] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _1
ldx i
sta SCREEN2,x
//SEG19 [10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
ldx i
//SEG17 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG20 [11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG18 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #4
bne b1_from_b1
jmp breturn
//SEG21 main::@return
//SEG19 main::@return
breturn:
//SEG22 [12] return [ ] ( main:2 [ ] )
//SEG20 [10] return [ ] ( main:2 [ ] )
rts
txt: .text "qwe"
data: .byte 1, 2, 3
}
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:3 [ main::$0 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::$1 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Statement [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 29.7: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:3 [ main::$0 ] 22: zp ZP_BYTE:4 [ main::$1 ]
Uplift Scope [main] 38.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 383 combination reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::$0 ] reg byte a [ main::$1 ]
Uplifting [main] best 383 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 383 combination
ASSEMBLER BEFORE OPTIMIZATION
@ -842,23 +777,21 @@ main: {
jmp b1
//SEG14 main::@1
b1:
//SEG15 [6] (byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda txt,x
//SEG16 [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN,x
//SEG17 [8] (byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG16 [7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda data,x
//SEG18 [9] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN2,x
//SEG19 [10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG17 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG20 [11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG18 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #4
bne b1_from_b1
jmp breturn
//SEG21 main::@return
//SEG19 main::@return
breturn:
//SEG22 [12] return [ ] ( main:2 [ ] )
//SEG20 [10] return [ ] ( main:2 [ ] )
rts
txt: .text "qwe"
data: .byte 1, 2, 3
@ -894,21 +827,17 @@ FINAL SYMBOL TABLE
(byte*) SCREEN2
(const byte*) SCREEN2#0 SCREEN2 = ((byte*))(word/signed word) 1024+(byte/signed byte/word/signed word) 40
(void()) main()
(byte~) main::$0 reg byte a 22.0
(byte~) main::$1 reg byte a 22.0
(label) main::@1
(label) main::@return
(byte[]) main::data
(const byte[]) main::data#0 data = { (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 3 }
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 13.2
(byte) main::i#2 reg byte x 22.0
(byte[]) main::txt
(const byte[]) main::txt#0 txt = (string) "qwe"
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$0 ]
reg byte a [ main::$1 ]
FINAL CODE
//SEG0 Basic Upstart
@ -935,21 +864,19 @@ main: {
//SEG13 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG14 main::@1
b1:
//SEG15 [6] (byte~) main::$0 ← (const byte[]) main::txt#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG15 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) main::txt#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda txt,x
//SEG16 [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN,x
//SEG17 [8] (byte~) main::$1 ← (const byte[]) main::data#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG16 [7] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← *((const byte[]) main::data#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda data,x
//SEG18 [9] *((const byte*) SCREEN2#0 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN2,x
//SEG19 [10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG17 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG20 [11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG18 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #4
bne b1
//SEG21 main::@return
//SEG22 [12] return [ ] ( main:2 [ ] )
//SEG19 main::@return
//SEG20 [10] return [ ] ( main:2 [ ] )
rts
txt: .text "qwe"
data: .byte 1, 2, 3

View File

@ -6,18 +6,14 @@
(byte*) SCREEN2
(const byte*) SCREEN2#0 SCREEN2 = ((byte*))(word/signed word) 1024+(byte/signed byte/word/signed word) 40
(void()) main()
(byte~) main::$0 reg byte a 22.0
(byte~) main::$1 reg byte a 22.0
(label) main::@1
(label) main::@return
(byte[]) main::data
(const byte[]) main::data#0 data = { (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 2, (byte/signed byte/word/signed word) 3 }
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 13.2
(byte) main::i#2 reg byte x 22.0
(byte[]) main::txt
(const byte[]) main::txt#0 txt = (string) "qwe"
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$0 ]
reg byte a [ main::$1 ]

View File

@ -14,19 +14,18 @@ main::@1: scope:[main] from main main::@2
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 ) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[7] (byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3 [ main::i#2 main::j#3 main::$0 ] ( main:2 [ main::i#2 main::j#3 main::$0 ] )
[8] *((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[9] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[10] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[11] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
[13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
[10] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
to:main::@return
main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] )
[13] return [ ] ( main:2 [ ] )
to:@return
main::@6: scope:[main] from main::@1
[15] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[14] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2

View File

@ -29,17 +29,16 @@ proc (void()) main()
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
*((byte*) main::screen + (byte) main::i) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq *idx (byte) main::j
*((byte*) main::cols + (byte) main::i) ← (byte~) main::$0
*((byte*) main::cols + (byte) main::i) ← *((byte[]) main::colseq + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
(byte) main::j ← (byte/signed byte/word/signed word) 0
main::@2:
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
main::@return:
return
endproc // main()
@ -50,10 +49,9 @@ SYMBOLS
(byte) RED
(byte) WHITE
(void()) main()
(byte~) main::$0
(boolean~) main::$0
(boolean~) main::$1
(boolean~) main::$2
(boolean~) main::$3
(label) main::@1
(label) main::@2
(label) main::@return
@ -80,17 +78,16 @@ main: scope:[main] from
to:main::@1
main::@1: scope:[main] from main main::@2
*((byte*) main::screen + (byte) main::i) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq *idx (byte) main::j
*((byte*) main::cols + (byte) main::i) ← (byte~) main::$0
*((byte*) main::cols + (byte) main::i) ← *((byte[]) main::colseq + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@4
main::@3: scope:[main] from main::@1
(byte) main::j ← (byte/signed byte/word/signed word) 0
@ -121,17 +118,16 @@ main: scope:[main] from
to:main::@1
main::@1: scope:[main] from main main::@2
*((byte*) main::screen + (byte) main::i) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq *idx (byte) main::j
*((byte*) main::cols + (byte) main::i) ← (byte~) main::$0
*((byte*) main::cols + (byte) main::i) ← *((byte[]) main::colseq + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j ← (byte/signed byte/word/signed word) 0
@ -161,17 +157,16 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
*((byte*) main::screen + (byte) main::i) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq *idx (byte) main::j
*((byte*) main::cols + (byte) main::i) ← (byte~) main::$0
*((byte*) main::cols + (byte) main::i) ← *((byte[]) main::colseq + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 3
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j ← (byte/signed byte/word/signed word) 0
@ -212,12 +207,11 @@ main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#2 )
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#1 *idx (byte) main::j#3
*((byte*) main::cols#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#1 + (byte) main::i#2) ← *((byte[]) main::colseq#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cols#2 ← phi( main::@1/(byte*) main::cols#1 main::@3/(byte*) main::cols#3 )
@ -226,8 +220,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::screen#2 ← phi( main::@1/(byte*) main::screen#1 main::@3/(byte*) main::screen#3 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) main::cols#3 ← phi( main::@1/(byte*) main::cols#1 )
@ -272,12 +266,11 @@ main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#2 )
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#1 *idx (byte) main::j#3
*((byte*) main::cols#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#1 + (byte) main::i#2) ← *((byte[]) main::colseq#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cols#2 ← phi( main::@1/(byte*) main::cols#1 main::@3/(byte*) main::cols#3 )
@ -286,8 +279,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::screen#2 ← phi( main::@1/(byte*) main::screen#1 main::@3/(byte*) main::screen#3 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) main::cols#3 ← phi( main::@1/(byte*) main::cols#1 )
@ -327,10 +320,9 @@ INITIAL SSA SYMBOL TABLE
(byte) WHITE#1
(byte) WHITE#2
(void()) main()
(byte~) main::$0
(boolean~) main::$0
(boolean~) main::$1
(boolean~) main::$2
(boolean~) main::$3
(label) main::@1
(label) main::@2
(label) main::@3
@ -388,12 +380,11 @@ main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#2 )
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#1 *idx (byte) main::j#3
*((byte*) main::cols#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#1 + (byte) main::i#2) ← *((byte[]) main::colseq#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cols#2 ← phi( main::@1/(byte*) main::cols#1 main::@3/(byte*) main::cols#3 )
@ -402,8 +393,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::screen#2 ← phi( main::@1/(byte*) main::screen#1 main::@3/(byte*) main::screen#3 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) main::cols#3 ← phi( main::@1/(byte*) main::cols#1 )
@ -423,7 +414,7 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Inversing boolean not (boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3 from (boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
Inversing boolean not (boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3 from (boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 3
Succesful SSA optimization Pass2UnaryNotSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -448,11 +439,10 @@ main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#2 )
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#1 *idx (byte) main::j#3
*((byte*) main::cols#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#1 + (byte) main::i#2) ← *((byte[]) main::colseq#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cols#2 ← phi( main::@1/(byte*) main::cols#1 main::@3/(byte*) main::cols#3 )
@ -461,8 +451,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::screen#2 ← phi( main::@1/(byte*) main::screen#1 main::@3/(byte*) main::screen#3 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) main::cols#3 ← phi( main::@1/(byte*) main::cols#1 )
@ -516,11 +506,10 @@ main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#2 )
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#1 *idx (byte) main::j#3
*((byte*) main::cols#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#1 + (byte) main::i#2) ← *((byte[]) main::colseq#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cols#2 ← phi( main::@1/(byte*) main::cols#1 main::@3/(byte*) main::cols#1 )
@ -529,8 +518,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) main::screen#2 ← phi( main::@1/(byte*) main::screen#1 main::@3/(byte*) main::screen#1 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#2 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -574,17 +563,16 @@ main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#1 )
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#1 *idx (byte) main::j#3
*((byte*) main::cols#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#1 + (byte) main::i#2) ← *((byte[]) main::colseq#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::j#4 ← phi( main::@1/(byte) main::j#1 main::@3/(byte) main::j#2 )
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -627,17 +615,16 @@ main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 )
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#1 *idx (byte) main::j#3
*((byte*) main::cols#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#1 + (byte) main::i#2) ← *((byte[]) main::colseq#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::j#4 ← phi( main::@1/(byte) main::j#1 main::@3/(byte) main::j#2 )
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -674,17 +661,16 @@ main::@1: scope:[main] from main main::@2
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
*((byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#0 *idx (byte) main::j#3
*((byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#0 + (byte) main::i#2) ← *((byte[]) main::colseq#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 3
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::j#4 ← phi( main::@1/(byte) main::j#1 main::@3/(byte) main::j#2 )
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -697,8 +683,8 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$2 if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@2
Simple Condition (boolean~) main::$3 if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1
Simple Condition (boolean~) main::$1 if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@2
Simple Condition (boolean~) main::$2 if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -717,8 +703,7 @@ main::@1: scope:[main] from main main::@2
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
*((byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#0 *idx (byte) main::j#3
*((byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) main::cols#0 + (byte) main::i#2) ← *((byte[]) main::colseq#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@2
to:main::@3
@ -757,8 +742,7 @@ main::@1: scope:[main] from main main::@2
(byte) main::j#3 ← phi( main/(const byte) main::j#0 main::@2/(byte) main::j#4 )
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@2/(byte) main::i#1 )
*((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (byte[]) main::colseq#0 *idx (byte) main::j#3
*((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0
*((const byte*) main::cols#0 + (byte) main::i#2) ← *((byte[]) main::colseq#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@2
to:main::@3
@ -788,8 +772,7 @@ main::@1: scope:[main] from main main::@2
(byte) main::j#3 ← phi( main/(const byte) main::j#0 main::@2/(byte) main::j#4 )
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@2/(byte) main::i#1 )
*((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3
*((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0
*((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@2
to:main::@3
@ -808,9 +791,7 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::j#3
Not culling empty block because it shares successor with its predecessor. (label) main::@3
Multiple usages for variable. Not optimizing sub-constant (byte) main::j#3
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
@ -832,8 +813,7 @@ main::@1: scope:[main] from main main::@2
(byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 )
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 )
*((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3
*((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0
*((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@2
to:main::@3
@ -863,7 +843,6 @@ FINAL SYMBOL TABLE
(byte) WHITE
(const byte) WHITE#0 = (byte/signed byte/word/signed word) 1
(void()) main()
(byte~) main::$0
(label) main::@1
(label) main::@2
(label) main::@3
@ -899,8 +878,7 @@ main::@1: scope:[main] from main main::@5
(byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::j#5 )
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::i#5 )
*((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*'
(byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3
*((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0
*((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6
to:main::@3
@ -952,34 +930,33 @@ main::@1: scope:[main] from main main::@5
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::j#5 ) [ main::i#2 main::j#3 ]
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::i#5 ) [ main::i#2 main::j#3 ]
[6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ]
[7] (byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3 [ main::i#2 main::j#3 main::$0 ]
[8] *((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 main::j#3 ]
[9] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[10] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ]
[7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ]
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ]
to:main::@3
main::@3: scope:[main] from main::@1
[11] phi() [ main::i#2 ]
[10] phi() [ main::i#2 ]
to:main::@2
main::@2: scope:[main] from main::@3 main::@6
[12] (byte) main::j#4 ← phi( main::@6/(byte~) main::j#6 main::@3/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[13] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ]
[14] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@5 [ main::j#4 main::i#1 ]
[11] (byte) main::j#4 ← phi( main::@6/(byte~) main::j#6 main::@3/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ]
[13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@5 [ main::j#4 main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@2
[15] return [ ]
[14] return [ ]
to:@return
main::@5: scope:[main] from main::@2
[16] (byte~) main::i#5 ← (byte) main::i#1 [ main::i#5 main::j#4 ]
[17] (byte~) main::j#5 ← (byte) main::j#4 [ main::i#5 main::j#5 ]
[15] (byte~) main::i#5 ← (byte) main::i#1 [ main::i#5 main::j#4 ]
[16] (byte~) main::j#5 ← (byte) main::j#4 [ main::i#5 main::j#5 ]
to:main::@1
main::@6: scope:[main] from main::@1
[18] (byte~) main::j#6 ← (byte) main::j#1 [ main::i#2 main::j#6 ]
[17] (byte~) main::j#6 ← (byte) main::j#1 [ main::i#2 main::j#6 ]
to:main::@2
Created 3 initial phi equivalence classes
Coalesced [16] main::i#5 ← main::i#1
Coalesced [17] main::j#5 ← main::j#4
Coalesced [18] main::j#6 ← main::j#1
Coalesced [15] main::i#5 ← main::i#1
Coalesced [16] main::j#5 ← main::j#4
Coalesced [17] main::j#6 ← main::j#1
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@5
@ -1012,21 +989,20 @@ main::@1: scope:[main] from main main::@2
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 ) [ main::i#2 main::j#3 ]
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::i#2 main::j#3 ]
[6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ]
[7] (byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3 [ main::i#2 main::j#3 main::$0 ]
[8] *((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 main::j#3 ]
[9] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[10] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ]
[7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ]
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ]
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[11] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ]
[13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ]
[10] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ]
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ]
to:main::@return
main::@return: scope:[main] from main::@2
[14] return [ ]
[13] return [ ]
to:@return
main::@6: scope:[main] from main::@1
[15] phi() [ main::i#2 main::j#1 ]
[14] phi() [ main::i#2 main::j#1 ]
to:main::@2
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -1046,21 +1022,20 @@ main::@1: scope:[main] from main main::@2
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 ) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[7] (byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3 [ main::i#2 main::j#3 main::$0 ] ( main:2 [ main::i#2 main::j#3 main::$0 ] )
[8] *((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[9] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[10] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] )
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[11] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
[13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
[10] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] )
to:main::@return
main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] )
[13] return [ ] ( main:2 [ ] )
to:@return
main::@6: scope:[main] from main::@1
[15] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[14] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2
DOMINATORS
@ -1090,29 +1065,25 @@ VARIABLE REGISTER WEIGHTS
(byte) RED
(byte) WHITE
(void()) main()
(byte~) main::$0 22.0
(byte*) main::cols
(byte[]) main::colseq
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 5.5
(byte) main::i#2 6.285714285714286
(byte) main::j
(byte) main::j#1 11.0
(byte) main::j#3 8.25
(byte) main::j#3 11.0
(byte) main::j#4 7.333333333333333
(byte*) main::screen
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#3 main::j#4 main::j#1 ]
Added variable main::$0 to zero page equivalence class [ main::$0 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#3 main::j#4 main::j#1 ]
[ main::$0 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::j#3 main::j#4 main::j#1 ]
Allocated zp ZP_BYTE:4 [ main::$0 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -1142,7 +1113,6 @@ bend:
main: {
.const screen = $400
.const cols = $d800
.label _0 = 4
.label j = 3
.label i = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
@ -1165,47 +1135,44 @@ main: {
lda #'*'
ldx i
sta screen,x
//SEG18 [7] (byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3 [ main::i#2 main::j#3 main::$0 ] ( main:2 [ main::i#2 main::j#3 main::$0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG18 [7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2
ldx j
lda colseq,x
sta _0
//SEG19 [8] *((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _0
ldx i
sta cols,x
//SEG20 [9] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1=_inc_vbuz1
//SEG19 [8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1=_inc_vbuz1
inc j
//SEG21 [10] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG20 [9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda j
cmp #3
bne b6_from_b1
//SEG22 [11] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG23 [11] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1
//SEG22 [10] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1
lda #0
sta j
jmp b2
//SEG24 main::@2
//SEG23 main::@2
b2:
//SEG25 [12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuz1=_inc_vbuz1
//SEG24 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG26 [13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG25 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$28
bne b1_from_b2
jmp breturn
//SEG27 main::@return
//SEG26 main::@return
breturn:
//SEG28 [14] return [ ] ( main:2 [ ] )
//SEG27 [13] return [ ] ( main:2 [ ] )
rts
//SEG29 [15] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
b6_from_b1:
jmp b6
//SEG30 main::@6
//SEG29 main::@6
b6:
//SEG31 [11] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
b2_from_b6:
//SEG32 [11] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG31 [10] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
jmp b2
colseq: .byte WHITE, RED, GREEN
}
@ -1214,16 +1181,17 @@ REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::j#3 main::j#4 main::j#1 ]
Statement [7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) always clobbers reg byte a
Statement [6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) always clobbers reg byte a
Statement [7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::j#3 main::j#4 main::j#1 ] : zp ZP_BYTE:3 , 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 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 26.58: zp ZP_BYTE:3 [ main::j#3 main::j#4 main::j#1 ] 22: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:4 [ main::$0 ]
Uplift Scope [main] 29.33: zp ZP_BYTE:3 [ main::j#3 main::j#4 main::j#1 ] 22.79: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 553 combination reg byte y [ main::j#3 main::j#4 main::j#1 ] reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::$0 ]
Uplifting [main] best 553 combination reg byte y [ main::j#3 main::j#4 main::j#1 ] reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 553 combination
ASSEMBLER BEFORE OPTIMIZATION
@ -1272,40 +1240,39 @@ main: {
//SEG17 [6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
lda #'*'
sta screen,x
//SEG18 [7] (byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3 [ main::i#2 main::j#3 main::$0 ] ( main:2 [ main::i#2 main::j#3 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
//SEG18 [7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda colseq,y
//SEG19 [8] *((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta cols,x
//SEG20 [9] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
//SEG19 [8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG21 [10] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
//SEG20 [9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
cpy #3
bne b6_from_b1
//SEG22 [11] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG23 [11] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
//SEG22 [10] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
ldy #0
jmp b2
//SEG24 main::@2
//SEG23 main::@2
b2:
//SEG25 [12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx=_inc_vbuxx
//SEG24 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG26 [13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG25 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$28
bne b1_from_b2
jmp breturn
//SEG27 main::@return
//SEG26 main::@return
breturn:
//SEG28 [14] return [ ] ( main:2 [ ] )
//SEG27 [13] return [ ] ( main:2 [ ] )
rts
//SEG29 [15] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
b6_from_b1:
jmp b6
//SEG30 main::@6
//SEG29 main::@6
b6:
//SEG31 [11] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
b2_from_b6:
//SEG32 [11] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG31 [10] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
jmp b2
colseq: .byte WHITE, RED, GREEN
}
@ -1354,7 +1321,6 @@ FINAL SYMBOL TABLE
(byte) WHITE
(const byte) WHITE#0 WHITE = (byte/signed byte/word/signed word) 1
(void()) main()
(byte~) main::$0 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@6
@ -1365,17 +1331,16 @@ FINAL SYMBOL TABLE
(const byte[]) main::colseq#0 colseq = { (const byte) WHITE#0, (const byte) RED#0, (const byte) GREEN#0 }
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 5.5
(byte) main::i#2 reg byte x 6.285714285714286
(byte) main::j
(byte) main::j#1 reg byte y 11.0
(byte) main::j#3 reg byte y 8.25
(byte) main::j#3 reg byte y 11.0
(byte) main::j#4 reg byte y 7.333333333333333
(byte*) main::screen
(const byte*) main::screen#0 screen = ((byte*))(word/signed word) 1024
reg byte x [ main::i#2 main::i#1 ]
reg byte y [ main::j#3 main::j#4 main::j#1 ]
reg byte a [ main::$0 ]
FINAL CODE
//SEG0 Basic Upstart
@ -1411,32 +1376,31 @@ main: {
//SEG17 [6] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte) '*' [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
lda #'*'
sta screen,x
//SEG18 [7] (byte~) main::$0 ← (const byte[]) main::colseq#0 *idx (byte) main::j#3 [ main::i#2 main::j#3 main::$0 ] ( main:2 [ main::i#2 main::j#3 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
//SEG18 [7] *((const byte*) main::cols#0 + (byte) main::i#2) ← *((const byte[]) main::colseq#0 + (byte) main::j#3) [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda colseq,y
//SEG19 [8] *((const byte*) main::cols#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::i#2 main::j#3 ] ( main:2 [ main::i#2 main::j#3 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta cols,x
//SEG20 [9] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
//SEG19 [8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG21 [10] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
//SEG20 [9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 3) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
cpy #3
bne b2
//SEG22 [11] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG23 [11] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG22 [10] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
ldy #0
//SEG24 main::@2
//SEG23 main::@2
b2:
//SEG25 [12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx=_inc_vbuxx
//SEG24 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG26 [13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG25 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 40) goto main::@1 [ main::i#1 main::j#4 ] ( main:2 [ main::i#1 main::j#4 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$28
bne b1
//SEG27 main::@return
//SEG28 [14] return [ ] ( main:2 [ ] )
//SEG26 main::@return
//SEG27 [13] return [ ] ( main:2 [ ] )
rts
//SEG29 [15] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG30 main::@6
//SEG31 [11] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG32 [11] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG29 main::@6
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG31 [10] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
colseq: .byte WHITE, RED, GREEN
}

View File

@ -8,7 +8,6 @@
(byte) WHITE
(const byte) WHITE#0 WHITE = (byte/signed byte/word/signed word) 1
(void()) main()
(byte~) main::$0 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@6
@ -19,14 +18,13 @@
(const byte[]) main::colseq#0 colseq = { (const byte) WHITE#0, (const byte) RED#0, (const byte) GREEN#0 }
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 5.5
(byte) main::i#2 reg byte x 6.285714285714286
(byte) main::j
(byte) main::j#1 reg byte y 11.0
(byte) main::j#3 reg byte y 8.25
(byte) main::j#3 reg byte y 11.0
(byte) main::j#4 reg byte y 7.333333333333333
(byte*) main::screen
(const byte*) main::screen#0 screen = ((byte*))(word/signed word) 1024
reg byte x [ main::i#2 main::i#1 ]
reg byte y [ main::j#3 main::j#4 main::j#1 ]
reg byte a [ main::$0 ]

View File

@ -13,19 +13,18 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 ) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[6] (byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3 [ main::j#3 main::i#2 main::$0 ] ( main:2 [ main::j#3 main::i#2 main::$0 ] )
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[7] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[10] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
[9] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
[11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@2
[13] return [ ] ( main:2 [ ] )
[12] return [ ] ( main:2 [ ] )
to:@return
main::@6: scope:[main] from main::@1
[14] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[13] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2

View File

@ -19,17 +19,16 @@ proc (void()) main()
(byte) main::j ← (byte/signed byte/word/signed word) 0
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
(byte~) main::$0 ← (byte[]) TXT *idx (byte) main::j
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) TXT + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
(byte) main::j ← (byte/signed byte/word/signed word) 0
main::@2:
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
main::@return:
return
endproc // main()
@ -39,10 +38,9 @@ SYMBOLS
(byte*) SCREEN
(byte[]) TXT
(void()) main()
(byte~) main::$0
(boolean~) main::$0
(boolean~) main::$1
(boolean~) main::$2
(boolean~) main::$3
(label) main::@1
(label) main::@2
(label) main::@return
@ -60,17 +58,16 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) TXT *idx (byte) main::j
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) TXT + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@4
main::@3: scope:[main] from main::@1
(byte) main::j ← (byte/signed byte/word/signed word) 0
@ -96,17 +93,16 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) TXT *idx (byte) main::j
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) TXT + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j ← (byte/signed byte/word/signed word) 0
@ -131,17 +127,16 @@ main: scope:[main] from @1
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) TXT *idx (byte) main::j
*((byte*) SCREEN + (byte) main::i) ← (byte~) main::$0
*((byte*) SCREEN + (byte) main::i) ← *((byte[]) TXT + (byte) main::j)
(byte) main::j ← ++ (byte) main::j
(boolean~) main::$1 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$3 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j ← (byte/signed byte/word/signed word) 0
@ -175,12 +170,11 @@ main::@1: scope:[main] from main main::@2
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@2/(byte*) SCREEN#3 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte[]) TXT#1 ← phi( main/(byte[]) TXT#2 main::@2/(byte[]) TXT#3 )
(byte~) main::$0 ← (byte[]) TXT#1 *idx (byte) main::j#3
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) TXT#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#3 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#5 )
@ -188,8 +182,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte[]) TXT#3 ← phi( main::@1/(byte[]) TXT#1 main::@3/(byte[]) TXT#5 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) SCREEN#5 ← phi( main::@1/(byte*) SCREEN#1 )
@ -225,12 +219,11 @@ main::@1: scope:[main] from main main::@2
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@2/(byte*) SCREEN#3 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte[]) TXT#1 ← phi( main/(byte[]) TXT#2 main::@2/(byte[]) TXT#3 )
(byte~) main::$0 ← (byte[]) TXT#1 *idx (byte) main::j#3
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) TXT#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#3 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#5 )
@ -238,8 +231,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte[]) TXT#3 ← phi( main::@1/(byte[]) TXT#1 main::@3/(byte[]) TXT#5 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) SCREEN#5 ← phi( main::@1/(byte*) SCREEN#1 )
@ -279,10 +272,9 @@ INITIAL SSA SYMBOL TABLE
(byte[]) TXT#4
(byte[]) TXT#5
(void()) main()
(byte~) main::$0
(boolean~) main::$0
(boolean~) main::$1
(boolean~) main::$2
(boolean~) main::$3
(label) main::@1
(label) main::@2
(label) main::@3
@ -318,12 +310,11 @@ main::@1: scope:[main] from main main::@2
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@2/(byte*) SCREEN#3 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte[]) TXT#1 ← phi( main/(byte[]) TXT#2 main::@2/(byte[]) TXT#3 )
(byte~) main::$0 ← (byte[]) TXT#1 *idx (byte) main::j#3
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) TXT#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#3 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#5 )
@ -331,8 +322,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte[]) TXT#3 ← phi( main::@1/(byte[]) TXT#1 main::@3/(byte[]) TXT#5 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) SCREEN#5 ← phi( main::@1/(byte*) SCREEN#1 )
@ -350,7 +341,7 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Inversing boolean not (boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8 from (boolean~) main::$1 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
Inversing boolean not (boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8 from (boolean~) main::$0 ← (byte) main::j#1 == (byte/signed byte/word/signed word) 8
Succesful SSA optimization Pass2UnaryNotSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -368,11 +359,10 @@ main::@1: scope:[main] from main main::@2
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@2/(byte*) SCREEN#3 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte[]) TXT#1 ← phi( main/(byte[]) TXT#2 main::@2/(byte[]) TXT#3 )
(byte~) main::$0 ← (byte[]) TXT#1 *idx (byte) main::j#3
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) TXT#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#3 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#5 )
@ -380,8 +370,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte[]) TXT#3 ← phi( main::@1/(byte[]) TXT#1 main::@3/(byte[]) TXT#5 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#4 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte*) SCREEN#5 ← phi( main::@1/(byte*) SCREEN#1 )
@ -423,11 +413,10 @@ main::@1: scope:[main] from main main::@2
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@2/(byte*) SCREEN#3 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte[]) TXT#1 ← phi( main/(byte[]) TXT#2 main::@2/(byte[]) TXT#3 )
(byte~) main::$0 ← (byte[]) TXT#1 *idx (byte) main::j#3
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) TXT#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#3 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#1 )
@ -435,8 +424,8 @@ main::@2: scope:[main] from main::@1 main::@3
(byte[]) TXT#3 ← phi( main::@1/(byte[]) TXT#1 main::@3/(byte[]) TXT#1 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 main::@3/(byte) main::i#2 )
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -471,17 +460,16 @@ main::@1: scope:[main] from main main::@2
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 main::@2/(byte*) SCREEN#1 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte[]) TXT#1 ← phi( main/(byte[]) TXT#2 main::@2/(byte[]) TXT#1 )
(byte~) main::$0 ← (byte[]) TXT#1 *idx (byte) main::j#3
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) TXT#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::j#4 ← phi( main::@1/(byte) main::j#1 main::@3/(byte) main::j#2 )
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -515,17 +503,16 @@ main::@1: scope:[main] from main main::@2
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#2 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte[]) TXT#1 ← phi( main/(byte[]) TXT#2 )
(byte~) main::$0 ← (byte[]) TXT#1 *idx (byte) main::j#3
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#1 + (byte) main::i#2) ← *((byte[]) TXT#1 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::j#4 ← phi( main::@1/(byte) main::j#1 main::@3/(byte) main::j#2 )
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -555,17 +542,16 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte~) main::$0 ← (byte[]) TXT#0 *idx (byte) main::j#3
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#0 + (byte) main::i#2) ← *((byte[]) TXT#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::j#4 ← phi( main::@1/(byte) main::j#1 main::@3/(byte) main::j#2 )
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$3 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$3) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::j#2 ← (byte/signed byte/word/signed word) 0
@ -578,8 +564,8 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$2 if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@2
Simple Condition (boolean~) main::$3 if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1
Simple Condition (boolean~) main::$1 if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@2
Simple Condition (boolean~) main::$2 if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -593,8 +579,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte) main::j#3 ← phi( main/(byte) main::j#0 main::@2/(byte) main::j#4 )
(byte~) main::$0 ← (byte[]) TXT#0 *idx (byte) main::j#3
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
*((byte*) SCREEN#0 + (byte) main::i#2) ← *((byte[]) TXT#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@2
to:main::@3
@ -628,8 +613,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@2/(byte) main::i#1 )
(byte) main::j#3 ← phi( main/(const byte) main::j#0 main::@2/(byte) main::j#4 )
(byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
*((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@2
to:main::@3
@ -648,9 +632,7 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::j#3
Not culling empty block because it shares successor with its predecessor. (label) main::@3
Multiple usages for variable. Not optimizing sub-constant (byte) main::j#3
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
@ -671,8 +653,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 )
(byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 )
(byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
*((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@2
to:main::@3
@ -700,7 +681,6 @@ FINAL SYMBOL TABLE
(byte[]) TXT
(const byte[]) TXT#0 = { (byte/signed byte/word/signed word) 3, (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 13, (byte/signed byte/word/signed word) 5, (byte/signed byte/word/signed word) 12, (byte/signed byte/word/signed word) 15, (byte/signed byte/word/signed word) 20, (byte/signed byte/word/signed word) 32 }
(void()) main()
(byte~) main::$0
(label) main::@1
(label) main::@2
(label) main::@3
@ -729,8 +709,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::i#5 )
(byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::j#5 )
(byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3
*((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
*((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3)
(byte) main::j#1 ← ++ (byte) main::j#3
if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6
to:main::@3
@ -781,34 +760,33 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::i#5 ) [ main::j#3 main::i#2 ]
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::j#5 ) [ main::j#3 main::i#2 ]
[6] (byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3 [ main::j#3 main::i#2 main::$0 ]
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::j#3 main::i#2 ]
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ]
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ]
[7] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ]
to:main::@3
main::@3: scope:[main] from main::@1
[10] phi() [ main::i#2 ]
[9] phi() [ main::i#2 ]
to:main::@2
main::@2: scope:[main] from main::@3 main::@6
[11] (byte) main::j#4 ← phi( main::@6/(byte~) main::j#6 main::@3/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[12] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ]
[13] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@5 [ main::j#4 main::i#1 ]
[10] (byte) main::j#4 ← phi( main::@6/(byte~) main::j#6 main::@3/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ]
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@5 [ main::j#4 main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@2
[14] return [ ]
[13] return [ ]
to:@return
main::@5: scope:[main] from main::@2
[15] (byte~) main::j#5 ← (byte) main::j#4 [ main::j#5 main::i#1 ]
[16] (byte~) main::i#5 ← (byte) main::i#1 [ main::j#5 main::i#5 ]
[14] (byte~) main::j#5 ← (byte) main::j#4 [ main::j#5 main::i#1 ]
[15] (byte~) main::i#5 ← (byte) main::i#1 [ main::j#5 main::i#5 ]
to:main::@1
main::@6: scope:[main] from main::@1
[17] (byte~) main::j#6 ← (byte) main::j#1 [ main::i#2 main::j#6 ]
[16] (byte~) main::j#6 ← (byte) main::j#1 [ main::i#2 main::j#6 ]
to:main::@2
Created 3 initial phi equivalence classes
Coalesced [15] main::j#5 ← main::j#4
Coalesced [16] main::i#5 ← main::i#1
Coalesced [17] main::j#6 ← main::j#1
Coalesced [14] main::j#5 ← main::j#4
Coalesced [15] main::i#5 ← main::i#1
Coalesced [16] main::j#6 ← main::j#1
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@5
@ -840,21 +818,20 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::j#3 main::i#2 ]
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 ) [ main::j#3 main::i#2 ]
[6] (byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3 [ main::j#3 main::i#2 main::$0 ]
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::j#3 main::i#2 ]
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ]
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ]
[7] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ]
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ]
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[10] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ]
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ]
[9] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ]
[10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ]
[11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@2
[13] return [ ]
[12] return [ ]
to:@return
main::@6: scope:[main] from main::@1
[14] phi() [ main::i#2 main::j#1 ]
[13] phi() [ main::i#2 main::j#1 ]
to:main::@2
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -873,21 +850,20 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[5] (byte) main::j#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::j#4 ) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[6] (byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3 [ main::j#3 main::i#2 main::$0 ] ( main:2 [ main::j#3 main::i#2 main::$0 ] )
[7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] )
[7] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[10] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
[9] (byte) main::j#4 ← phi( main::@6/(byte) main::j#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::i#2 main::j#4 ] ( main:2 [ main::i#2 main::j#4 ] )
[10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
[11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@2
[13] return [ ] ( main:2 [ ] )
[12] return [ ] ( main:2 [ ] )
to:@return
main::@6: scope:[main] from main::@1
[14] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
[13] phi() [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] )
to:main::@2
DOMINATORS
@ -916,26 +892,22 @@ VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(byte[]) TXT
(void()) main()
(byte~) main::$0 22.0
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 4.714285714285714
(byte) main::i#2 5.5
(byte) main::j
(byte) main::j#1 11.0
(byte) main::j#3 11.0
(byte) main::j#3 16.5
(byte) main::j#4 7.333333333333333
Initial phi equivalence classes
[ main::j#3 main::j#4 main::j#1 ]
[ main::i#2 main::i#1 ]
Added variable main::$0 to zero page equivalence class [ main::$0 ]
Complete equivalence classes
[ main::j#3 main::j#4 main::j#1 ]
[ main::i#2 main::i#1 ]
[ main::$0 ]
Allocated zp ZP_BYTE:2 [ main::j#3 main::j#4 main::j#1 ]
Allocated zp ZP_BYTE:3 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:4 [ main::$0 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -962,7 +934,6 @@ bend_from_b1:
bend:
//SEG9 main
main: {
.label _0 = 4
.label j = 2
.label i = 3
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
@ -981,60 +952,60 @@ main: {
jmp b1
//SEG16 main::@1
b1:
//SEG17 [6] (byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3 [ main::j#3 main::i#2 main::$0 ] ( main:2 [ main::j#3 main::i#2 main::$0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG17 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2
ldx j
lda TXT,x
sta _0
//SEG18 [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _0
ldx i
sta SCREEN,x
//SEG19 [8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1=_inc_vbuz1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1=_inc_vbuz1
inc j
//SEG20 [9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda j
cmp #8
bne b6_from_b1
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG20 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG22 [10] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1
//SEG21 [9] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1
lda #0
sta j
jmp b2
//SEG23 main::@2
//SEG22 main::@2
b2:
//SEG24 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuz1=_inc_vbuz1
//SEG23 [10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG25 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG24 [11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$65
bne b1_from_b2
jmp breturn
//SEG26 main::@return
//SEG25 main::@return
breturn:
//SEG27 [13] return [ ] ( main:2 [ ] )
//SEG26 [12] return [ ] ( main:2 [ ] )
rts
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG27 [13] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
b6_from_b1:
jmp b6
//SEG29 main::@6
//SEG28 main::@6
b6:
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
b2_from_b6:
//SEG31 [10] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG30 [9] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
jmp b2
}
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_BYTE:2 [ main::j#3 main::j#4 main::j#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::i#2 main::i#1 ] : zp ZP_BYTE:3 , 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 ,
Statement [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::j#3 main::j#4 main::j#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::i#2 main::i#1 ]
Statement [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::j#3 main::j#4 main::j#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::i#2 main::i#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 29.33: zp ZP_BYTE:2 [ main::j#3 main::j#4 main::j#1 ] 22: zp ZP_BYTE:4 [ main::$0 ] 21.21: zp ZP_BYTE:3 [ main::i#2 main::i#1 ]
Uplift Scope [main] 34.83: zp ZP_BYTE:2 [ main::j#3 main::j#4 main::j#1 ] 22: zp ZP_BYTE:3 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 483 combination reg byte y [ main::j#3 main::j#4 main::j#1 ] reg byte a [ main::$0 ] reg byte x [ main::i#2 main::i#1 ]
Uplifting [main] best 483 combination reg byte y [ main::j#3 main::j#4 main::j#1 ] reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 483 combination
ASSEMBLER BEFORE OPTIMIZATION
@ -1077,40 +1048,39 @@ main: {
jmp b1
//SEG16 main::@1
b1:
//SEG17 [6] (byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3 [ main::j#3 main::i#2 main::$0 ] ( main:2 [ main::j#3 main::i#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
//SEG17 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda TXT,y
//SEG18 [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN,x
//SEG19 [8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG20 [9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
cpy #8
bne b6_from_b1
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG20 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG22 [10] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
//SEG21 [9] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
ldy #0
jmp b2
//SEG23 main::@2
//SEG22 main::@2
b2:
//SEG24 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG23 [10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG25 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG24 [11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$65
bne b1_from_b2
jmp breturn
//SEG26 main::@return
//SEG25 main::@return
breturn:
//SEG27 [13] return [ ] ( main:2 [ ] )
//SEG26 [12] return [ ] ( main:2 [ ] )
rts
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG27 [13] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
b6_from_b1:
jmp b6
//SEG29 main::@6
//SEG28 main::@6
b6:
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
b2_from_b6:
//SEG31 [10] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG30 [9] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
jmp b2
}
@ -1156,22 +1126,20 @@ FINAL SYMBOL TABLE
(byte[]) TXT
(const byte[]) TXT#0 TXT = { (byte/signed byte/word/signed word) 3, (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 13, (byte/signed byte/word/signed word) 5, (byte/signed byte/word/signed word) 12, (byte/signed byte/word/signed word) 15, (byte/signed byte/word/signed word) 20, (byte/signed byte/word/signed word) 32 }
(void()) main()
(byte~) main::$0 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@6
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 4.714285714285714
(byte) main::i#2 reg byte x 5.5
(byte) main::j
(byte) main::j#1 reg byte y 11.0
(byte) main::j#3 reg byte y 11.0
(byte) main::j#3 reg byte y 16.5
(byte) main::j#4 reg byte y 7.333333333333333
reg byte y [ main::j#3 main::j#4 main::j#1 ]
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$0 ]
FINAL CODE
//SEG0 Basic Upstart
@ -1201,31 +1169,30 @@ main: {
//SEG15 [5] phi (byte) main::j#3 = (byte) main::j#4 [phi:main::@2->main::@1#1] -- register_copy
//SEG16 main::@1
b1:
//SEG17 [6] (byte~) main::$0 ← (const byte[]) TXT#0 *idx (byte) main::j#3 [ main::j#3 main::i#2 main::$0 ] ( main:2 [ main::j#3 main::i#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
//SEG17 [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda TXT,y
//SEG18 [7] *((const byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0 [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN,x
//SEG19 [8] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#3 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG20 [9] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::i#2 main::j#1 ] ( main:2 [ main::i#2 main::j#1 ] ) -- vbuyy_neq_vbuc1_then_la1
cpy #8
bne b2
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG22 [10] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
//SEG20 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG21 [9] phi (byte) main::j#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuyy=vbuc1
ldy #0
//SEG23 main::@2
//SEG22 main::@2
b2:
//SEG24 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG23 [10] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG25 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG24 [11] if((byte) main::i#1!=(byte/signed byte/word/signed word) 101) goto main::@1 [ main::j#4 main::i#1 ] ( main:2 [ main::j#4 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$65
bne b1
//SEG26 main::@return
//SEG27 [13] return [ ] ( main:2 [ ] )
//SEG25 main::@return
//SEG26 [12] return [ ] ( main:2 [ ] )
rts
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG29 main::@6
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG31 [10] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG27 [13] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG28 main::@6
//SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG30 [9] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy
}

View File

@ -6,19 +6,17 @@
(byte[]) TXT
(const byte[]) TXT#0 TXT = { (byte/signed byte/word/signed word) 3, (byte/signed byte/word/signed word) 1, (byte/signed byte/word/signed word) 13, (byte/signed byte/word/signed word) 5, (byte/signed byte/word/signed word) 12, (byte/signed byte/word/signed word) 15, (byte/signed byte/word/signed word) 20, (byte/signed byte/word/signed word) 32 }
(void()) main()
(byte~) main::$0 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@6
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 4.714285714285714
(byte) main::i#2 reg byte x 5.5
(byte) main::j
(byte) main::j#1 reg byte y 11.0
(byte) main::j#3 reg byte y 11.0
(byte) main::j#3 reg byte y 16.5
(byte) main::j#4 reg byte y 7.333333333333333
reg byte y [ main::j#3 main::j#4 main::j#1 ]
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$0 ]

View File

@ -13,19 +13,18 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
[5] (byte*) main::cursor#2 ← phi( main/(const byte*) SCREEN#0 main::@2/(byte*) main::cursor#1 ) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[5] (byte) main::i#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#4 ) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[6] (byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3 [ main::i#3 main::cursor#2 main::$0 ] ( main:2 [ main::i#3 main::cursor#2 main::$0 ] )
[7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[8] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[7] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[8] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[10] (byte) main::i#4 ← phi( main::@6/(byte) main::i#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ] ( main:2 [ main::cursor#2 main::i#4 ] )
[11] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
[12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
[9] (byte) main::i#4 ← phi( main::@6/(byte) main::i#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ] ( main:2 [ main::cursor#2 main::i#4 ] )
[10] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
[11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
to:main::@return
main::@return: scope:[main] from main::@2
[13] return [ ] ( main:2 [ ] )
[12] return [ ] ( main:2 [ ] )
to:@return
main::@6: scope:[main] from main::@1
[14] phi() [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[13] phi() [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
to:main::@2

View File

@ -21,18 +21,17 @@ proc (void()) main()
(byte*) main::cursor ← (byte*) SCREEN
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
(byte~) main::$0 ← (byte[]) TEXT *idx (byte) main::i
*((byte*) main::cursor) ← (byte~) main::$0
*((byte*) main::cursor) ← *((byte[]) TEXT + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@2:
(byte*) main::cursor ← ++ (byte*) main::cursor
(byte*~) main::$3 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
main::@return:
return
endproc // main()
@ -42,11 +41,10 @@ SYMBOLS
(byte*) SCREEN
(byte[]) TEXT
(void()) main()
(byte~) main::$0
(boolean~) main::$0
(boolean~) main::$1
(boolean~) main::$2
(byte*~) main::$3
(boolean~) main::$4
(byte*~) main::$2
(boolean~) main::$3
(label) main::@1
(label) main::@2
(label) main::@return
@ -64,18 +62,17 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) TEXT *idx (byte) main::i
*((byte*) main::cursor) ← (byte~) main::$0
*((byte*) main::cursor) ← *((byte[]) TEXT + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cursor ← ++ (byte*) main::cursor
(byte*~) main::$3 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@4
main::@3: scope:[main] from main::@1
(byte) main::i ← (byte/signed byte/word/signed word) 0
@ -101,18 +98,17 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) TEXT *idx (byte) main::i
*((byte*) main::cursor) ← (byte~) main::$0
*((byte*) main::cursor) ← *((byte[]) TEXT + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cursor ← ++ (byte*) main::cursor
(byte*~) main::$3 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::i ← (byte/signed byte/word/signed word) 0
@ -137,18 +133,17 @@ main: scope:[main] from @1
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) TEXT *idx (byte) main::i
*((byte*) main::cursor) ← (byte~) main::$0
*((byte*) main::cursor) ← *((byte[]) TEXT + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$1 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::i == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte*) main::cursor ← ++ (byte*) main::cursor
(byte*~) main::$3 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::i ← (byte/signed byte/word/signed word) 0
@ -182,12 +177,11 @@ main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte[]) TEXT#1 ← phi( main/(byte[]) TEXT#2 main::@2/(byte[]) TEXT#3 )
(byte~) main::$0 ← (byte[]) TEXT#1 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#1 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$1 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
@ -195,9 +189,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#4 main::@3/(byte*) SCREEN#5 )
(byte*) main::cursor#3 ← phi( main::@1/(byte*) main::cursor#2 main::@3/(byte*) main::cursor#4 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#3
(byte*~) main::$3 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte[]) TEXT#5 ← phi( main::@1/(byte[]) TEXT#1 )
@ -233,12 +227,11 @@ main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte[]) TEXT#1 ← phi( main/(byte[]) TEXT#2 main::@2/(byte[]) TEXT#3 )
(byte~) main::$0 ← (byte[]) TEXT#1 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#1 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$1 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
@ -246,9 +239,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#4 main::@3/(byte*) SCREEN#5 )
(byte*) main::cursor#3 ← phi( main::@1/(byte*) main::cursor#2 main::@3/(byte*) main::cursor#4 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#3
(byte*~) main::$3 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte[]) TEXT#5 ← phi( main::@1/(byte[]) TEXT#1 )
@ -288,11 +281,10 @@ INITIAL SSA SYMBOL TABLE
(byte[]) TEXT#4
(byte[]) TEXT#5
(void()) main()
(byte~) main::$0
(boolean~) main::$0
(boolean~) main::$1
(boolean~) main::$2
(byte*~) main::$3
(boolean~) main::$4
(byte*~) main::$2
(boolean~) main::$3
(label) main::@1
(label) main::@2
(label) main::@3
@ -328,12 +320,11 @@ main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte[]) TEXT#1 ← phi( main/(byte[]) TEXT#2 main::@2/(byte[]) TEXT#3 )
(byte~) main::$0 ← (byte[]) TEXT#1 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#1 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$1 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$2 ← ! (boolean~) main::$1
if((boolean~) main::$2) goto main::@2
(boolean~) main::$0 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
(boolean~) main::$1 ← ! (boolean~) main::$0
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
@ -341,9 +332,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#4 main::@3/(byte*) SCREEN#5 )
(byte*) main::cursor#3 ← phi( main::@1/(byte*) main::cursor#2 main::@3/(byte*) main::cursor#4 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#3
(byte*~) main::$3 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte[]) TEXT#5 ← phi( main::@1/(byte[]) TEXT#1 )
@ -361,7 +352,7 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Inversing boolean not (boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8 from (boolean~) main::$1 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
Inversing boolean not (boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8 from (boolean~) main::$0 ← (byte) main::i#1 == (byte/signed byte/word/signed word) 8
Succesful SSA optimization Pass2UnaryNotSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -379,11 +370,10 @@ main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte[]) TEXT#1 ← phi( main/(byte[]) TEXT#2 main::@2/(byte[]) TEXT#3 )
(byte~) main::$0 ← (byte[]) TEXT#1 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#1 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
@ -391,9 +381,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#4 main::@3/(byte*) SCREEN#5 )
(byte*) main::cursor#3 ← phi( main::@1/(byte*) main::cursor#2 main::@3/(byte*) main::cursor#4 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#3
(byte*~) main::$3 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte[]) TEXT#5 ← phi( main::@1/(byte[]) TEXT#1 )
@ -436,11 +426,10 @@ main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte[]) TEXT#1 ← phi( main/(byte[]) TEXT#2 main::@2/(byte[]) TEXT#3 )
(byte~) main::$0 ← (byte[]) TEXT#1 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#1 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
@ -448,9 +437,9 @@ main::@2: scope:[main] from main::@1 main::@3
(byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#4 main::@3/(byte*) SCREEN#4 )
(byte*) main::cursor#3 ← phi( main::@1/(byte*) main::cursor#2 main::@3/(byte*) main::cursor#2 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#3
(byte*~) main::$3 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::i#2 ← (byte/signed byte/word/signed word) 0
@ -486,18 +475,17 @@ main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte[]) TEXT#1 ← phi( main/(byte[]) TEXT#2 main::@2/(byte[]) TEXT#1 )
(byte~) main::$0 ← (byte[]) TEXT#1 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#1 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#2
(byte*~) main::$3 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::i#2 ← (byte/signed byte/word/signed word) 0
@ -532,18 +520,17 @@ main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte[]) TEXT#1 ← phi( main/(byte[]) TEXT#2 )
(byte~) main::$0 ← (byte[]) TEXT#1 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#1 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#2
(byte*~) main::$3 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#2 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::i#2 ← (byte/signed byte/word/signed word) 0
@ -573,18 +560,17 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte~) main::$0 ← (byte[]) TEXT#0 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#0 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$2) goto main::@2
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 8
if((boolean~) main::$1) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#2
(byte*~) main::$3 ← (byte*) SCREEN#0 + (word/signed word) 1000
(boolean~) main::$4 ← (byte*) main::cursor#1 < (byte*~) main::$3
if((boolean~) main::$4) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#0 + (word/signed word) 1000
(boolean~) main::$3 ← (byte*) main::cursor#1 < (byte*~) main::$2
if((boolean~) main::$3) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::i#2 ← (byte/signed byte/word/signed word) 0
@ -597,8 +583,8 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$2 if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@2
Simple Condition (boolean~) main::$4 if((byte*) main::cursor#1<(byte*~) main::$3) goto main::@1
Simple Condition (boolean~) main::$1 if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@2
Simple Condition (boolean~) main::$3 if((byte*) main::cursor#1<(byte*~) main::$2) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -612,16 +598,15 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#4 )
(byte~) main::$0 ← (byte[]) TEXT#0 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((byte[]) TEXT#0 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#2 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#2
(byte*~) main::$3 ← (byte*) SCREEN#0 + (word/signed word) 1000
if((byte*) main::cursor#1<(byte*~) main::$3) goto main::@1
(byte*~) main::$2 ← (byte*) SCREEN#0 + (word/signed word) 1000
if((byte*) main::cursor#1<(byte*~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
(byte) main::i#2 ← (byte/signed byte/word/signed word) 0
@ -648,16 +633,15 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(const byte) main::i#0 main::@2/(byte) main::i#4 )
(byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(const byte) main::i#2 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#2
(byte*~) main::$3 ← (const byte*) SCREEN#0 + (word/signed word) 1000
if((byte*) main::cursor#1<(byte*~) main::$3) goto main::@1
(byte*~) main::$2 ← (const byte*) SCREEN#0 + (word/signed word) 1000
if((byte*) main::cursor#1<(byte*~) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
to:main::@2
@ -670,7 +654,7 @@ main::@return: scope:[main] from main::@2
@end: scope:[] from @1
Constant (const byte*) main::cursor#0 = SCREEN#0
Constant (const byte*) main::$3 = SCREEN#0+1000
Constant (const byte*) main::$2 = SCREEN#0+1000
Succesful SSA optimization Pass2ConstantIdentification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -680,15 +664,14 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(const byte*) main::cursor#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(const byte) main::i#0 main::@2/(byte) main::i#4 )
(byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1 main::@3
(byte) main::i#4 ← phi( main::@1/(byte) main::i#1 main::@3/(const byte) main::i#2 )
(byte*) main::cursor#1 ← ++ (byte*) main::cursor#2
if((byte*) main::cursor#1<(const byte*) main::$3) goto main::@1
if((byte*) main::cursor#1<(const byte*) main::$2) goto main::@1
to:main::@return
main::@3: scope:[main] from main::@1
to:main::@2
@ -700,9 +683,7 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#3
Not culling empty block because it shares successor with its predecessor. (label) main::@3
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#3
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
@ -712,8 +693,8 @@ Inlining constant with var siblings (const byte) main::i#2
Inlining constant with var siblings (const byte*) main::cursor#0
Inlining constant with var siblings (const byte*) main::cursor#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word) 0
Constant inlined main::$3 = (const byte*) SCREEN#0+(word/signed word) 1000
Constant inlined main::i#2 = (byte/signed byte/word/signed word) 0
Constant inlined main::$2 = (const byte*) SCREEN#0+(word/signed word) 1000
Constant inlined main::cursor#0 = (const byte*) SCREEN#0
Succesful SSA optimization Pass2ConstantInlining
CONTROL FLOW GRAPH
@ -724,8 +705,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
(byte*) main::cursor#2 ← phi( main/(const byte*) SCREEN#0 main::@2/(byte*) main::cursor#1 )
(byte) main::i#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#4 )
(byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@2
to:main::@3
@ -753,7 +733,6 @@ FINAL SYMBOL TABLE
(byte[]) TEXT
(const byte[]) TEXT#0 = (string) "camelot "
(void()) main()
(byte~) main::$0
(label) main::@1
(label) main::@2
(label) main::@3
@ -782,8 +761,7 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
(byte*) main::cursor#2 ← phi( main/(const byte*) SCREEN#0 main::@5/(byte*~) main::cursor#5 )
(byte) main::i#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::i#5 )
(byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3
*((byte*) main::cursor#2) ← (byte~) main::$0
*((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6
to:main::@3
@ -834,34 +812,33 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@5
[5] (byte*) main::cursor#2 ← phi( main/(const byte*) SCREEN#0 main::@5/(byte*~) main::cursor#5 ) [ main::i#3 main::cursor#2 ]
[5] (byte) main::i#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@5/(byte~) main::i#5 ) [ main::i#3 main::cursor#2 ]
[6] (byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3 [ main::i#3 main::cursor#2 main::$0 ]
[7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ]
[8] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ]
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ]
[6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ]
[7] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ]
[8] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ]
to:main::@3
main::@3: scope:[main] from main::@1
[10] phi() [ main::cursor#2 ]
[9] phi() [ main::cursor#2 ]
to:main::@2
main::@2: scope:[main] from main::@3 main::@6
[11] (byte) main::i#4 ← phi( main::@6/(byte~) main::i#6 main::@3/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ]
[12] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ]
[13] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@5 [ main::i#4 main::cursor#1 ]
[10] (byte) main::i#4 ← phi( main::@6/(byte~) main::i#6 main::@3/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ]
[11] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ]
[12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@5 [ main::i#4 main::cursor#1 ]
to:main::@return
main::@return: scope:[main] from main::@2
[14] return [ ]
[13] return [ ]
to:@return
main::@5: scope:[main] from main::@2
[15] (byte~) main::i#5 ← (byte) main::i#4 [ main::i#5 main::cursor#1 ]
[16] (byte*~) main::cursor#5 ← (byte*) main::cursor#1 [ main::i#5 main::cursor#5 ]
[14] (byte~) main::i#5 ← (byte) main::i#4 [ main::i#5 main::cursor#1 ]
[15] (byte*~) main::cursor#5 ← (byte*) main::cursor#1 [ main::i#5 main::cursor#5 ]
to:main::@1
main::@6: scope:[main] from main::@1
[17] (byte~) main::i#6 ← (byte) main::i#1 [ main::cursor#2 main::i#6 ]
[16] (byte~) main::i#6 ← (byte) main::i#1 [ main::cursor#2 main::i#6 ]
to:main::@2
Created 3 initial phi equivalence classes
Coalesced [15] main::i#5 ← main::i#4
Coalesced [16] main::cursor#5 ← main::cursor#1
Coalesced [17] main::i#6 ← main::i#1
Coalesced [14] main::i#5 ← main::i#4
Coalesced [15] main::cursor#5 ← main::cursor#1
Coalesced [16] main::i#6 ← main::i#1
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@5
@ -893,21 +870,20 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
[5] (byte*) main::cursor#2 ← phi( main/(const byte*) SCREEN#0 main::@2/(byte*) main::cursor#1 ) [ main::i#3 main::cursor#2 ]
[5] (byte) main::i#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#4 ) [ main::i#3 main::cursor#2 ]
[6] (byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3 [ main::i#3 main::cursor#2 main::$0 ]
[7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ]
[8] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ]
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ]
[6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ]
[7] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ]
[8] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ]
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[10] (byte) main::i#4 ← phi( main::@6/(byte) main::i#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ]
[11] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ]
[12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ]
[9] (byte) main::i#4 ← phi( main::@6/(byte) main::i#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ]
[10] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ]
[11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ]
to:main::@return
main::@return: scope:[main] from main::@2
[13] return [ ]
[12] return [ ]
to:@return
main::@6: scope:[main] from main::@1
[14] phi() [ main::cursor#2 main::i#1 ]
[13] phi() [ main::cursor#2 main::i#1 ]
to:main::@2
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -926,21 +902,20 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@2
[5] (byte*) main::cursor#2 ← phi( main/(const byte*) SCREEN#0 main::@2/(byte*) main::cursor#1 ) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[5] (byte) main::i#3 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#4 ) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[6] (byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3 [ main::i#3 main::cursor#2 main::$0 ] ( main:2 [ main::i#3 main::cursor#2 main::$0 ] )
[7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[8] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] )
[7] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[8] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[10] (byte) main::i#4 ← phi( main::@6/(byte) main::i#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ] ( main:2 [ main::cursor#2 main::i#4 ] )
[11] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
[12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
[9] (byte) main::i#4 ← phi( main::@6/(byte) main::i#1 main::@1/(byte/signed byte/word/signed word) 0 ) [ main::cursor#2 main::i#4 ] ( main:2 [ main::cursor#2 main::i#4 ] )
[10] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
[11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] )
to:main::@return
main::@return: scope:[main] from main::@2
[13] return [ ] ( main:2 [ ] )
[12] return [ ] ( main:2 [ ] )
to:@return
main::@6: scope:[main] from main::@1
[14] phi() [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
[13] phi() [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] )
to:main::@2
DOMINATORS
@ -969,26 +944,22 @@ VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(byte[]) TEXT
(void()) main()
(byte~) main::$0 22.0
(byte*) main::cursor
(byte*) main::cursor#1 16.5
(byte*) main::cursor#2 4.714285714285714
(byte*) main::cursor#2 5.5
(byte) main::i
(byte) main::i#1 11.0
(byte) main::i#3 11.0
(byte) main::i#3 16.5
(byte) main::i#4 7.333333333333333
Initial phi equivalence classes
[ main::i#3 main::i#4 main::i#1 ]
[ main::cursor#2 main::cursor#1 ]
Added variable main::$0 to zero page equivalence class [ main::$0 ]
Complete equivalence classes
[ main::i#3 main::i#4 main::i#1 ]
[ main::cursor#2 main::cursor#1 ]
[ main::$0 ]
Allocated zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ]
Allocated zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ]
Allocated zp ZP_BYTE:5 [ main::$0 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -1015,7 +986,6 @@ bend_from_b1:
bend:
//SEG9 main
main: {
.label _0 = 5
.label i = 2
.label cursor = 3
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
@ -1036,34 +1006,31 @@ main: {
jmp b1
//SEG16 main::@1
b1:
//SEG17 [6] (byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3 [ main::i#3 main::cursor#2 main::$0 ] ( main:2 [ main::i#3 main::cursor#2 main::$0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG17 [6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) -- _deref_pbuz1=pbuc1_derefidx_vbuz2
ldx i
lda TEXT,x
sta _0
//SEG18 [7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) -- _deref_pbuz1=vbuz2
ldy #0
lda _0
sta (cursor),y
//SEG19 [8] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuz1=_inc_vbuz1
//SEG18 [7] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG20 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #8
bne b6_from_b1
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG20 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG22 [10] phi (byte) main::i#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1
//SEG21 [9] phi (byte) main::i#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b2
//SEG23 main::@2
//SEG22 main::@2
b2:
//SEG24 [11] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1=_inc_pbuz1
//SEG23 [10] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1=_inc_pbuz1
inc cursor
bne !+
inc cursor+1
!:
//SEG25 [12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1_lt_pbuc1_then_la1
//SEG24 [11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1_lt_pbuc1_then_la1
lda cursor+1
cmp #>SCREEN+$3e8
bcc b1_from_b2
@ -1073,37 +1040,36 @@ main: {
bcc b1_from_b2
!:
jmp breturn
//SEG26 main::@return
//SEG25 main::@return
breturn:
//SEG27 [13] return [ ] ( main:2 [ ] )
//SEG26 [12] return [ ] ( main:2 [ ] )
rts
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG27 [13] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
b6_from_b1:
jmp b6
//SEG29 main::@6
//SEG28 main::@6
b6:
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
b2_from_b6:
//SEG31 [10] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG30 [9] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy
jmp b2
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ]
Statement [12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) always clobbers reg byte a
Statement [6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ]
Statement [7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) always clobbers reg byte y
Statement [12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ]
Statement [11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) always clobbers reg byte a
Statement [6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) always clobbers reg byte a reg byte y
Statement [11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ] : zp ZP_BYTE:2 , reg byte x ,
Potential registers zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ] : zp ZP_WORD:3 ,
Potential registers zp ZP_BYTE:5 [ main::$0 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 29.33: zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ] 22: zp ZP_BYTE:5 [ main::$0 ] 21.21: zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ]
Uplift Scope [main] 34.83: zp ZP_BYTE:2 [ main::i#3 main::i#4 main::i#1 ] 22: zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ]
Uplift Scope []
Uplifting [main] best 858 combination reg byte x [ main::i#3 main::i#4 main::i#1 ] reg byte a [ main::$0 ] zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ]
Uplifting [main] best 858 combination reg byte x [ main::i#3 main::i#4 main::i#1 ] zp ZP_WORD:3 [ main::cursor#2 main::cursor#1 ]
Uplifting [] best 858 combination
Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ main::cursor#2 main::cursor#1 ]
@ -1151,29 +1117,28 @@ main: {
jmp b1
//SEG16 main::@1
b1:
//SEG17 [6] (byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3 [ main::i#3 main::cursor#2 main::$0 ] ( main:2 [ main::i#3 main::cursor#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG17 [6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda TEXT,x
//SEG18 [7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) -- _deref_pbuz1=vbuaa
ldy #0
sta (cursor),y
//SEG19 [8] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [7] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG20 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne b6_from_b1
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG20 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG22 [10] phi (byte) main::i#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
//SEG21 [9] phi (byte) main::i#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
ldx #0
jmp b2
//SEG23 main::@2
//SEG22 main::@2
b2:
//SEG24 [11] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1=_inc_pbuz1
//SEG23 [10] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1=_inc_pbuz1
inc cursor
bne !+
inc cursor+1
!:
//SEG25 [12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1_lt_pbuc1_then_la1
//SEG24 [11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1_lt_pbuc1_then_la1
lda cursor+1
cmp #>SCREEN+$3e8
bcc b1_from_b2
@ -1183,18 +1148,18 @@ main: {
bcc b1_from_b2
!:
jmp breturn
//SEG26 main::@return
//SEG25 main::@return
breturn:
//SEG27 [13] return [ ] ( main:2 [ ] )
//SEG26 [12] return [ ] ( main:2 [ ] )
rts
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG27 [13] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
b6_from_b1:
jmp b6
//SEG29 main::@6
//SEG28 main::@6
b6:
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
b2_from_b6:
//SEG31 [10] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG30 [9] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy
jmp b2
}
@ -1241,22 +1206,20 @@ FINAL SYMBOL TABLE
(byte[]) TEXT
(const byte[]) TEXT#0 TEXT = (string) "camelot "
(void()) main()
(byte~) main::$0 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@6
(label) main::@return
(byte*) main::cursor
(byte*) main::cursor#1 cursor zp ZP_WORD:2 16.5
(byte*) main::cursor#2 cursor zp ZP_WORD:2 4.714285714285714
(byte*) main::cursor#2 cursor zp ZP_WORD:2 5.5
(byte) main::i
(byte) main::i#1 reg byte x 11.0
(byte) main::i#3 reg byte x 11.0
(byte) main::i#3 reg byte x 16.5
(byte) main::i#4 reg byte x 7.333333333333333
reg byte x [ main::i#3 main::i#4 main::i#1 ]
zp ZP_WORD:2 [ main::cursor#2 main::cursor#1 ]
reg byte a [ main::$0 ]
FINAL CODE
//SEG0 Basic Upstart
@ -1290,27 +1253,26 @@ main: {
//SEG15 [5] phi (byte) main::i#3 = (byte) main::i#4 [phi:main::@2->main::@1#1] -- register_copy
//SEG16 main::@1
b1:
//SEG17 [6] (byte~) main::$0 ← (const byte[]) TEXT#0 *idx (byte) main::i#3 [ main::i#3 main::cursor#2 main::$0 ] ( main:2 [ main::i#3 main::cursor#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG17 [6] *((byte*) main::cursor#2) ← *((const byte[]) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda TEXT,x
//SEG18 [7] *((byte*) main::cursor#2) ← (byte~) main::$0 [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) -- _deref_pbuz1=vbuaa
ldy #0
sta (cursor),y
//SEG19 [8] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [7] (byte) main::i#1 ← ++ (byte) main::i#3 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG20 [9] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::i#1!=(byte/signed byte/word/signed word) 8) goto main::@6 [ main::cursor#2 main::i#1 ] ( main:2 [ main::cursor#2 main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne b2
//SEG21 [10] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG22 [10] phi (byte) main::i#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
//SEG20 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG21 [9] phi (byte) main::i#4 = (byte/signed byte/word/signed word) 0 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
ldx #0
//SEG23 main::@2
//SEG22 main::@2
b2:
//SEG24 [11] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1=_inc_pbuz1
//SEG23 [10] (byte*) main::cursor#1 ← ++ (byte*) main::cursor#2 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1=_inc_pbuz1
inc cursor
bne !+
inc cursor+1
!:
//SEG25 [12] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1_lt_pbuc1_then_la1
//SEG24 [11] if((byte*) main::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto main::@1 [ main::i#4 main::cursor#1 ] ( main:2 [ main::i#4 main::cursor#1 ] ) -- pbuz1_lt_pbuc1_then_la1
lda cursor+1
cmp #>SCREEN+$3e8
bcc b1
@ -1319,12 +1281,12 @@ main: {
cmp #<SCREEN+$3e8
bcc b1
!:
//SEG26 main::@return
//SEG27 [13] return [ ] ( main:2 [ ] )
//SEG25 main::@return
//SEG26 [12] return [ ] ( main:2 [ ] )
rts
//SEG28 [14] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG29 main::@6
//SEG30 [10] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG31 [10] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy
//SEG27 [13] phi from main::@1 to main::@6 [phi:main::@1->main::@6]
//SEG28 main::@6
//SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2]
//SEG30 [9] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy
}

View File

@ -6,19 +6,17 @@
(byte[]) TEXT
(const byte[]) TEXT#0 TEXT = (string) "camelot "
(void()) main()
(byte~) main::$0 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@6
(label) main::@return
(byte*) main::cursor
(byte*) main::cursor#1 cursor zp ZP_WORD:2 16.5
(byte*) main::cursor#2 cursor zp ZP_WORD:2 4.714285714285714
(byte*) main::cursor#2 cursor zp ZP_WORD:2 5.5
(byte) main::i
(byte) main::i#1 reg byte x 11.0
(byte) main::i#3 reg byte x 11.0
(byte) main::i#3 reg byte x 16.5
(byte) main::i#4 reg byte x 7.333333333333333
reg byte x [ main::i#3 main::i#4 main::i#1 ]
zp ZP_WORD:2 [ main::cursor#2 main::cursor#1 ]
reg byte a [ main::$0 ]

View File

@ -13,13 +13,11 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] )
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ] ( main:2 [ main::i#2 main::$3 ] )
[10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[10] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ] ( main:2 [ ] )
[11] return [ ] ( main:2 [ ] )
to:@return

View File

@ -27,14 +27,12 @@ proc (void()) main()
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i
(byte~) main::$1 ← (byte[]) str *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
(byte~) main::$3 ← (byte[]) nums *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN + (byte~) main::$0) ← *((byte[]) str + (byte) main::i)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
*((byte*) SCREEN + (byte~) main::$1) ← *((byte[]) nums + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$4 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
main::@return:
return
endproc // main()
@ -48,9 +46,7 @@ SYMBOLS
(void()) main()
(byte~) main::$0
(byte~) main::$1
(byte~) main::$2
(byte~) main::$3
(boolean~) main::$4
(boolean~) main::$2
(label) main::@1
(label) main::@return
(byte) main::i
@ -76,14 +72,12 @@ main: scope:[main] from
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i
(byte~) main::$1 ← (byte[]) str *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
(byte~) main::$3 ← (byte[]) nums *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN + (byte~) main::$0) ← *((byte[]) str + (byte) main::i)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
*((byte*) SCREEN + (byte~) main::$1) ← *((byte[]) nums + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$4 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
to:main::@return
@ -113,14 +107,12 @@ main: scope:[main] from
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i
(byte~) main::$1 ← (byte[]) str *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
(byte~) main::$3 ← (byte[]) nums *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN + (byte~) main::$0) ← *((byte[]) str + (byte) main::i)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
*((byte*) SCREEN + (byte~) main::$1) ← *((byte[]) nums + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$4 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -149,14 +141,12 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i
(byte~) main::$1 ← (byte[]) str *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
(byte~) main::$3 ← (byte[]) nums *idx (byte) main::i
*((byte*) SCREEN + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN + (byte~) main::$0) ← *((byte[]) str + (byte) main::i)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i
*((byte*) SCREEN + (byte~) main::$1) ← *((byte[]) nums + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
(boolean~) main::$4 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -197,14 +187,12 @@ main::@1: scope:[main] from main main::@1
(byte[]) str#1 ← phi( main/(byte[]) str#2 main::@1/(byte[]) str#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (byte[]) nums#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN#2 + (byte~) main::$0) ← *((byte[]) str#1 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$1) ← *((byte[]) nums#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$4 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -247,14 +235,12 @@ main::@1: scope:[main] from main main::@1
(byte[]) str#1 ← phi( main/(byte[]) str#2 main::@1/(byte[]) str#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (byte[]) nums#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN#2 + (byte~) main::$0) ← *((byte[]) str#1 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$1) ← *((byte[]) nums#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$4 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -290,9 +276,7 @@ INITIAL SSA SYMBOL TABLE
(void()) main()
(byte~) main::$0
(byte~) main::$1
(byte~) main::$2
(byte~) main::$3
(boolean~) main::$4
(boolean~) main::$2
(label) main::@1
(label) main::@return
(byte) main::i
@ -342,14 +326,12 @@ main::@1: scope:[main] from main main::@1
(byte[]) str#1 ← phi( main/(byte[]) str#2 main::@1/(byte[]) str#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (byte[]) nums#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN#2 + (byte~) main::$0) ← *((byte[]) str#1 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$1) ← *((byte[]) nums#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$4 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -400,14 +382,12 @@ main::@1: scope:[main] from main main::@1
(byte[]) str#1 ← phi( main/(byte[]) str#2 main::@1/(byte[]) str#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (byte[]) nums#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN#2 + (byte~) main::$0) ← *((byte[]) str#1 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$1) ← *((byte[]) nums#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$4 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -451,14 +431,12 @@ main::@1: scope:[main] from main main::@1
(byte[]) str#1 ← phi( main/(byte[]) str#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (byte[]) nums#1 *idx (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN#2 + (byte~) main::$0) ← *((byte[]) str#1 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((byte*) SCREEN#2 + (byte~) main::$1) ← *((byte[]) nums#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$4 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -494,14 +472,12 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#0 *idx (byte) main::i#2
*((byte*) SCREEN#0 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (byte[]) nums#0 *idx (byte) main::i#2
*((byte*) SCREEN#0 + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN#0 + (byte~) main::$0) ← *((byte[]) str#0 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((byte*) SCREEN#0 + (byte~) main::$1) ← *((byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(boolean~) main::$4 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$4) goto main::@1
(boolean~) main::$2 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 4
if((boolean~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
@ -511,7 +487,7 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$4 if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
Simple Condition (boolean~) main::$2 if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -530,11 +506,9 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#0 *idx (byte) main::i#2
*((byte*) SCREEN#0 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (byte[]) nums#0 *idx (byte) main::i#2
*((byte*) SCREEN#0 + (byte~) main::$2) ← (byte~) main::$3
*((byte*) SCREEN#0 + (byte~) main::$0) ← *((byte[]) str#0 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((byte*) SCREEN#0 + (byte~) main::$1) ← *((byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -564,11 +538,9 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (byte[]) str#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte~) main::$2) ← (byte~) main::$3
*((const byte*) SCREEN#0 + (byte~) main::$0) ← *((byte[]) str#0 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((const byte*) SCREEN#0 + (byte~) main::$1) ← *((const byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -592,11 +564,9 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte/signed byte/word/signed word) 4 + (byte) main::i#2
(byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
(byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0 + (byte~) main::$2) ← (byte~) main::$3
*((const byte*) SCREEN#0 + (byte~) main::$0) ← *((const byte[]) str#0 + (byte) main::i#2)
(byte~) main::$1 ← (byte/signed byte/word/signed word) 9 + (byte) main::i#2
*((const byte*) SCREEN#0 + (byte~) main::$1) ← *((const byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -608,14 +578,14 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Consolidated assigned array index constant in assignment *(SCREEN#0+0)
Consolidated assigned array index constant in assignment *(SCREEN#0+2)
Consolidated array index constant in *(SCREEN#0+0)
Consolidated array index constant in *(SCREEN#0+2)
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Consolidated array index constant in assignment *(SCREEN#0+4 + main::$0)
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Consolidated assigned array index constant in assignment *(SCREEN#0+4 + main::$0)
Consolidated array index constant in assignment *(SCREEN#0+9 + main::$1)
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Consolidated assigned array index constant in assignment *(SCREEN#0+9 + main::$2)
Succesful SSA optimization Pass2ConstantAdditionElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -627,11 +597,9 @@ main: scope:[main] from @1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$0 ← (byte) main::i#2
(byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte~) main::$0) ← (byte~) main::$1
(byte~) main::$2 ← (byte) main::i#2
(byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte~) main::$2) ← (byte~) main::$3
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte~) main::$0) ← *((const byte[]) str#0 + (byte) main::i#2)
(byte~) main::$1 ← (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte~) main::$1) ← *((const byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -645,7 +613,7 @@ main::@return: scope:[main] from main::@1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Alias (byte) main::i#2 = (byte~) main::$0 (byte~) main::$2
Alias (byte) main::i#2 = (byte~) main::$0 (byte~) main::$1
Succesful SSA optimization Pass2AliasElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -656,10 +624,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@1/(byte) main::i#1 )
(byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1
(byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2)
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -671,14 +637,6 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::i#0
Constant inlined $0 = (string) "bc"+(string) "d"
@ -693,10 +651,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 )
(byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1
(byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2)
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1
to:main::@return
@ -717,8 +673,6 @@ FINAL SYMBOL TABLE
(byte) char
(const byte) char#0 = (byte) 'a'
(void()) main()
(byte~) main::$1
(byte~) main::$3
(label) main::@1
(label) main::@return
(byte) main::i
@ -747,10 +701,8 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 )
(byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1
(byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2)
*((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@3
to:main::@return
@ -785,22 +737,20 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::i#3 ) [ main::i#2 ]
[7] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ]
[9] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ]
[10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@3 [ main::i#1 ]
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ]
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ]
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[10] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@3 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ]
[11] return [ ]
to:@return
main::@3: scope:[main] from main::@1
[14] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ]
[12] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ]
to:main::@1
Created 1 initial phi equivalence classes
Coalesced [14] main::i#3 ← main::i#1
Coalesced [12] main::i#3 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@3
Block Sequence Planned @begin @1 @end main main::@1 main::@return
@ -825,15 +775,13 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ]
[7] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ]
[9] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ]
[10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ]
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ]
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ]
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[10] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ]
[11] return [ ]
to:@return
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -852,15 +800,13 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[7] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] )
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ] ( main:2 [ main::i#2 main::$3 ] )
[10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[10] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[13] return [ ] ( main:2 [ ] )
[11] return [ ] ( main:2 [ ] )
to:@return
DOMINATORS
@ -887,26 +833,18 @@ VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(byte) char
(void()) main()
(byte~) main::$1 22.0
(byte~) main::$3 22.0
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 13.2
(byte) main::i#2 22.0
(byte) num
(byte[]) nums
(byte[]) str
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Added variable main::$3 to zero page equivalence class [ main::$3 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::$1 ]
[ main::$3 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::$1 ]
Allocated zp ZP_BYTE:4 [ main::$3 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -934,8 +872,6 @@ bend_from_b1:
bend:
//SEG8 main
main: {
.label _1 = 3
.label _3 = 4
.label i = 2
//SEG9 [4] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 0) ← (const byte) char#0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #char
@ -955,47 +891,44 @@ main: {
jmp b1
//SEG15 main::@1
b1:
//SEG16 [7] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
//SEG16 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
lda str,x
sta _1
//SEG17 [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _1
ldx i
sta SCREEN+4,x
//SEG18 [9] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ] ( main:2 [ main::i#2 main::$3 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
//SEG17 [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
lda nums,x
sta _3
//SEG19 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _3
ldx i
sta SCREEN+9,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
ldx i
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG21 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG19 [10] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #4
bne b1_from_b1
jmp breturn
//SEG22 main::@return
//SEG20 main::@return
breturn:
//SEG23 [13] return [ ] ( main:2 [ ] )
//SEG21 [11] return [ ] ( main:2 [ ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 0) ← (const byte) char#0 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [5] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 2) ← (const byte) num#0 [ ] ( main:2 [ ] ) always clobbers reg byte a
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::$1 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::$3 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Statement [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [4] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 0) ← (const byte) char#0 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [5] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 2) ← (const byte) num#0 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 29.7: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:3 [ main::$1 ] 22: zp ZP_BYTE:4 [ main::$3 ]
Uplift Scope [main] 38.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 395 combination reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::$1 ] reg byte a [ main::$3 ]
Uplifting [main] best 395 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 395 combination
ASSEMBLER BEFORE OPTIMIZATION
@ -1042,23 +975,21 @@ main: {
jmp b1
//SEG15 main::@1
b1:
//SEG16 [7] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG16 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda str,x
//SEG17 [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN+4,x
//SEG18 [9] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ] ( main:2 [ main::i#2 main::$3 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG17 [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda nums,x
//SEG19 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN+9,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG21 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG19 [10] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #4
bne b1_from_b1
jmp breturn
//SEG22 main::@return
//SEG20 main::@return
breturn:
//SEG23 [13] return [ ] ( main:2 [ ] )
//SEG21 [11] return [ ] ( main:2 [ ] )
rts
}
@ -1091,13 +1022,11 @@ FINAL SYMBOL TABLE
(byte) char
(const byte) char#0 char = (byte) 'a'
(void()) main()
(byte~) main::$1 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 13.2
(byte) main::i#2 reg byte x 22.0
(byte) num
(const byte) num#0 num = (byte/signed byte/word/signed word) 1
(byte[]) nums
@ -1106,8 +1035,6 @@ FINAL SYMBOL TABLE
(const byte[]) str#0 str = (string) "bc"+(string) "d"+(byte) 'e'
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$1 ]
reg byte a [ main::$3 ]
FINAL CODE
//SEG0 Basic Upstart
@ -1142,21 +1069,19 @@ main: {
//SEG14 [6] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 main::@1
b1:
//SEG16 [7] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ] ( main:2 [ main::i#2 main::$1 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG16 [7] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← *((const byte[]) str#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda str,x
//SEG17 [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN+4,x
//SEG18 [9] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ] ( main:2 [ main::i#2 main::$3 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG17 [8] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← *((const byte[]) nums#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda nums,x
//SEG19 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 9 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta SCREEN+9,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG21 [12] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG19 [10] if((byte) main::i#1!=(byte/signed byte/word/signed word) 4) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #4
bne b1
//SEG22 main::@return
//SEG23 [13] return [ ] ( main:2 [ ] )
//SEG20 main::@return
//SEG21 [11] return [ ] ( main:2 [ ] )
rts
}

View File

@ -6,13 +6,11 @@
(byte) char
(const byte) char#0 char = (byte) 'a'
(void()) main()
(byte~) main::$1 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 13.2
(byte) main::i#2 reg byte x 22.0
(byte) num
(const byte) num#0 num = (byte/signed byte/word/signed word) 1
(byte[]) nums
@ -21,5 +19,3 @@
(const byte[]) str#0 str = (string) "bc"+(string) "d"+(byte) 'e'
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$1 ]
reg byte a [ main::$3 ]

View File

@ -12,14 +12,12 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] (byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] )
[7] if((byte~) main::$0!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[8] return [ ] ( main:2 [ ] )
[7] return [ ] ( main:2 [ ] )
to:@return
main::@2: scope:[main] from main::@1
[9] (byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] )
[10] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1

View File

@ -15,13 +15,11 @@ proc (void()) main()
(byte[]) main::msg ← (string) "message 2 @"
(byte) main::i ← (byte/signed byte/word/signed word) 0
main::@1:
(byte~) main::$0 ← (byte[]) main::msg *idx (byte) main::i
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg + (byte) main::i) != (byte) '@'
if((boolean~) main::$0) goto main::@2
goto main::@3
main::@2:
(byte~) main::$2 ← (byte[]) main::msg *idx (byte) main::i
*((byte*) main::screen + (byte) main::i) ← (byte~) main::$2
*((byte*) main::screen + (byte) main::i) ← *((byte[]) main::msg + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
goto main::@1
main::@3:
@ -32,9 +30,7 @@ endproc // main()
SYMBOLS
(void()) main()
(byte~) main::$0
(boolean~) main::$1
(byte~) main::$2
(boolean~) main::$0
(label) main::@1
(label) main::@2
(label) main::@3
@ -53,13 +49,11 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) main::msg *idx (byte) main::i
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg + (byte) main::i) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@4
main::@2: scope:[main] from main::@1 main::@5
(byte~) main::$2 ← (byte[]) main::msg *idx (byte) main::i
*((byte*) main::screen + (byte) main::i) ← (byte~) main::$2
*((byte*) main::screen + (byte) main::i) ← *((byte[]) main::msg + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
to:main::@1
main::@4: scope:[main] from main::@1
@ -91,13 +85,11 @@ main: scope:[main] from
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) main::msg *idx (byte) main::i
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg + (byte) main::i) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (byte[]) main::msg *idx (byte) main::i
*((byte*) main::screen + (byte) main::i) ← (byte~) main::$2
*((byte*) main::screen + (byte) main::i) ← *((byte[]) main::msg + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
to:main::@1
main::@return: scope:[main] from main::@1
@ -119,13 +111,11 @@ main: scope:[main] from @1
(byte) main::i ← (byte/signed byte/word/signed word) 0
to:main::@1
main::@1: scope:[main] from main main::@2
(byte~) main::$0 ← (byte[]) main::msg *idx (byte) main::i
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg + (byte) main::i) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (byte[]) main::msg *idx (byte) main::i
*((byte*) main::screen + (byte) main::i) ← (byte~) main::$2
*((byte*) main::screen + (byte) main::i) ← *((byte[]) main::msg + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
to:main::@1
main::@return: scope:[main] from main::@1
@ -152,16 +142,14 @@ main::@1: scope:[main] from main main::@2
(byte*) main::screen#2 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte[]) main::msg#1 ← phi( main/(byte[]) main::msg#0 main::@2/(byte[]) main::msg#2 )
(byte~) main::$0 ← (byte[]) main::msg#1 *idx (byte) main::i#2
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg#1 + (byte) main::i#2) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte*) main::screen#1 ← phi( main::@1/(byte*) main::screen#2 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 )
(byte[]) main::msg#2 ← phi( main::@1/(byte[]) main::msg#1 )
(byte~) main::$2 ← (byte[]) main::msg#2 *idx (byte) main::i#3
*((byte*) main::screen#1 + (byte) main::i#3) ← (byte~) main::$2
*((byte*) main::screen#1 + (byte) main::i#3) ← *((byte[]) main::msg#2 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
to:main::@1
main::@return: scope:[main] from main::@1
@ -186,16 +174,14 @@ main::@1: scope:[main] from main main::@2
(byte*) main::screen#2 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte[]) main::msg#1 ← phi( main/(byte[]) main::msg#0 main::@2/(byte[]) main::msg#2 )
(byte~) main::$0 ← (byte[]) main::msg#1 *idx (byte) main::i#2
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg#1 + (byte) main::i#2) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte*) main::screen#1 ← phi( main::@1/(byte*) main::screen#2 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 )
(byte[]) main::msg#2 ← phi( main::@1/(byte[]) main::msg#1 )
(byte~) main::$2 ← (byte[]) main::msg#2 *idx (byte) main::i#3
*((byte*) main::screen#1 + (byte) main::i#3) ← (byte~) main::$2
*((byte*) main::screen#1 + (byte) main::i#3) ← *((byte[]) main::msg#2 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
to:main::@1
main::@return: scope:[main] from main::@1
@ -214,9 +200,7 @@ INITIAL SSA SYMBOL TABLE
(label) @begin
(label) @end
(void()) main()
(byte~) main::$0
(boolean~) main::$1
(byte~) main::$2
(boolean~) main::$0
(label) main::@1
(label) main::@2
(label) main::@return
@ -248,16 +232,14 @@ main::@1: scope:[main] from main main::@2
(byte*) main::screen#2 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte[]) main::msg#1 ← phi( main/(byte[]) main::msg#0 main::@2/(byte[]) main::msg#2 )
(byte~) main::$0 ← (byte[]) main::msg#1 *idx (byte) main::i#2
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg#1 + (byte) main::i#2) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte*) main::screen#1 ← phi( main::@1/(byte*) main::screen#2 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#2 )
(byte[]) main::msg#2 ← phi( main::@1/(byte[]) main::msg#1 )
(byte~) main::$2 ← (byte[]) main::msg#2 *idx (byte) main::i#3
*((byte*) main::screen#1 + (byte) main::i#3) ← (byte~) main::$2
*((byte*) main::screen#1 + (byte) main::i#3) ← *((byte[]) main::msg#2 + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
to:main::@1
main::@return: scope:[main] from main::@1
@ -284,13 +266,11 @@ main::@1: scope:[main] from main main::@2
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 main::@2/(byte*) main::screen#1 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte[]) main::msg#1 ← phi( main/(byte[]) main::msg#0 main::@2/(byte[]) main::msg#1 )
(byte~) main::$0 ← (byte[]) main::msg#1 *idx (byte) main::i#2
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg#1 + (byte) main::i#2) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (byte[]) main::msg#1 *idx (byte) main::i#2
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte~) main::$2
*((byte*) main::screen#1 + (byte) main::i#2) ← *((byte[]) main::msg#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
to:main::@1
main::@return: scope:[main] from main::@1
@ -316,13 +296,11 @@ main::@1: scope:[main] from main main::@2
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte[]) main::msg#1 ← phi( main/(byte[]) main::msg#0 )
(byte~) main::$0 ← (byte[]) main::msg#1 *idx (byte) main::i#2
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg#1 + (byte) main::i#2) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (byte[]) main::msg#1 *idx (byte) main::i#2
*((byte*) main::screen#1 + (byte) main::i#2) ← (byte~) main::$2
*((byte*) main::screen#1 + (byte) main::i#2) ← *((byte[]) main::msg#1 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
to:main::@1
main::@return: scope:[main] from main::@1
@ -346,13 +324,11 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte~) main::$0 ← (byte[]) main::msg#0 *idx (byte) main::i#2
(boolean~) main::$1 ← (byte~) main::$0 != (byte) '@'
if((boolean~) main::$1) goto main::@2
(boolean~) main::$0 ← *((byte[]) main::msg#0 + (byte) main::i#2) != (byte) '@'
if((boolean~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (byte[]) main::msg#0 *idx (byte) main::i#2
*((byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2
*((byte*) main::screen#0 + (byte) main::i#2) ← *((byte[]) main::msg#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
to:main::@1
main::@return: scope:[main] from main::@1
@ -363,7 +339,7 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Simple Condition (boolean~) main::$1 if((byte~) main::$0!=(byte) '@') goto main::@2
Simple Condition (boolean~) main::$0 if(*((byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -375,12 +351,10 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#1 )
(byte~) main::$0 ← (byte[]) main::msg#0 *idx (byte) main::i#2
if((byte~) main::$0!=(byte) '@') goto main::@2
if(*((byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (byte[]) main::msg#0 *idx (byte) main::i#2
*((byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2
*((byte*) main::screen#0 + (byte) main::i#2) ← *((byte[]) main::msg#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
to:main::@1
main::@return: scope:[main] from main::@1
@ -402,12 +376,10 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(const byte) main::i#0 main::@2/(byte) main::i#1 )
(byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2
if((byte~) main::$0!=(byte) '@') goto main::@2
if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2
*((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2
*((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
to:main::@1
main::@return: scope:[main] from main::@1
@ -418,12 +390,6 @@ main::@return: scope:[main] from main::@1
to:@end
@end: scope:[] from @1
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word) 0
@ -435,12 +401,10 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 )
(byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2
if((byte~) main::$0!=(byte) '@') goto main::@2
if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2
*((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2
*((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
to:main::@1
main::@return: scope:[main] from main::@1
@ -456,8 +420,6 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(void()) main()
(byte~) main::$0
(byte~) main::$2
(label) main::@1
(label) main::@2
(label) main::@return
@ -482,15 +444,13 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
(byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte~) main::i#4 )
(byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2
if((byte~) main::$0!=(byte) '@') goto main::@2
if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
main::@2: scope:[main] from main::@1
(byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2
*((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2
*((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2)
(byte) main::i#1 ← ++ (byte) main::i#2
(byte~) main::i#4 ← (byte) main::i#1
to:main::@1
@ -502,7 +462,6 @@ Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - LIVE RANGES FOUND
@ -520,21 +479,19 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte~) main::i#4 ) [ main::i#2 ]
[6] (byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ]
[7] if((byte~) main::$0!=(byte) '@') goto main::@2 [ main::i#2 ]
[6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ]
to:main::@return
main::@return: scope:[main] from main::@1
[8] return [ ]
[7] return [ ]
to:@return
main::@2: scope:[main] from main::@1
[9] (byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$2 ]
[10] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[12] (byte~) main::i#4 ← (byte) main::i#1 [ main::i#4 ]
[8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ]
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[10] (byte~) main::i#4 ← (byte) main::i#1 [ main::i#4 ]
to:main::@1
Created 1 initial phi equivalence classes
Coalesced [12] main::i#4 ← main::i#1
Coalesced [10] main::i#4 ← main::i#1
Coalesced down to 1 phi equivalence classes
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2
Adding NOP phi() at start of @begin
@ -543,7 +500,6 @@ Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
CONTROL FLOW GRAPH - BEFORE EFFECTIVE LIVE RANGES
@begin: scope:[] from
[0] phi() [ ]
@ -559,16 +515,14 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::i#2 ]
[6] (byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ]
[7] if((byte~) main::$0!=(byte) '@') goto main::@2 [ main::i#2 ]
[6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ]
to:main::@return
main::@return: scope:[main] from main::@1
[8] return [ ]
[7] return [ ]
to:@return
main::@2: scope:[main] from main::@1
[9] (byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$2 ]
[10] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ]
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ]
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
to:main::@1
CONTROL FLOW GRAPH - PHI MEM COALESCED
@ -586,16 +540,14 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word) 0 main::@2/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] (byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] )
[7] if((byte~) main::$0!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[8] return [ ] ( main:2 [ ] )
[7] return [ ] ( main:2 [ ] )
to:@return
main::@2: scope:[main] from main::@1
[9] (byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] )
[10] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] )
[11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1
DOMINATORS
@ -621,25 +573,17 @@ Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 depth: 1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte~) main::$0 22.0
(byte~) main::$2 22.0
(byte) main::i
(byte) main::i#1 22.0
(byte) main::i#2 11.0
(byte) main::i#2 18.333333333333332
(byte[]) main::msg
(byte*) main::screen
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Added variable main::$0 to zero page equivalence class [ main::$0 ]
Added variable main::$2 to zero page equivalence class [ main::$2 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::$0 ]
[ main::$2 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::$0 ]
Allocated zp ZP_BYTE:4 [ main::$2 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -665,8 +609,6 @@ bend:
//SEG9 main
main: {
.const screen = $400
.label _0 = 3
.label _2 = 4
.label i = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
@ -676,48 +618,47 @@ main: {
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] (byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
lda msg,x
sta _0
//SEG14 [7] if((byte~) main::$0!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- vbuz1_neq_vbuc1_then_la1
lda _0
//SEG13 [6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1_neq_vbuc2_then_la1
ldy i
lda msg,y
cmp #'@'
bne b2
jmp breturn
//SEG15 main::@return
//SEG14 main::@return
breturn:
//SEG16 [8] return [ ] ( main:2 [ ] )
//SEG15 [7] return [ ] ( main:2 [ ] )
rts
//SEG17 main::@2
//SEG16 main::@2
b2:
//SEG18 [9] (byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
//SEG17 [8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
lda msg,x
sta _2
//SEG19 [10] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuz2
lda _2
ldx i
sta screen,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
ldx i
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG21 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG19 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
//SEG22 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2->main::@1#0] -- register_copy
//SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
msg: .text "message 2 @"
}
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:3 [ main::$0 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::$2 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Potential register analysis [6] if(*(main::msg#0 + main::i#2)!='@') goto main::@2 missing fragment pbuc1_derefidx_vbuaa_neq_vbuc2_then_la1 allocation: reg byte a [ main::i#2 main::i#1 ]
MISSING FRAGMENTS
pbuc1_derefidx_vbuaa_neq_vbuc2_then_la1
Statement [6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 33: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:3 [ main::$0 ] 22: zp ZP_BYTE:4 [ main::$2 ]
Uplift Scope [main] 40.33: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 333 combination reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::$0 ] reg byte a [ main::$2 ]
Uplifting [main] best 333 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 333 combination
ASSEMBLER BEFORE OPTIMIZATION
@ -752,27 +693,25 @@ main: {
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] (byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG13 [6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx_neq_vbuc2_then_la1
lda msg,x
//SEG14 [7] if((byte~) main::$0!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- vbuaa_neq_vbuc1_then_la1
cmp #'@'
bne b2
jmp breturn
//SEG15 main::@return
//SEG14 main::@return
breturn:
//SEG16 [8] return [ ] ( main:2 [ ] )
//SEG15 [7] return [ ] ( main:2 [ ] )
rts
//SEG17 main::@2
//SEG16 main::@2
b2:
//SEG18 [9] (byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG17 [8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda msg,x
//SEG19 [10] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta screen,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG21 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG19 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
//SEG22 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2->main::@1#0] -- register_copy
//SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
msg: .text "message 2 @"
}
@ -800,22 +739,18 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(void()) main()
(byte~) main::$0 reg byte a 22.0
(byte~) main::$2 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 22.0
(byte) main::i#2 reg byte x 11.0
(byte) main::i#2 reg byte x 18.333333333333332
(byte[]) main::msg
(const byte[]) main::msg#0 msg = (string) "message 2 @"
(byte*) main::screen
(const byte*) main::screen#0 screen = ((byte*))(word/signed word) 1024
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$0 ]
reg byte a [ main::$2 ]
FINAL CODE
//SEG0 Basic Upstart
@ -839,24 +774,22 @@ main: {
ldx #0
//SEG12 main::@1
b1:
//SEG13 [6] (byte~) main::$0 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$0 ] ( main:2 [ main::i#2 main::$0 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG13 [6] if(*((const byte[]) main::msg#0 + (byte) main::i#2)!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx_neq_vbuc2_then_la1
lda msg,x
//SEG14 [7] if((byte~) main::$0!=(byte) '@') goto main::@2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- vbuaa_neq_vbuc1_then_la1
cmp #'@'
bne b2
//SEG15 main::@return
//SEG16 [8] return [ ] ( main:2 [ ] )
//SEG14 main::@return
//SEG15 [7] return [ ] ( main:2 [ ] )
rts
//SEG17 main::@2
//SEG16 main::@2
b2:
//SEG18 [9] (byte~) main::$2 ← (const byte[]) main::msg#0 *idx (byte) main::i#2 [ main::i#2 main::$2 ] ( main:2 [ main::i#2 main::$2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG17 [8] *((const byte*) main::screen#0 + (byte) main::i#2) ← *((const byte[]) main::msg#0 + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda msg,x
//SEG19 [10] *((const byte*) main::screen#0 + (byte) main::i#2) ← (byte~) main::$2 [ main::i#2 ] ( main:2 [ main::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuaa
sta screen,x
//SEG20 [11] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [9] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG21 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG22 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2->main::@1#0] -- register_copy
//SEG19 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
msg: .text "message 2 @"
}

View File

@ -2,19 +2,15 @@
(label) @begin
(label) @end
(void()) main()
(byte~) main::$0 reg byte a 22.0
(byte~) main::$2 reg byte a 22.0
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 22.0
(byte) main::i#2 reg byte x 11.0
(byte) main::i#2 reg byte x 18.333333333333332
(byte[]) main::msg
(const byte[]) main::msg#0 msg = (string) "message 2 @"
(byte*) main::screen
(const byte*) main::screen#0 screen = ((byte*))(word/signed word) 1024
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$0 ]
reg byte a [ main::$2 ]

View File

@ -673,8 +673,8 @@ inccnt::@return: scope:[inccnt] from inccnt
to:@end
@end: scope:[] from @3
Consolidated assigned array index constant in assignment *(SCREEN#0+0)
Consolidated assigned array index constant in assignment *(SCREEN#0+1)
Consolidated array index constant in *(SCREEN#0+0)
Consolidated array index constant in *(SCREEN#0+1)
Succesful SSA optimization Pass2ConstantAdditionElimination
CONTROL FLOW GRAPH
@begin: scope:[] from

View File

@ -424,8 +424,8 @@ inccnt::@return: scope:[inccnt] from inccnt
to:@end
@end: scope:[] from @3
Consolidated assigned array index constant in assignment *(SCREEN#0+0)
Consolidated assigned array index constant in assignment *(SCREEN#0+1)
Consolidated array index constant in *(SCREEN#0+0)
Consolidated array index constant in *(SCREEN#0+1)
Succesful SSA optimization Pass2ConstantAdditionElimination
CONTROL FLOW GRAPH
@begin: scope:[] from

View File

@ -94,11 +94,9 @@ endproc // print_word()
proc (void()) print_byte((byte) print_byte::b)
(byte[]) print_byte::hextab ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$0
(void~) print_byte::$2 ← call print_char (byte~) print_byte::$1
(byte~) print_byte::$3 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$3
(void~) print_byte::$5 ← call print_char (byte~) print_byte::$4
(void~) print_byte::$1 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$0)
(byte~) print_byte::$2 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(void~) print_byte::$3 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$2)
print_byte::@return:
return
endproc // print_byte()
@ -139,11 +137,9 @@ SYMBOLS
(byte[]) msg3
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0
(byte~) print_byte::$1
(void~) print_byte::$2
(byte~) print_byte::$3
(byte~) print_byte::$4
(void~) print_byte::$5
(void~) print_byte::$1
(byte~) print_byte::$2
(void~) print_byte::$3
(label) print_byte::@return
(byte) print_byte::b
(byte[]) print_byte::hextab
@ -230,11 +226,9 @@ print_word::@return: scope:[print_word] from print_word
print_byte: scope:[print_byte] from
(byte[]) print_byte::hextab ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$0
(void~) print_byte::$2 ← call print_char (byte~) print_byte::$1
(byte~) print_byte::$3 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$3
(void~) print_byte::$5 ← call print_char (byte~) print_byte::$4
(void~) print_byte::$1 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$0)
(byte~) print_byte::$2 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(void~) print_byte::$3 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$2)
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte
return

View File

@ -59,7 +59,7 @@ rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1
[26] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0) [ ] ( main:2::rvalue:7 [ ] )
[27] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1 [ ] ( main:2::rvalue:7 [ ] )
[27] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1) [ ] ( main:2::rvalue:7 [ ] )
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[28] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
@ -69,7 +69,7 @@ rvalue::@return: scope:[rvalue] from rvalue::@1
[30] return [ ] ( main:2::rvalue:7 [ ] )
to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1
[31] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[31] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[32] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
to:rvalue::@1
lvalue: scope:[lvalue] from main

View File

@ -107,16 +107,14 @@ endproc // lvalue()
proc (void()) rvalue()
(byte[1024]) rvalue::SCREEN ← (word/signed word) 1024
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN)
(byte~) rvalue::$0 ← (byte[1024]) rvalue::SCREEN *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b ← (byte~) rvalue::$0
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i ← (byte/signed byte/word/signed word) 2
rvalue::@1:
(boolean~) rvalue::$1 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
goto rvalue::@3
rvalue::@2:
(byte~) rvalue::$2 ← (byte[1024]) rvalue::SCREEN *idx (byte) rvalue::i
(byte) rvalue::b ← (byte~) rvalue::$2
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte) rvalue::i)
(byte) rvalue::i ← ++ (byte) rvalue::i
goto rvalue::@1
rvalue::@3:
@ -183,9 +181,7 @@ SYMBOLS
(void~) main::$3
(label) main::@return
(void()) rvalue()
(byte~) rvalue::$0
(boolean~) rvalue::$1
(byte~) rvalue::$2
(boolean~) rvalue::$0
(label) rvalue::@1
(label) rvalue::@2
(label) rvalue::@3
@ -251,17 +247,15 @@ lvalue::@return: scope:[lvalue] from lvalue::@3
rvalue: scope:[rvalue] from
(byte[1024]) rvalue::SCREEN ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN)
(byte~) rvalue::$0 ← (byte[1024]) rvalue::SCREEN *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b ← (byte~) rvalue::$0
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(boolean~) rvalue::$1 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@4
rvalue::@2: scope:[rvalue] from rvalue::@1 rvalue::@5
(byte~) rvalue::$2 ← (byte[1024]) rvalue::SCREEN *idx (byte) rvalue::i
(byte) rvalue::b ← (byte~) rvalue::$2
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte) rvalue::i)
(byte) rvalue::i ← ++ (byte) rvalue::i
to:rvalue::@1
rvalue::@4: scope:[rvalue] from rvalue::@1
@ -337,7 +331,7 @@ 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::$2
Eliminating unused variable - keeping the call (void~) main::$3
Eliminating unused variable (byte) rvaluevar::b and assignment [38] (byte) rvaluevar::b ← *((byte*) rvaluevar::screen)
Eliminating unused variable (byte) rvaluevar::b and assignment [36] (byte) rvaluevar::b ← *((byte*) rvaluevar::screen)
Removing empty block @1
Removing empty block lvalue::@4
Removing empty block lvalue::@3
@ -390,17 +384,15 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from
(byte[1024]) rvalue::SCREEN ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN)
(byte~) rvalue::$0 ← (byte[1024]) rvalue::SCREEN *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b ← (byte~) rvalue::$0
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(boolean~) rvalue::$1 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte~) rvalue::$2 ← (byte[1024]) rvalue::SCREEN *idx (byte) rvalue::i
(byte) rvalue::b ← (byte~) rvalue::$2
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte) rvalue::i)
(byte) rvalue::i ← ++ (byte) rvalue::i
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -485,17 +477,15 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN)
(byte~) rvalue::$0 ← (byte[1024]) rvalue::SCREEN *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b ← (byte~) rvalue::$0
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(boolean~) rvalue::$1 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte~) rvalue::$2 ← (byte[1024]) rvalue::SCREEN *idx (byte) rvalue::i
(byte) rvalue::b ← (byte~) rvalue::$2
(byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN + (byte) rvalue::i)
(byte) rvalue::i ← ++ (byte) rvalue::i
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -586,21 +576,19 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte~) rvalue::$0 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← (byte~) rvalue::$0
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte[1024]) rvalue::SCREEN#2 ← phi( rvalue/(byte[1024]) rvalue::SCREEN#0 rvalue::@2/(byte[1024]) rvalue::SCREEN#1 )
(byte) rvalue::i#2 ← phi( rvalue/(byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
(boolean~) rvalue::$1 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::i#3 ← phi( rvalue::@1/(byte) rvalue::i#2 )
(byte[1024]) rvalue::SCREEN#1 ← phi( rvalue::@1/(byte[1024]) rvalue::SCREEN#2 )
(byte~) rvalue::$2 ← (byte[1024]) rvalue::SCREEN#1 *idx (byte) rvalue::i#3
(byte) rvalue::b#2 ← (byte~) rvalue::$2
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#1 + (byte) rvalue::i#3)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#3
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -699,21 +687,19 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte~) rvalue::$0 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← (byte~) rvalue::$0
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte[1024]) rvalue::SCREEN#2 ← phi( rvalue/(byte[1024]) rvalue::SCREEN#0 rvalue::@2/(byte[1024]) rvalue::SCREEN#1 )
(byte) rvalue::i#2 ← phi( rvalue/(byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
(boolean~) rvalue::$1 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::i#3 ← phi( rvalue::@1/(byte) rvalue::i#2 )
(byte[1024]) rvalue::SCREEN#1 ← phi( rvalue::@1/(byte[1024]) rvalue::SCREEN#2 )
(byte~) rvalue::$2 ← (byte[1024]) rvalue::SCREEN#1 *idx (byte) rvalue::i#3
(byte) rvalue::b#2 ← (byte~) rvalue::$2
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#1 + (byte) rvalue::i#3)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#3
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -813,9 +799,7 @@ INITIAL SSA SYMBOL TABLE
(label) main::@4
(label) main::@return
(void()) rvalue()
(byte~) rvalue::$0
(boolean~) rvalue::$1
(byte~) rvalue::$2
(boolean~) rvalue::$0
(label) rvalue::@1
(label) rvalue::@2
(label) rvalue::@return
@ -893,21 +877,19 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte~) rvalue::$0 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← (byte~) rvalue::$0
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte[1024]) rvalue::SCREEN#2 ← phi( rvalue/(byte[1024]) rvalue::SCREEN#0 rvalue::@2/(byte[1024]) rvalue::SCREEN#1 )
(byte) rvalue::i#2 ← phi( rvalue/(byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
(boolean~) rvalue::$1 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::i#3 ← phi( rvalue::@1/(byte) rvalue::i#2 )
(byte[1024]) rvalue::SCREEN#1 ← phi( rvalue::@1/(byte[1024]) rvalue::SCREEN#2 )
(byte~) rvalue::$2 ← (byte[1024]) rvalue::SCREEN#1 *idx (byte) rvalue::i#3
(byte) rvalue::b#2 ← (byte~) rvalue::$2
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#1 + (byte) rvalue::i#3)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#3
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -962,10 +944,8 @@ rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
Alias (byte[1024]) lvalue::SCREEN#1 = (byte[1024]) lvalue::SCREEN#2
Alias (byte) lvalue::i#2 = (byte) lvalue::i#3
Alias (byte) rvalue::b#1 = (byte~) rvalue::$0
Alias (byte[1024]) rvalue::SCREEN#1 = (byte[1024]) rvalue::SCREEN#2
Alias (byte) rvalue::i#2 = (byte) rvalue::i#3
Alias (byte) rvalue::b#2 = (byte~) rvalue::$2
Alias (byte) lvaluevar::b#1 = (byte) lvaluevar::b#2
Alias (byte*) lvaluevar::screen#2 = (byte*) lvaluevar::screen#3
Alias (byte) lvaluevar::i#2 = (byte) lvaluevar::i#3
@ -1012,17 +992,17 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte[1024]) rvalue::SCREEN#1 ← phi( rvalue/(byte[1024]) rvalue::SCREEN#0 rvalue::@2/(byte[1024]) rvalue::SCREEN#1 )
(byte) rvalue::i#2 ← phi( rvalue/(byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
(boolean~) rvalue::$1 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (byte[1024]) rvalue::SCREEN#1 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#1 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -1114,17 +1094,17 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte[1024]) rvalue::SCREEN#1 ← phi( rvalue/(byte[1024]) rvalue::SCREEN#0 )
(byte) rvalue::i#2 ← phi( rvalue/(byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
(boolean~) rvalue::$1 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (byte[1024]) rvalue::SCREEN#1 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#1 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -1215,16 +1195,16 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte) rvalue::i#2 ← phi( rvalue/(byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
(boolean~) rvalue::$1 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$1) goto rvalue::@2
(boolean~) rvalue::$0 ← (byte) rvalue::i#2 < (byte/signed byte/word/signed word) 10
if((boolean~) rvalue::$0) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -1272,7 +1252,7 @@ rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
@end: scope:[] from @5
Simple Condition (boolean~) lvalue::$0 if((byte) lvalue::i#2<(byte/signed byte/word/signed word) 10) goto lvalue::@2
Simple Condition (boolean~) rvalue::$1 if((byte) rvalue::i#2<(byte/signed byte/word/signed word) 10) goto rvalue::@2
Simple Condition (boolean~) rvalue::$0 if((byte) rvalue::i#2<(byte/signed byte/word/signed word) 10) goto rvalue::@2
Simple Condition (boolean~) lvaluevar::$0 if((byte) lvaluevar::i#2<(byte/signed byte/word/signed word) 10) goto lvaluevar::@2
Simple Condition (boolean~) rvaluevar::$0 if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word) 10) goto rvaluevar::@2
Succesful SSA optimization Pass2ConditionalJumpSimplification
@ -1314,7 +1294,7 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
@ -1322,7 +1302,7 @@ rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
if((byte) rvalue::i#2<(byte/signed byte/word/signed word) 10) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -1412,14 +1392,14 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
to:@return
rvalue: scope:[rvalue] from main::@1
(byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word) 1)
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte) rvalue::i#2 ← phi( rvalue/(const byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
if((byte) rvalue::i#2<(byte/signed byte/word/signed word) 10) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -1459,9 +1439,8 @@ rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
to:@end
@end: scope:[] from @5
Consolidated assigned array index constant in assignment *(lvalue::SCREEN#0+1)
Consolidated referenced array index constant in assignment rvalue::b#1
Multiple usages for variable. Not optimizing sub-constant (byte) rvalue::i#2
Consolidated array index constant in *(lvalue::SCREEN#0+1)
Consolidated array index constant in *(rvalue::SCREEN#0+1)
Succesful SSA optimization Pass2ConstantAdditionElimination
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -1498,14 +1477,14 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
to:@return
rvalue: scope:[rvalue] from main::@1
(byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1)
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte) rvalue::i#2 ← phi( rvalue/(const byte) rvalue::i#0 rvalue::@2/(byte) rvalue::i#1 )
if((byte) rvalue::i#2<(byte/signed byte/word/signed word) 10) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -1545,8 +1524,6 @@ rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
to:@end
@end: scope:[] from @5
Multiple usages for variable. Not optimizing sub-constant (byte) rvalue::i#2
Multiple usages for variable. Not optimizing sub-constant (byte) rvalue::i#2
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) rvalue::i#0
@ -1601,14 +1578,14 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
to:@return
rvalue: scope:[rvalue] from main::@1
(byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1)
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word) 2 rvalue::@2/(byte) rvalue::i#1 )
if((byte) rvalue::i#2<(byte/signed byte/word/signed word) 10) goto rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -1761,7 +1738,7 @@ rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1
(byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1
(byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1)
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
(byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word) 2 rvalue::@2/(byte~) rvalue::i#4 )
@ -1771,7 +1748,7 @@ rvalue::@return: scope:[rvalue] from rvalue::@1
return
to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2
(byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#2
(byte~) rvalue::i#4 ← (byte) rvalue::i#1
to:rvalue::@1
@ -1875,7 +1852,7 @@ rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1
[30] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0) [ ]
[31] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1 [ ]
[31] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1) [ ]
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[32] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word) 2 rvalue::@2/(byte~) rvalue::i#4 ) [ rvalue::i#2 ]
@ -1885,7 +1862,7 @@ rvalue::@return: scope:[rvalue] from rvalue::@1
[34] return [ ]
to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1
[35] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ]
[35] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2) [ rvalue::i#2 ]
[36] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ]
[37] (byte~) rvalue::i#4 ← (byte) rvalue::i#1 [ rvalue::i#4 ]
to:rvalue::@1
@ -1990,7 +1967,7 @@ rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1
[26] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0) [ ]
[27] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1 [ ]
[27] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1) [ ]
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[28] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ]
@ -2000,7 +1977,7 @@ rvalue::@return: scope:[rvalue] from rvalue::@1
[30] return [ ]
to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1
[31] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ]
[31] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2) [ rvalue::i#2 ]
[32] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ]
to:rvalue::@1
lvalue: scope:[lvalue] from main
@ -2081,7 +2058,7 @@ rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1
[26] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0) [ ] ( main:2::rvalue:7 [ ] )
[27] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1 [ ] ( main:2::rvalue:7 [ ] )
[27] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1) [ ] ( main:2::rvalue:7 [ ] )
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[28] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
@ -2091,7 +2068,7 @@ rvalue::@return: scope:[rvalue] from rvalue::@1
[30] return [ ] ( main:2::rvalue:7 [ ] )
to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1
[31] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[31] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[32] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
to:rvalue::@1
lvalue: scope:[lvalue] from main
@ -2382,7 +2359,7 @@ rvalue: {
//SEG54 [26] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0) [ ] ( main:2::rvalue:7 [ ] ) -- vbuz1=_deref_pbuc1
lda SCREEN
sta b
//SEG55 [27] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1 [ ] ( main:2::rvalue:7 [ ] ) -- vbuz1=_deref_pbuc1
//SEG55 [27] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1) [ ] ( main:2::rvalue:7 [ ] ) -- vbuz1=_deref_pbuc1
lda SCREEN+1
sta b_1
//SEG56 [28] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
@ -2404,7 +2381,7 @@ rvalue: {
rts
//SEG62 rvalue::@2
b2:
//SEG63 [31] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG63 [31] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx i
lda SCREEN,x
sta b_2
@ -2638,7 +2615,7 @@ rvalue: {
.const SCREEN = $400
//SEG54 [26] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0) [ ] ( main:2::rvalue:7 [ ] ) -- vbuaa=_deref_pbuc1
lda SCREEN
//SEG55 [27] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1 [ ] ( main:2::rvalue:7 [ ] ) -- vbuaa=_deref_pbuc1
//SEG55 [27] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1) [ ] ( main:2::rvalue:7 [ ] ) -- vbuaa=_deref_pbuc1
lda SCREEN+1
//SEG56 [28] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
b1_from_rvalue:
@ -2657,7 +2634,7 @@ rvalue: {
rts
//SEG62 rvalue::@2
b2:
//SEG63 [31] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG63 [31] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
lda SCREEN,x
//SEG64 [32] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
@ -2925,7 +2902,7 @@ rvalue: {
.const SCREEN = $400
//SEG54 [26] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0) [ ] ( main:2::rvalue:7 [ ] ) -- vbuaa=_deref_pbuc1
lda SCREEN
//SEG55 [27] (byte) rvalue::b#1 ← * (const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1 [ ] ( main:2::rvalue:7 [ ] ) -- vbuaa=_deref_pbuc1
//SEG55 [27] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word) 1) [ ] ( main:2::rvalue:7 [ ] ) -- vbuaa=_deref_pbuc1
lda SCREEN+1
//SEG56 [28] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
//SEG57 [28] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1
@ -2940,7 +2917,7 @@ rvalue: {
rts
//SEG62 rvalue::@2
b2:
//SEG63 [31] (byte) rvalue::b#2 ← (const byte[1024]) rvalue::SCREEN#0 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
//SEG63 [31] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuaa=pbuc1_derefidx_vbuxx
lda SCREEN,x
//SEG64 [32] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx

View File

@ -25,8 +25,7 @@ main::@1:
if((boolean~) main::$0) goto main::@2
goto main::@3
main::@2:
(byte~) main::$1 ← (byte[1024]) main::SCREEN *idx (byte) main::i
(byte) main::b ← (byte~) main::$1
(byte) main::b ← *((byte[1024]) main::SCREEN + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
goto main::@1
main::@3:
@ -38,7 +37,6 @@ endproc // main()
SYMBOLS
(void()) main()
(boolean~) main::$0
(byte~) main::$1
(label) main::@1
(label) main::@2
(label) main::@3
@ -60,8 +58,7 @@ main::@1: scope:[main] from main main::@2
if((boolean~) main::$0) goto main::@2
to:main::@4
main::@2: scope:[main] from main::@1 main::@5
(byte~) main::$1 ← (byte[1024]) main::SCREEN *idx (byte) main::i
(byte) main::b ← (byte~) main::$1
(byte) main::b ← *((byte[1024]) main::SCREEN + (byte) main::i)
(byte) main::i ← ++ (byte) main::i
to:main::@1
main::@4: scope:[main] from main::@1
@ -80,8 +77,7 @@ main::@return: scope:[main] from main::@3
to:@end
@end: scope:[] from @1
Eliminating unused variable (byte) main::b and assignment [5] (byte) main::b ← (byte~) main::$1
Eliminating unused variable (byte~) main::$1 and assignment [4] (byte~) main::$1 ← (byte[1024]) main::SCREEN *idx (byte) main::i
Eliminating unused variable (byte) main::b and assignment [4] (byte) main::b ← *((byte[1024]) main::SCREEN + (byte) main::i)
Eliminating unused variable (byte[1024]) main::SCREEN and assignment [0] (byte[1024]) main::SCREEN ← ((byte*)) (word/signed word) 1024
Removing empty block main::@4
Removing empty block main::@3

View File

@ -26,43 +26,42 @@ main::@8: scope:[main] from main::@3
to:main::@5
main::@5: scope:[main] from main::@5 main::@8
[12] (byte) main::i#2 ← phi( main::@5/(byte) main::i#1 main::@8/(byte/signed byte/word/signed word) 0 ) [ main::nxt#9 main::i#2 ] ( main:2 [ main::nxt#9 main::i#2 ] )
[13] (byte~) main::$7 ← (const byte[]) main::line#0+(byte/signed byte/word/signed word) 1 *idx (byte) main::i#2 [ main::nxt#9 main::i#2 main::$7 ] ( main:2 [ main::nxt#9 main::i#2 main::$7 ] )
[14] *((const byte[]) main::line#0 + (byte) main::i#2) ← (byte~) main::$7 [ main::nxt#9 main::i#2 ] ( main:2 [ main::nxt#9 main::i#2 ] )
[15] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::nxt#9 main::i#1 ] ( main:2 [ main::nxt#9 main::i#1 ] )
[16] if((byte) main::i#1!=(byte/signed byte/word/signed word) 39) goto main::@5 [ main::nxt#9 main::i#1 ] ( main:2 [ main::nxt#9 main::i#1 ] )
[13] *((const byte[]) main::line#0 + (byte) main::i#2) ← *((const byte[]) main::line#0+(byte/signed byte/word/signed word) 1 + (byte) main::i#2) [ main::nxt#9 main::i#2 ] ( main:2 [ main::nxt#9 main::i#2 ] )
[14] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::nxt#9 main::i#1 ] ( main:2 [ main::nxt#9 main::i#1 ] )
[15] if((byte) main::i#1!=(byte/signed byte/word/signed word) 39) goto main::@5 [ main::nxt#9 main::i#1 ] ( main:2 [ main::nxt#9 main::i#1 ] )
to:main::@10
main::@10: scope:[main] from main::@5
[17] (byte) main::c#0 ← *((byte*) main::nxt#9) [ main::nxt#9 main::c#0 ] ( main:2 [ main::nxt#9 main::c#0 ] )
[18] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#9 main::c#0 ] ( main:2 [ main::nxt#9 main::c#0 ] )
[16] (byte) main::c#0 ← *((byte*) main::nxt#9) [ main::nxt#9 main::c#0 ] ( main:2 [ main::nxt#9 main::c#0 ] )
[17] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#9 main::c#0 ] ( main:2 [ main::nxt#9 main::c#0 ] )
to:main::@11
main::@11: scope:[main] from main::@10
[19] (byte) main::c#1 ← *((const byte*) TEXT#0) [ main::c#1 ] ( main:2 [ main::c#1 ] )
[18] (byte) main::c#1 ← *((const byte*) TEXT#0) [ main::c#1 ] ( main:2 [ main::c#1 ] )
to:main::@6
main::@6: scope:[main] from main::@10 main::@11
[20] (byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#9 main::@11/(const byte*) TEXT#0 ) [ main::c#2 main::nxt#4 ] ( main:2 [ main::c#2 main::nxt#4 ] )
[20] (byte) main::c#2 ← phi( main::@10/(byte) main::c#0 main::@11/(byte) main::c#1 ) [ main::c#2 main::nxt#4 ] ( main:2 [ main::c#2 main::nxt#4 ] )
[21] *((const byte[]) main::line#0+(byte/signed byte/word/signed word) 39) ← (byte) main::c#2 [ main::nxt#4 ] ( main:2 [ main::nxt#4 ] )
[22] (byte*) main::nxt#1 ← ++ (byte*) main::nxt#4 [ main::nxt#1 ] ( main:2 [ main::nxt#1 ] )
[19] (byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#9 main::@11/(const byte*) TEXT#0 ) [ main::c#2 main::nxt#4 ] ( main:2 [ main::c#2 main::nxt#4 ] )
[19] (byte) main::c#2 ← phi( main::@10/(byte) main::c#0 main::@11/(byte) main::c#1 ) [ main::c#2 main::nxt#4 ] ( main:2 [ main::c#2 main::nxt#4 ] )
[20] *((const byte[]) main::line#0+(byte/signed byte/word/signed word) 39) ← (byte) main::c#2 [ main::nxt#4 ] ( main:2 [ main::nxt#4 ] )
[21] (byte*) main::nxt#1 ← ++ (byte*) main::nxt#4 [ main::nxt#1 ] ( main:2 [ main::nxt#1 ] )
to:main::@4
main::@4: scope:[main] from main::@6 main::@8
[23] (byte*) main::nxt#10 ← phi( main::@6/(byte*) main::nxt#1 main::@8/(byte*) main::nxt#9 ) [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[23] (byte) main::scroll#10 ← phi( main::@6/(byte/signed byte/word/signed word) 7 main::@8/(byte) main::scroll#1 ) [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[24] *((const byte*) SCROLL#0) ← (byte) main::scroll#10 [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[25] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[26] if(true) goto main::@2 [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[22] (byte*) main::nxt#10 ← phi( main::@6/(byte*) main::nxt#1 main::@8/(byte*) main::nxt#9 ) [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[22] (byte) main::scroll#10 ← phi( main::@6/(byte/signed byte/word/signed word) 7 main::@8/(byte) main::scroll#1 ) [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[23] *((const byte*) SCROLL#0) ← (byte) main::scroll#10 [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[24] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
[25] if(true) goto main::@2 [ main::scroll#10 main::nxt#10 ] ( main:2 [ main::scroll#10 main::nxt#10 ] )
to:main::@return
main::@return: scope:[main] from main::@4
[27] return [ ] ( main:2 [ ] )
[26] return [ ] ( main:2 [ ] )
to:@return
fillscreen: scope:[fillscreen] from main
[28] phi() [ ] ( main:2::fillscreen:5 [ ] )
[27] phi() [ ] ( main:2::fillscreen:5 [ ] )
to:fillscreen::@1
fillscreen::@1: scope:[fillscreen] from fillscreen fillscreen::@1
[29] (byte*) fillscreen::cursor#2 ← phi( fillscreen/(const byte*) SCREEN#0 fillscreen::@1/(byte*) fillscreen::cursor#1 ) [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[30] *((byte*) fillscreen::cursor#2) ← (const byte) fillscreen::fill#0 [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[31] (byte*) fillscreen::cursor#1 ← ++ (byte*) fillscreen::cursor#2 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
[32] if((byte*) fillscreen::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto fillscreen::@1 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
[28] (byte*) fillscreen::cursor#2 ← phi( fillscreen/(const byte*) SCREEN#0 fillscreen::@1/(byte*) fillscreen::cursor#1 ) [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[29] *((byte*) fillscreen::cursor#2) ← (const byte) fillscreen::fill#0 [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[30] (byte*) fillscreen::cursor#1 ← ++ (byte*) fillscreen::cursor#2 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
[31] if((byte*) fillscreen::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto fillscreen::@1 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
to:fillscreen::@return
fillscreen::@return: scope:[fillscreen] from fillscreen::@1
[33] return [ ] ( main:2::fillscreen:5 [ ] )
[32] return [ ] ( main:2::fillscreen:5 [ ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,6 @@
(const byte) fillscreen::fill#0 fill = (byte/signed byte/word/signed word) 32
(byte*) fillscreen::screen
(void()) main()
(byte~) main::$7 reg byte a 202.0
(label) main::@10
(label) main::@11
(label) main::@2
@ -37,14 +36,14 @@
(byte) main::c#2 reg byte x 33.0
(byte) main::i
(byte) main::i#1 reg byte x 151.5
(byte) main::i#2 reg byte x 134.66666666666666
(byte) main::i#2 reg byte x 202.0
(byte[]) main::line
(const byte[]) main::line#0 line = (const byte*) SCREEN#0+(byte/signed byte/word/signed word) 40
(byte*) main::nxt
(byte*) main::nxt#1 nxt zp ZP_WORD:2 22.0
(byte*) main::nxt#10 nxt zp ZP_WORD:2 8.25
(byte*) main::nxt#4 nxt zp ZP_WORD:2 11.0
(byte*) main::nxt#9 nxt zp ZP_WORD:2 3.3846153846153846
(byte*) main::nxt#9 nxt zp ZP_WORD:2 3.6666666666666665
(byte) main::scroll
(byte) main::scroll#1 reg byte x 16.5
(byte) main::scroll#10 reg byte x 8.25
@ -54,4 +53,3 @@ reg byte x [ main::scroll#7 main::scroll#10 main::scroll#1 ]
reg byte x [ main::i#2 main::i#1 ]
reg byte x [ main::c#2 main::c#0 main::c#1 ]
zp ZP_WORD:2 [ main::nxt#4 main::nxt#9 main::nxt#10 main::nxt#1 fillscreen::cursor#2 fillscreen::cursor#1 ]
reg byte a [ main::$7 ]

View File

@ -78,9 +78,9 @@ scroll_bit::@7: scope:[scroll_bit] from scroll_bit::@1
scroll_bit::@2: scope:[scroll_bit] from scroll_bit::@3 scroll_bit::@7
[34] (byte*) scroll_bit::sc#2 ← phi( scroll_bit::@3/(byte*) scroll_bit::sc#1 scroll_bit::@7/(const byte*) SCREEN#0+(byte/signed byte/word/signed word) 40+(byte/signed byte/word/signed word) 39 ) [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] )
[34] (byte) scroll_bit::r#2 ← phi( scroll_bit::@3/(byte) scroll_bit::r#1 scroll_bit::@7/(byte/signed byte/word/signed word) 0 ) [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] )
[35] (byte) scroll_bit::bits#0 ← (byte*) current_chargen#19 *idx (byte) scroll_bit::r#2 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::bits#0 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::bits#0 ] )
[36] (byte~) scroll_bit::$10 ← (byte) scroll_bit::bits#0 & (byte) current_bit#21 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::$10 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::$10 ] )
[37] if((byte~) scroll_bit::$10==(byte/signed byte/word/signed word) 0) goto scroll_bit::@3 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] )
[35] (byte) scroll_bit::bits#0 ← *((byte*) current_chargen#19 + (byte) scroll_bit::r#2) [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::bits#0 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::bits#0 ] )
[36] (byte~) scroll_bit::$9 ← (byte) scroll_bit::bits#0 & (byte) current_bit#21 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::$9 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 scroll_bit::$9 ] )
[37] if((byte~) scroll_bit::$9==(byte/signed byte/word/signed word) 0) goto scroll_bit::@3 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] )
to:scroll_bit::@5
scroll_bit::@5: scope:[scroll_bit] from scroll_bit::@2
[38] phi() [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] ( main:2::scroll_soft:10::scroll_bit:17 [ current_bit#21 nxt#36 current_chargen#19 scroll_bit::r#2 scroll_bit::sc#2 ] )
@ -104,52 +104,44 @@ scroll_hard: scope:[scroll_hard] from scroll_bit::@1
to:scroll_hard::@1
scroll_hard::@1: scope:[scroll_hard] from scroll_hard scroll_hard::@1
[48] (byte) scroll_hard::i#2 ← phi( scroll_hard/(byte/signed byte/word/signed word) 0 scroll_hard::@1/(byte) scroll_hard::i#1 ) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[49] (byte~) scroll_hard::$17 ← (const byte[]) scroll_hard::line0#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$17 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$17 ] )
[50] *((const byte[]) scroll_hard::line0#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$17 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[51] (byte~) scroll_hard::$19 ← (const byte[]) scroll_hard::line1#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$19 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$19 ] )
[52] *((const byte[]) scroll_hard::line1#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$19 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[53] (byte~) scroll_hard::$21 ← (const byte[]) scroll_hard::line2#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$21 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$21 ] )
[54] *((const byte[]) scroll_hard::line2#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$21 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[55] (byte~) scroll_hard::$23 ← (const byte[]) scroll_hard::line3#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$23 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$23 ] )
[56] *((const byte[]) scroll_hard::line3#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$23 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[57] (byte~) scroll_hard::$25 ← (const byte[]) scroll_hard::line4#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$25 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$25 ] )
[58] *((const byte[]) scroll_hard::line4#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$25 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[59] (byte~) scroll_hard::$27 ← (const byte[]) scroll_hard::line5#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$27 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$27 ] )
[60] *((const byte[]) scroll_hard::line5#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$27 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[61] (byte~) scroll_hard::$29 ← (const byte[]) scroll_hard::line6#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$29 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$29 ] )
[62] *((const byte[]) scroll_hard::line6#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$29 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[63] (byte~) scroll_hard::$31 ← (const byte[]) scroll_hard::line7#0+(byte/signed byte/word/signed word) 1 *idx (byte) scroll_hard::i#2 [ scroll_hard::i#2 scroll_hard::$31 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 scroll_hard::$31 ] )
[64] *((const byte[]) scroll_hard::line7#0 + (byte) scroll_hard::i#2) ← (byte~) scroll_hard::$31 [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[65] (byte) scroll_hard::i#1 ← ++ (byte) scroll_hard::i#2 [ scroll_hard::i#1 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#1 ] )
[66] if((byte) scroll_hard::i#1!=(byte/signed byte/word/signed word) 39) goto scroll_hard::@1 [ scroll_hard::i#1 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#1 ] )
[49] *((const byte[]) scroll_hard::line0#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line0#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[50] *((const byte[]) scroll_hard::line1#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line1#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[51] *((const byte[]) scroll_hard::line2#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line2#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[52] *((const byte[]) scroll_hard::line3#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line3#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[53] *((const byte[]) scroll_hard::line4#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line4#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[54] *((const byte[]) scroll_hard::line5#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line5#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[55] *((const byte[]) scroll_hard::line6#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line6#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[56] *((const byte[]) scroll_hard::line7#0 + (byte) scroll_hard::i#2) ← *((const byte[]) scroll_hard::line7#0+(byte/signed byte/word/signed word) 1 + (byte) scroll_hard::i#2) [ scroll_hard::i#2 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#2 ] )
[57] (byte) scroll_hard::i#1 ← ++ (byte) scroll_hard::i#2 [ scroll_hard::i#1 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#1 ] )
[58] if((byte) scroll_hard::i#1!=(byte/signed byte/word/signed word) 39) goto scroll_hard::@1 [ scroll_hard::i#1 ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 scroll_hard::i#1 ] )
to:scroll_hard::@return
scroll_hard::@return: scope:[scroll_hard] from scroll_hard::@1
[67] return [ ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 ] )
[59] return [ ] ( main:2::scroll_soft:10::scroll_bit:17::scroll_hard:31 [ current_bit#21 nxt#36 current_chargen#19 ] )
to:@return
next_char: scope:[next_char] from scroll_bit::@4
[68] (byte) next_char::c#0 ← *((byte*) nxt#31) [ nxt#31 next_char::c#0 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ nxt#31 next_char::c#0 ] )
[69] if((byte) next_char::c#0!=(byte) '@') goto next_char::@1 [ nxt#31 next_char::c#0 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ nxt#31 next_char::c#0 ] )
[60] (byte) next_char::c#0 ← *((byte*) nxt#31) [ nxt#31 next_char::c#0 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ nxt#31 next_char::c#0 ] )
[61] if((byte) next_char::c#0!=(byte) '@') goto next_char::@1 [ nxt#31 next_char::c#0 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ nxt#31 next_char::c#0 ] )
to:next_char::@2
next_char::@2: scope:[next_char] from next_char
[70] (byte) next_char::c#1 ← *((const byte*) TEXT#0) [ next_char::c#1 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::c#1 ] )
[62] (byte) next_char::c#1 ← *((const byte*) TEXT#0) [ next_char::c#1 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::c#1 ] )
to:next_char::@1
next_char::@1: scope:[next_char] from next_char next_char::@2
[71] (byte) next_char::return#1 ← phi( next_char/(byte) next_char::c#0 next_char::@2/(byte) next_char::c#1 ) [ next_char::return#1 nxt#18 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#18 ] )
[71] (byte*) nxt#18 ← phi( next_char/(byte*) nxt#31 next_char::@2/(const byte*) TEXT#0 ) [ next_char::return#1 nxt#18 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#18 ] )
[72] (byte*) nxt#19 ← ++ (byte*) nxt#18 [ next_char::return#1 nxt#19 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#19 ] )
[63] (byte) next_char::return#1 ← phi( next_char/(byte) next_char::c#0 next_char::@2/(byte) next_char::c#1 ) [ next_char::return#1 nxt#18 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#18 ] )
[63] (byte*) nxt#18 ← phi( next_char/(byte*) nxt#31 next_char::@2/(const byte*) TEXT#0 ) [ next_char::return#1 nxt#18 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#18 ] )
[64] (byte*) nxt#19 ← ++ (byte*) nxt#18 [ next_char::return#1 nxt#19 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#19 ] )
to:next_char::@return
next_char::@return: scope:[next_char] from next_char::@1
[73] return [ next_char::return#1 nxt#19 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#19 ] )
[65] return [ next_char::return#1 nxt#19 ] ( main:2::scroll_soft:10::scroll_bit:17::next_char:24 [ next_char::return#1 nxt#19 ] )
to:@return
fillscreen: scope:[fillscreen] from main
[74] phi() [ ] ( main:2::fillscreen:5 [ ] )
[66] phi() [ ] ( main:2::fillscreen:5 [ ] )
to:fillscreen::@1
fillscreen::@1: scope:[fillscreen] from fillscreen fillscreen::@1
[75] (byte*) fillscreen::cursor#2 ← phi( fillscreen/(const byte*) SCREEN#0 fillscreen::@1/(byte*) fillscreen::cursor#1 ) [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[76] *((byte*) fillscreen::cursor#2) ← (const byte) fillscreen::fill#0 [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[77] (byte*) fillscreen::cursor#1 ← ++ (byte*) fillscreen::cursor#2 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
[78] if((byte*) fillscreen::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto fillscreen::@1 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
[67] (byte*) fillscreen::cursor#2 ← phi( fillscreen/(const byte*) SCREEN#0 fillscreen::@1/(byte*) fillscreen::cursor#1 ) [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[68] *((byte*) fillscreen::cursor#2) ← (const byte) fillscreen::fill#0 [ fillscreen::cursor#2 ] ( main:2::fillscreen:5 [ fillscreen::cursor#2 ] )
[69] (byte*) fillscreen::cursor#1 ← ++ (byte*) fillscreen::cursor#2 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
[70] if((byte*) fillscreen::cursor#1<(const byte*) SCREEN#0+(word/signed word) 1000) goto fillscreen::@1 [ fillscreen::cursor#1 ] ( main:2::fillscreen:5 [ fillscreen::cursor#1 ] )
to:fillscreen::@return
fillscreen::@return: scope:[fillscreen] from fillscreen::@1
[79] return [ ] ( main:2::fillscreen:5 [ ] )
[71] return [ ] ( main:2::fillscreen:5 [ ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -61,9 +61,9 @@
(byte) scroll#18 reg byte x 3.25
(byte) scroll#3 reg byte x 3.0
(void()) scroll_bit()
(byte~) scroll_bit::$10 reg byte a 22.0
(byte~) scroll_bit::$3 reg byte a 4.0
(word~) scroll_bit::$4 $4 zp ZP_WORD:3 4.0
(byte~) scroll_bit::$9 reg byte a 22.0
(label) scroll_bit::@1
(label) scroll_bit::@2
(label) scroll_bit::@3
@ -86,19 +86,11 @@
(byte*) scroll_bit::sc#1 sc zp ZP_WORD:5 7.333333333333333
(byte*) scroll_bit::sc#2 sc zp ZP_WORD:5 4.714285714285714
(void()) scroll_hard()
(byte~) scroll_hard::$17 reg byte a 22.0
(byte~) scroll_hard::$19 reg byte a 22.0
(byte~) scroll_hard::$21 reg byte a 22.0
(byte~) scroll_hard::$23 reg byte a 22.0
(byte~) scroll_hard::$25 reg byte a 22.0
(byte~) scroll_hard::$27 reg byte a 22.0
(byte~) scroll_hard::$29 reg byte a 22.0
(byte~) scroll_hard::$31 reg byte a 22.0
(label) scroll_hard::@1
(label) scroll_hard::@return
(byte) scroll_hard::i
(byte) scroll_hard::i#1 reg byte x 16.5
(byte) scroll_hard::i#2 reg byte x 11.647058823529411
(byte) scroll_hard::i#2 reg byte x 21.999999999999993
(byte[]) scroll_hard::line0
(const byte[]) scroll_hard::line0#0 line0 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word) 40*(byte/signed byte/word/signed word) 0
(byte[]) scroll_hard::line1
@ -132,12 +124,4 @@ reg byte a [ next_char::return#1 next_char::c#0 next_char::c#1 ]
reg byte a [ next_char::return#0 ]
reg byte a [ scroll_bit::$3 ]
reg byte a [ scroll_bit::bits#0 ]
reg byte a [ scroll_bit::$10 ]
reg byte a [ scroll_hard::$17 ]
reg byte a [ scroll_hard::$19 ]
reg byte a [ scroll_hard::$21 ]
reg byte a [ scroll_hard::$23 ]
reg byte a [ scroll_hard::$25 ]
reg byte a [ scroll_hard::$27 ]
reg byte a [ scroll_hard::$29 ]
reg byte a [ scroll_hard::$31 ]
reg byte a [ scroll_bit::$9 ]

View File

@ -2777,12 +2777,12 @@ anim::@return: scope:[anim] from anim::@1
to:@end
@end: scope:[] from @4
Consolidated assigned array index constant in assignment *(SPRITES_XPOS#0+0)
Consolidated assigned array index constant in assignment *(SPRITES_YPOS#0+0)
Consolidated assigned array index constant in assignment *(SPRITES_COLS#0+0)
Consolidated assigned array index constant in assignment *(SPRITES_PTR#0+0)
Consolidated assigned array index constant in assignment *(SPRITES_XPOS#0+0)
Consolidated assigned array index constant in assignment *(SPRITES_YPOS#0+0)
Consolidated array index constant in *(SPRITES_XPOS#0+0)
Consolidated array index constant in *(SPRITES_YPOS#0+0)
Consolidated array index constant in *(SPRITES_COLS#0+0)
Consolidated array index constant in *(SPRITES_PTR#0+0)
Consolidated array index constant in *(SPRITES_XPOS#0+0)
Consolidated array index constant in *(SPRITES_YPOS#0+0)
Succesful SSA optimization Pass2ConstantAdditionElimination
CONTROL FLOW GRAPH
@begin: scope:[] from

View File

@ -103,12 +103,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
[48] (byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 ) [ print_byte::b#2 char_cursor#31 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 ] )
[48] (byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 ) [ print_byte::b#2 char_cursor#31 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 ] )
[49] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4 [ print_byte::b#2 char_cursor#31 print_byte::$0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_byte::$0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_byte::$0 ] )
[50] (byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0 [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] )
[50] (byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0) [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] )
[51] call print_char param-assignment [ char_cursor#10 print_byte::b#2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::b#2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::b#2 ] )
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
[52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$3 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$3 ] )
[53] (byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3 [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] )
[52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$2 ] )
[53] (byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] )
[54] call print_char param-assignment [ char_cursor#10 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 ] )
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte::@1

View File

@ -381,11 +381,9 @@ endproc // print_word()
proc (void()) print_byte((byte) print_byte::b)
(byte[]) print_byte::hextab ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$0
(void~) print_byte::$2 ← call print_char (byte~) print_byte::$1
(byte~) print_byte::$3 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$3
(void~) print_byte::$5 ← call print_char (byte~) print_byte::$4
(void~) print_byte::$1 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$0)
(byte~) print_byte::$2 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(void~) print_byte::$3 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$2)
print_byte::@return:
return
endproc // print_byte()
@ -645,11 +643,9 @@ SYMBOLS
(byte*) prepareMEM::mem
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0
(byte~) print_byte::$1
(void~) print_byte::$2
(byte~) print_byte::$3
(byte~) print_byte::$4
(void~) print_byte::$5
(void~) print_byte::$1
(byte~) print_byte::$2
(void~) print_byte::$3
(label) print_byte::@return
(byte) print_byte::b
(byte[]) print_byte::hextab
@ -780,11 +776,9 @@ print_word::@return: scope:[print_word] from print_word
print_byte: scope:[print_byte] from
(byte[]) print_byte::hextab ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$0
(void~) print_byte::$2 ← call print_char (byte~) print_byte::$1
(byte~) print_byte::$3 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$3
(void~) print_byte::$5 ← call print_char (byte~) print_byte::$4
(void~) print_byte::$1 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$0)
(byte~) print_byte::$2 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(void~) print_byte::$3 ← call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$2)
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte
return
@ -1093,8 +1087,8 @@ Removing unused procedure logFAC
Removing unused procedure mulFACby10
Eliminating unused variable - keeping the call (void~) print_word::$1
Eliminating unused variable - keeping the call (void~) print_word::$3
Eliminating unused variable - keeping the call (void~) print_byte::$2
Eliminating unused variable - keeping the call (void~) print_byte::$5
Eliminating unused variable - keeping the call (void~) print_byte::$1
Eliminating unused variable - keeping the call (void~) print_byte::$3
Eliminating unused variable - keeping the call (void~) setFAC::$1
Eliminating unused variable - keeping the call (void~) setMEMtoFAC::$0
Eliminating unused variable - keeping the call (void~) addMEMtoFAC::$0
@ -1178,11 +1172,9 @@ print_word::@return: scope:[print_word] from print_word
print_byte: scope:[print_byte] from
(byte[]) print_byte::hextab ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$0
call print_char (byte~) print_byte::$1
(byte~) print_byte::$3 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$3
call print_char (byte~) print_byte::$4
call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$0)
(byte~) print_byte::$2 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
call print_char *((byte[]) print_byte::hextab + (byte~) print_byte::$2)
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte
return
@ -1349,15 +1341,13 @@ print_word::@return: scope:[print_word] from print_word::@2
print_byte: scope:[print_byte] from print_word print_word::@1
(byte[]) print_byte::hextab ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$0
(byte) print_char::ch ← (byte~) print_byte::$1
(byte) print_char::ch ← *((byte[]) print_byte::hextab + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte*) char_cursor ← (byte*) char_cursor
(byte~) print_byte::$3 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab *idx (byte~) print_byte::$3
(byte) print_char::ch ← (byte~) print_byte::$4
(byte~) print_byte::$2 ← (byte) print_byte::b & (byte/signed byte/word/signed word) 15
(byte) print_char::ch ← *((byte[]) print_byte::hextab + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -1615,17 +1605,15 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte[]) print_byte::hextab#0 ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← (byte~) print_byte::$1
(byte) print_char::ch#0 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte) print_byte::b#3 ← phi( print_byte/(byte) print_byte::b#2 )
(byte*) char_cursor#20 ← phi( print_byte/(byte*) char_cursor#31 )
(byte*) char_cursor#6 ← (byte*) char_cursor#20
(byte~) print_byte::$3 ← (byte) print_byte::b#3 & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte) print_char::ch#1 ← (byte~) print_byte::$4
(byte~) print_byte::$2 ← (byte) print_byte::b#3 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -1962,17 +1950,15 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte[]) print_byte::hextab#0 ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte~) print_byte::$1 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← (byte~) print_byte::$1
(byte) print_char::ch#0 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte) print_byte::b#3 ← phi( print_byte/(byte) print_byte::b#2 )
(byte*) char_cursor#20 ← phi( print_byte/(byte*) char_cursor#10 )
(byte*) char_cursor#6 ← (byte*) char_cursor#20
(byte~) print_byte::$3 ← (byte) print_byte::b#3 & (byte/signed byte/word/signed word) 15
(byte~) print_byte::$4 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte) print_char::ch#1 ← (byte~) print_byte::$4
(byte~) print_byte::$2 ← (byte) print_byte::b#3 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -2458,9 +2444,7 @@ INITIAL SSA SYMBOL TABLE
(byte*) prepareMEM::mem#5
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0
(byte~) print_byte::$1
(byte~) print_byte::$3
(byte~) print_byte::$4
(byte~) print_byte::$2
(label) print_byte::@1
(label) print_byte::@2
(label) print_byte::@return
@ -2556,10 +2540,8 @@ Alias (word) print_word::w#1 = (word) print_word::w#2
Alias (byte*) char_cursor#17 = (byte*) char_cursor#3
Alias (byte) print_byte::b#1 = (byte~) print_word::$2
Alias (byte*) char_cursor#18 = (byte*) char_cursor#4 (byte*) char_cursor#19 (byte*) char_cursor#5
Alias (byte) print_char::ch#0 = (byte~) print_byte::$1
Alias (byte) print_byte::b#2 = (byte) print_byte::b#3
Alias (byte*) char_cursor#20 = (byte*) char_cursor#6
Alias (byte) print_char::ch#1 = (byte~) print_byte::$4
Alias (byte*) char_cursor#21 = (byte*) char_cursor#7 (byte*) char_cursor#22 (byte*) char_cursor#8
Alias (byte*) char_cursor#10 = (byte*) char_cursor#24 (byte*) char_cursor#9
Alias (byte*) prepareMEM::mem#0 = (byte*~) setFAC::$0
@ -2624,13 +2606,13 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte[]) print_byte::hextab#0 ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte*) char_cursor#20 ← phi( print_byte/(byte*) char_cursor#10 )
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -2907,13 +2889,13 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte[]) print_byte::hextab#0 ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte*) char_cursor#20 ← phi( print_byte/(byte*) char_cursor#10 )
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -3161,12 +3143,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte[]) print_byte::hextab#0 ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -3383,12 +3365,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte[]) print_byte::hextab#0 ← { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -3610,12 +3592,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 )
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -3825,12 +3807,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 )
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -4030,12 +4012,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 )
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
@ -4233,12 +4215,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 )
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte::@1
@ -4480,12 +4462,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 )
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
call print_char param-assignment
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte::@1
@ -4714,7 +4696,7 @@ FINAL SYMBOL TABLE
(byte*) prepareMEM::mem#5
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0
(byte~) print_byte::$3
(byte~) print_byte::$2
(label) print_byte::@1
(label) print_byte::@return
(byte) print_byte::b
@ -4856,14 +4838,14 @@ print_byte: scope:[print_byte] from print_word print_word::@1
(byte*) char_cursor#31 ← phi( print_word/(byte*~) char_cursor#49 print_word::@1/(byte*~) char_cursor#50 )
(byte) print_byte::b#2 ← phi( print_word/(byte~) print_byte::b#4 print_word::@1/(byte~) print_byte::b#5 )
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4
(byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0
(byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0)
(byte~) print_char::ch#3 ← (byte) print_char::ch#0
(byte*~) char_cursor#51 ← (byte*) char_cursor#31
call print_char param-assignment
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3
(byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15
(byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2)
(byte~) print_char::ch#4 ← (byte) print_char::ch#1
(byte*~) char_cursor#52 ← (byte*) char_cursor#10
call print_char param-assignment
@ -5133,14 +5115,14 @@ print_byte: scope:[print_byte] from print_word print_word::@1
[56] (byte*) char_cursor#31 ← phi( print_word/(byte*~) char_cursor#49 print_word::@1/(byte*~) char_cursor#50 ) [ print_byte::b#2 char_cursor#31 ]
[56] (byte) print_byte::b#2 ← phi( print_word/(byte~) print_byte::b#4 print_word::@1/(byte~) print_byte::b#5 ) [ print_byte::b#2 char_cursor#31 ]
[57] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4 [ print_byte::b#2 char_cursor#31 print_byte::$0 ]
[58] (byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0 [ print_byte::b#2 char_cursor#31 print_char::ch#0 ]
[58] (byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0) [ print_byte::b#2 char_cursor#31 print_char::ch#0 ]
[59] (byte~) print_char::ch#3 ← (byte) print_char::ch#0 [ print_byte::b#2 char_cursor#31 print_char::ch#3 ]
[60] (byte*~) char_cursor#51 ← (byte*) char_cursor#31 [ print_byte::b#2 print_char::ch#3 char_cursor#51 ]
[61] call print_char param-assignment [ char_cursor#10 print_byte::b#2 ]
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
[62] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ]
[63] (byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3 [ char_cursor#10 print_char::ch#1 ]
[62] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ]
[63] (byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#10 print_char::ch#1 ]
[64] (byte~) print_char::ch#4 ← (byte) print_char::ch#1 [ char_cursor#10 print_char::ch#4 ]
[65] (byte*~) char_cursor#52 ← (byte*) char_cursor#10 [ print_char::ch#4 char_cursor#52 ]
[66] call print_char param-assignment [ char_cursor#10 ]
@ -5413,12 +5395,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
[48] (byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 ) [ print_byte::b#2 char_cursor#31 ]
[48] (byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 ) [ print_byte::b#2 char_cursor#31 ]
[49] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4 [ print_byte::b#2 char_cursor#31 print_byte::$0 ]
[50] (byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0 [ print_byte::b#2 char_cursor#31 print_char::ch#0 ]
[50] (byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0) [ print_byte::b#2 char_cursor#31 print_char::ch#0 ]
[51] call print_char param-assignment [ char_cursor#10 print_byte::b#2 ]
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
[52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ]
[53] (byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3 [ char_cursor#10 print_char::ch#1 ]
[52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ]
[53] (byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#10 print_char::ch#1 ]
[54] call print_char param-assignment [ char_cursor#10 ]
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte::@1
@ -5622,12 +5604,12 @@ print_byte: scope:[print_byte] from print_word print_word::@1
[48] (byte*) char_cursor#31 ← phi( print_word/(byte*) char_cursor#32 print_word::@1/(byte*) char_cursor#10 ) [ print_byte::b#2 char_cursor#31 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 ] )
[48] (byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 ) [ print_byte::b#2 char_cursor#31 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 ] )
[49] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4 [ print_byte::b#2 char_cursor#31 print_byte::$0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_byte::$0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_byte::$0 ] )
[50] (byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0 [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] )
[50] (byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0) [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] )
[51] call print_char param-assignment [ char_cursor#10 print_byte::b#2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::b#2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::b#2 ] )
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
[52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$3 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$3 ] )
[53] (byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3 [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] )
[52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$2 ] )
[53] (byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] )
[54] call print_char param-assignment [ char_cursor#10 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 ] )
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte::@1
@ -5854,7 +5836,7 @@ VARIABLE REGISTER WEIGHTS
(byte*) prepareMEM::mem#5 3.333333333333333
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0 4.0
(byte~) print_byte::$3 4.0
(byte~) print_byte::$2 4.0
(byte) print_byte::b
(byte) print_byte::b#0 4.0
(byte) print_byte::b#1 4.0
@ -5891,7 +5873,7 @@ Initial phi equivalence classes
Added variable getFAC::return#2 to zero page equivalence class [ getFAC::return#2 ]
Added variable print_word::w#0 to zero page equivalence class [ print_word::w#0 ]
Added variable print_byte::$0 to zero page equivalence class [ print_byte::$0 ]
Added variable print_byte::$3 to zero page equivalence class [ print_byte::$3 ]
Added variable print_byte::$2 to zero page equivalence class [ print_byte::$2 ]
Added variable getFAC::return#0 to zero page equivalence class [ getFAC::return#0 ]
Added variable prepareMEM::$0 to zero page equivalence class [ prepareMEM::$0 ]
Added variable prepareMEM::$1 to zero page equivalence class [ prepareMEM::$1 ]
@ -5908,7 +5890,7 @@ Complete equivalence classes
[ getFAC::return#2 ]
[ print_word::w#0 ]
[ print_byte::$0 ]
[ print_byte::$3 ]
[ print_byte::$2 ]
[ getFAC::return#0 ]
[ prepareMEM::$0 ]
[ prepareMEM::$1 ]
@ -5924,7 +5906,7 @@ Allocated zp ZP_WORD:15 [ setMEMtoFAC::mem#2 ]
Allocated zp ZP_WORD:17 [ getFAC::return#2 ]
Allocated zp ZP_WORD:19 [ print_word::w#0 ]
Allocated zp ZP_BYTE:21 [ print_byte::$0 ]
Allocated zp ZP_BYTE:22 [ print_byte::$3 ]
Allocated zp ZP_BYTE:22 [ print_byte::$2 ]
Allocated zp ZP_WORD:23 [ getFAC::return#0 ]
Allocated zp ZP_BYTE:25 [ prepareMEM::$0 ]
Allocated zp ZP_BYTE:26 [ prepareMEM::$1 ]
@ -6223,7 +6205,7 @@ print_word: {
//SEG105 print_byte
print_byte: {
.label _0 = $15
.label _3 = $16
.label _2 = $16
.label b = 5
//SEG106 [49] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word) 4 [ print_byte::b#2 char_cursor#31 print_byte::$0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_byte::$0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_byte::$0 ] ) -- vbuz1=vbuz2_ror_4
lda b
@ -6232,7 +6214,7 @@ print_byte: {
lsr
lsr
sta _0
//SEG107 [50] (byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0 [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
//SEG107 [50] (byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0) [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx _0
lda hextab,x
sta print_char.ch
@ -6245,12 +6227,12 @@ print_byte: {
jmp b1
//SEG112 print_byte::@1
b1:
//SEG113 [52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$3 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$3 ] ) -- vbuz1=vbuz2_band_vbuc1
//SEG113 [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$2 ] ) -- vbuz1=vbuz2_band_vbuc1
lda b
and #$f
sta _3
//SEG114 [53] (byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3 [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx _3
sta _2
//SEG114 [53] (byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] ) -- vbuz1=pbuc1_derefidx_vbuz2
ldx _2
lda hextab,x
sta print_char.ch
//SEG115 [54] call print_char param-assignment [ char_cursor#10 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 ] )
@ -6483,7 +6465,7 @@ Statement [40] (byte*) line_cursor#1 ← (byte*) line_cursor#6 + (byte/signed by
Statement [41] if((byte*) line_cursor#1<(byte*) char_cursor#10) goto print_ln::@1 [ line_cursor#1 char_cursor#10 ] ( main:2::print_ln:33 [ main::i#10 line_cursor#1 char_cursor#10 ] ) always clobbers reg byte a
Statement [43] (byte) print_byte::b#0 ← > (word) print_word::w#0 [ char_cursor#32 print_word::w#0 print_byte::b#0 ] ( main:2::print_word:31 [ main::i#10 line_cursor#13 char_cursor#32 print_word::w#0 print_byte::b#0 ] ) always clobbers reg byte a
Statement [45] (byte) print_byte::b#1 ← < (word) print_word::w#0 [ char_cursor#10 print_byte::b#1 ] ( main:2::print_word:31 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::b#1 ] ) always clobbers reg byte a
Statement [52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$3 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$3 ] ) always clobbers reg byte a
Statement [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
Statement [57] *((byte*) char_cursor#23) ← (byte) print_char::ch#2 [ char_cursor#23 ] ( main:2::print_word:31::print_byte:44::print_char:51 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:51 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#23 ] main:2::print_word:31::print_byte:44::print_char:54 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:54 [ main::i#10 line_cursor#13 char_cursor#23 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ main::i#10 main::i#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:5 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
@ -6508,7 +6490,7 @@ Statement [40] (byte*) line_cursor#1 ← (byte*) line_cursor#6 + (byte/signed by
Statement [41] if((byte*) line_cursor#1<(byte*) char_cursor#10) goto print_ln::@1 [ line_cursor#1 char_cursor#10 ] ( main:2::print_ln:33 [ main::i#10 line_cursor#1 char_cursor#10 ] ) always clobbers reg byte a
Statement [43] (byte) print_byte::b#0 ← > (word) print_word::w#0 [ char_cursor#32 print_word::w#0 print_byte::b#0 ] ( main:2::print_word:31 [ main::i#10 line_cursor#13 char_cursor#32 print_word::w#0 print_byte::b#0 ] ) always clobbers reg byte a
Statement [45] (byte) print_byte::b#1 ← < (word) print_word::w#0 [ char_cursor#10 print_byte::b#1 ] ( main:2::print_word:31 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::b#1 ] ) always clobbers reg byte a
Statement [52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$3 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$3 ] ) always clobbers reg byte a
Statement [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
Statement [57] *((byte*) char_cursor#23) ← (byte) print_char::ch#2 [ char_cursor#23 ] ( main:2::print_word:31::print_byte:44::print_char:51 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:51 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#23 ] main:2::print_word:31::print_byte:44::print_char:54 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:54 [ main::i#10 line_cursor#13 char_cursor#23 ] ) always clobbers reg byte y
Statement [61] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::getFAC:28 [ main::i#10 char_cursor#32 line_cursor#13 getFAC::return#0 ] ) always clobbers reg byte a
Statement asm { lda$feldy$ffjsr$b867 } always clobbers reg byte a reg byte y
@ -6533,7 +6515,7 @@ Potential registers zp ZP_WORD:15 [ setMEMtoFAC::mem#2 ] : zp ZP_WORD:15 ,
Potential registers zp ZP_WORD:17 [ getFAC::return#2 ] : zp ZP_WORD:17 ,
Potential registers zp ZP_WORD:19 [ print_word::w#0 ] : zp ZP_WORD:19 ,
Potential registers zp ZP_BYTE:21 [ print_byte::$0 ] : zp ZP_BYTE:21 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:22 [ print_byte::$3 ] : zp ZP_BYTE:22 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:22 [ print_byte::$2 ] : zp ZP_BYTE:22 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:23 [ getFAC::return#0 ] : zp ZP_WORD:23 ,
Potential registers zp ZP_BYTE:25 [ prepareMEM::$0 ] : zp ZP_BYTE:25 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:26 [ prepareMEM::$1 ] : zp ZP_BYTE:26 , reg byte a , reg byte x , reg byte y ,
@ -6543,7 +6525,7 @@ Uplift Scope [] 250.97: zp ZP_WORD:3 [ line_cursor#6 line_cursor#13 line_cursor#
Uplift Scope [setFAC] 35: zp ZP_WORD:13 [ setFAC::w#3 setFAC::w#1 ]
Uplift Scope [getFAC] 22: zp ZP_WORD:17 [ getFAC::return#2 ] 4.33: zp ZP_WORD:23 [ getFAC::return#0 ]
Uplift Scope [prepareMEM] 15.33: zp ZP_WORD:9 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 ] 4: zp ZP_BYTE:25 [ prepareMEM::$0 ] 4: zp ZP_BYTE:26 [ prepareMEM::$1 ]
Uplift Scope [print_byte] 10: zp ZP_BYTE:5 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp ZP_BYTE:21 [ print_byte::$0 ] 4: zp ZP_BYTE:22 [ print_byte::$3 ]
Uplift Scope [print_byte] 10: zp ZP_BYTE:5 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp ZP_BYTE:21 [ print_byte::$0 ] 4: zp ZP_BYTE:22 [ print_byte::$2 ]
Uplift Scope [print_char] 14: zp ZP_BYTE:6 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplift Scope [main] 12.38: zp ZP_BYTE:2 [ main::i#10 main::i#1 ]
Uplift Scope [print_word] 5: zp ZP_WORD:19 [ print_word::w#0 ]
@ -6559,7 +6541,7 @@ Uplifting [] best 6734 combination zp ZP_WORD:3 [ line_cursor#6 line_cursor#13 l
Uplifting [setFAC] best 6734 combination zp ZP_WORD:13 [ setFAC::w#3 setFAC::w#1 ]
Uplifting [getFAC] best 6734 combination zp ZP_WORD:17 [ getFAC::return#2 ] zp ZP_WORD:23 [ getFAC::return#0 ]
Uplifting [prepareMEM] best 6722 combination zp ZP_WORD:9 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 ] reg byte a [ prepareMEM::$0 ] reg byte a [ prepareMEM::$1 ]
Uplifting [print_byte] best 6710 combination reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] reg byte y [ print_byte::$0 ] reg byte a [ print_byte::$3 ]
Uplifting [print_byte] best 6710 combination reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] reg byte y [ print_byte::$0 ] reg byte a [ print_byte::$2 ]
Uplifting [print_char] best 6701 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplifting [main] best 6701 combination zp ZP_BYTE:2 [ main::i#10 main::i#1 ]
Uplifting [print_word] best 6701 combination zp ZP_WORD:19 [ print_word::w#0 ]
@ -6876,7 +6858,7 @@ print_byte: {
lsr
lsr
tay
//SEG107 [50] (byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0 [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
//SEG107 [50] (byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0) [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
lda hextab,y
//SEG108 [51] call print_char param-assignment [ char_cursor#10 print_byte::b#2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::b#2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::b#2 ] )
//SEG109 [56] phi from print_byte to print_char [phi:print_byte->print_char]
@ -6887,10 +6869,10 @@ print_byte: {
jmp b1
//SEG112 print_byte::@1
b1:
//SEG113 [52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$3 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$3 ] ) -- vbuaa=vbuxx_band_vbuc1
//SEG113 [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$2 ] ) -- vbuaa=vbuxx_band_vbuc1
txa
and #$f
//SEG114 [53] (byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3 [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] ) -- vbuaa=pbuc1_derefidx_vbuaa
//SEG114 [53] (byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] ) -- vbuaa=pbuc1_derefidx_vbuaa
tax
lda hextab,x
//SEG115 [54] call print_char param-assignment [ char_cursor#10 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 ] )
@ -7289,7 +7271,7 @@ FINAL SYMBOL TABLE
(byte*) prepareMEM::mem#5 mem zp ZP_WORD:7 3.333333333333333
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0 reg byte y 4.0
(byte~) print_byte::$3 reg byte a 4.0
(byte~) print_byte::$2 reg byte a 4.0
(label) print_byte::@1
(label) print_byte::@return
(byte) print_byte::b
@ -7333,7 +7315,7 @@ reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
zp ZP_WORD:5 [ char_cursor#23 char_cursor#31 char_cursor#32 char_cursor#48 char_cursor#10 ]
zp ZP_WORD:7 [ prepareMEM::mem#5 prepareMEM::mem#4 prepareMEM::mem#0 prepareMEM::mem#1 mulFACbyMEM::mem#2 setFAC::w#3 setFAC::w#1 setMEMtoFAC::mem#2 getFAC::return#2 print_word::w#0 getFAC::return#0 ]
reg byte y [ print_byte::$0 ]
reg byte a [ print_byte::$3 ]
reg byte a [ print_byte::$2 ]
reg byte a [ prepareMEM::$0 ]
reg byte a [ prepareMEM::$1 ]
@ -7561,7 +7543,7 @@ print_byte: {
lsr
lsr
tay
//SEG107 [50] (byte) print_char::ch#0 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$0 [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
//SEG107 [50] (byte) print_char::ch#0 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$0) [ print_byte::b#2 char_cursor#31 print_char::ch#0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 print_byte::b#2 char_cursor#31 print_char::ch#0 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 print_byte::b#2 char_cursor#31 print_char::ch#0 ] ) -- vbuaa=pbuc1_derefidx_vbuyy
lda hextab,y
//SEG108 [51] call print_char param-assignment [ char_cursor#10 print_byte::b#2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::b#2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::b#2 ] )
//SEG109 [56] phi from print_byte to print_char [phi:print_byte->print_char]
@ -7569,10 +7551,10 @@ print_byte: {
//SEG111 [56] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy
jsr print_char
//SEG112 print_byte::@1
//SEG113 [52] (byte~) print_byte::$3 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$3 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$3 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$3 ] ) -- vbuaa=vbuxx_band_vbuc1
//SEG113 [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word) 15 [ char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_byte::$2 ] ) -- vbuaa=vbuxx_band_vbuc1
txa
and #$f
//SEG114 [53] (byte) print_char::ch#1 ← (const byte[]) print_byte::hextab#0 *idx (byte~) print_byte::$3 [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] ) -- vbuaa=pbuc1_derefidx_vbuaa
//SEG114 [53] (byte) print_char::ch#1 ← *((const byte[]) print_byte::hextab#0 + (byte~) print_byte::$2) [ char_cursor#10 print_char::ch#1 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 print_char::ch#1 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 print_char::ch#1 ] ) -- vbuaa=pbuc1_derefidx_vbuaa
tax
lda hextab,x
//SEG115 [54] call print_char param-assignment [ char_cursor#10 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 line_cursor#13 print_word::w#0 char_cursor#10 ] main:2::print_word:31::print_byte:46 [ main::i#10 line_cursor#13 char_cursor#10 ] )

Some files were not shown because too many files have changed in this diff Show More