1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-03-24 15:32:58 +00:00

Converted ranged for to use declarator. Removed support for ranged for without type. #121

This commit is contained in:
jespergravgaard 2021-05-02 17:39:07 +02:00
parent f0970364b5
commit fafc9a5765
23 changed files with 6140 additions and 6223 deletions

View File

@ -76,7 +76,6 @@ typeSpecifier
declarator
: NAME #declaratorName // {if(isTypedef) Parser.addTypedef($NAME.text);}
//| declarator PAR_BEGIN parameterListDecl? PAR_END #declaratorProcedure
| declarator BRACKET_BEGIN (expr)? BRACKET_END #declaratorArray
| ASTERISK directive* declarator #declaratorPointer
| PAR_BEGIN declarator PAR_END #declaratorPar
@ -202,7 +201,7 @@ switchCase:
forLoop
: forClassicInit ';' forClassicCondition? ';' commaExpr? #forClassic
| (declType declPointer*)? NAME COLON expr RANGE expr #forRange
| declType declarator COLON expr RANGE expr #forRange
;
forClassicInit

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -34,26 +34,17 @@ declSeq
decl
: declVariables ';'
| declFunction
| structDef ';'
| enumDef ';'
| declFunction
| pragma
| typeDef ';'
;
typeDef
: TYPEDEF declType declarator
;
declVariables
: declType declaratorInitList
;
declType
: directive* type directive*
;
declaratorInitList
: declaratorInit
| declaratorInitList COMMA declaratorInit
@ -64,12 +55,12 @@ declaratorInit
| declarator '=' kasmContent #declVariableInitKasm
;
declarator
: NAME {if(isTypedef) Parser.addTypedef($NAME.text);} #declaratorName
| declarator PAR_BEGIN parameterListDecl? PAR_END #declaratorProcedure
| declarator BRACKET_BEGIN (expr)? BRACKET_END #declaratorArray
| ASTERISK directive* declarator #declaratorPointer
| PAR_BEGIN declarator PAR_END #declaratorPar
typeDef
: TYPEDEF declType declarator
;
declType
: directive* type directive*
;
typeSpecifier
@ -78,6 +69,14 @@ typeSpecifier
| typeSpecifier BRACKET_BEGIN (expr)? BRACKET_END #typeSpecifierArray
;
declarator
: NAME {if(isTypedef) Parser.addTypedef($NAME.text);} #declaratorName
| declarator PAR_BEGIN parameterListDecl? PAR_END #declaratorProcedure
| declarator BRACKET_BEGIN (expr)? BRACKET_END #declaratorArray
| ASTERISK directive* declarator #declaratorPointer
| PAR_BEGIN declarator PAR_END #declaratorPar
;
type
: SIMPLETYPE #typeSimple
| SIGNEDNESS SIMPLETYPE? #typeSignedSimple
@ -197,8 +196,7 @@ switchCase:
forLoop
: forClassicInit ';' forClassicCondition? ';' commaExpr? #forClassic
| declType declarator COLON expr RANGE expr #forRangeDecl
| NAME COLON expr RANGE expr #forRangeName
| declType declarator COLON expr RANGE expr #forRange
;
forClassicInit

View File

@ -1583,15 +1583,10 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
scopeStack.push(blockScope);
loopStack.push(new Loop(blockScope, false));
StatementSource statementSource = StatementSource.forRanged(ctx);
// Create / find declared loop variable
if(ctx.declType() != null) {
this.visit(ctx.declType());
for(KickCParser.DeclPointerContext declPointerContext : ctx.declPointer()) {
this.visit(declPointerContext);
}
}
this.visit(ctx.declType());
this.visit(ctx.declarator());
SymbolType varType = varDecl.getEffectiveType();
String varName = ctx.NAME().getText();
String varName = varDecl.getVarName();
Variable lValue;
if(varType != null) {
VariableBuilder varBuilder = new VariableBuilder(varName, blockScope, false, varType, varDecl.getDeclDirectives(), currentDataSegment, program.getTargetPlatform().getVariableBuilderConfig());

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,384 @@
package dk.camelot64.kickc.test;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.net.URISyntaxException;
/**
* Compile a number of source files and compare the resulting assembler with expected output
*/
public class TestProgramsThorough extends TestPrograms {
@Test
public void testCx16VeralibTilemap8bpp() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/veralib/tilemap_8bpp_16_x_16.c");
}
@Test
public void testCx16VeralibBitmap8bpp() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/veralib/bitmap_8bpp_320_x_240.c");
}
@Test
public void testCx16BankAddressing() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/cx16-bankaddressing.c");
}
//@Test
//public void testCx16SpaceDemo() throws IOException, URISyntaxException {
// compileAndCompare("examples/cx16/spacedemo/spacedemo.c");
//}
@Test
public void testCx16LoadFileInBank() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/cx16-bankload.c");
}
@Test
public void testCx16VeraLayers() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/cx16-veralayers.c");
}
@Test
public void testCx16TileMap() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/cx16-tilemap.c");
}
@Test
public void testCx16Sprites() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/cx16-sprites.c");
}
@Test
public void testCx16Text() throws IOException, URISyntaxException {
compileAndCompare("examples/cx16/cx16-text.c");
}
@Test
public void test32bitRols() throws IOException, URISyntaxException {
compileAndCompare("32bit-rols.c");
}
@Test
public void testComplexBorderlinePacman() throws IOException, URISyntaxException {
compileAndCompare("complex/borderline_pacman/pacman.c");
}
@Test
public void testComplexNew30YearsLowResolution() throws IOException, URISyntaxException {
compileAndCompare("complex/new_30_years_low_resolution/new_30_years_low_resolution.c");
}
@Test
public void testC64DtvGfxExplorer() throws IOException, URISyntaxException {
compileAndCompare("c64dtv-gfxexplorer.c", 10);
}
@Test
public void testC64DtvGfxModes() throws IOException, URISyntaxException {
compileAndCompare("c64dtv-gfxmodes.c", 10);
}
@Test
public void testPrintf12() throws IOException, URISyntaxException {
compileAndCompare("printf-12.c");
}
@Test
public void testPrintf13() throws IOException, URISyntaxException {
compileAndCompare("printf-13.c");
}
@Test
public void testEightQueensRecursive() throws IOException, URISyntaxException {
compileAndCompare("examples/eightqueens/eightqueens-recursive.c");
}
@Test
public void testEightQueens() throws IOException, URISyntaxException {
compileAndCompare("examples/eightqueens/eightqueens.c");
}
@Test
public void testCpu65CE02EightQueens() throws IOException, URISyntaxException {
compileAndCompare("cpu-65ce02-eightqueens.c");
}
@Test
public void testAdventOfCode04() throws IOException, URISyntaxException {
compileAndCompare("adventofcode/2020-04.c");
}
@Test
public void testAdventOfCode03() throws IOException, URISyntaxException {
compileAndCompare("adventofcode/2020-03.c");
}
@Test
public void testAdventOfCode02() throws IOException, URISyntaxException {
compileAndCompare("adventofcode/2020-02.c");
}
@Test
public void testAdventOfCode01() throws IOException, URISyntaxException {
compileAndCompare("adventofcode/2020-01.c");
}
@Test
public void testDeepNesting() throws IOException, URISyntaxException {
compileAndCompare("deep-nesting.c");
}
@Test
public void testMultiply8Bit() throws IOException, URISyntaxException {
compileAndCompare("test-multiply-8bit.c");
}
@Test
public void testSinusGenScale8() throws IOException, URISyntaxException {
compileAndCompare("sinusgenscale8.c");
}
@Test
public void test3D() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/3d/3d.c");
}
@Test
public void testAtariXlMd5() throws IOException, URISyntaxException {
compileAndCompare("atarixl-md5.c");
}
@Test
public void testMultiply16Bit() throws IOException, URISyntaxException {
compileAndCompare("test-multiply-16bit.c");
}
@Test
public void testNesConio() throws IOException, URISyntaxException {
compileAndCompare("examples/nes/nes-conio.c");
}
@Test
public void testRand1() throws IOException, URISyntaxException {
compileAndCompare("rand-1.c");
}
@Test
public void testScreenShowSpiralBuckets() throws IOException, URISyntaxException {
compileAndCompare("screen-show-spiral-buckets.c");
}
@Test
public void testPrintf2() throws IOException, URISyntaxException {
compileAndCompare("printf-2.c");
}
@Test
public void testStars1() throws IOException, URISyntaxException {
compileAndCompare("stars-1.c");
}
@Test
public void testSinusGen16b() throws IOException, URISyntaxException {
compileAndCompare("sinusgen16b.c");
}
@Test
public void testPrngXorshift() throws IOException, URISyntaxException {
compileAndCompare("prng-xorshift.c");
}
@Test
public void testPlasmaCenter() throws IOException, URISyntaxException {
compileAndCompare("plasma-center.c");
}
@Test
public void testSemiStruct2() throws IOException, URISyntaxException {
compileAndCompare("semi-struct-2.c");
}
@Test
public void testTypeSigned() throws IOException, URISyntaxException {
compileAndCompare("type-signed.c");
}
@Test
public void testDivision() throws IOException, URISyntaxException {
compileAndCompare("test-division.c");
}
@Test
public void testScrollLogo() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/scrolllogo/scrolllogo.c");
}
@Test
public void testSinusGen8b() throws IOException, URISyntaxException {
compileAndCompare("sinusgen8b.c");
}
@Test
public void testStdlibStringMemChr1() throws IOException, URISyntaxException {
compileAndCompare("stdlib-string-memchr-1.c");
}
@Test
public void testAtariXlConioTest() throws IOException, URISyntaxException {
compileAndCompare("examples/atarixl/atarixl-conio.c");
}
@Test
public void testPrintf16() throws IOException, URISyntaxException {
compileAndCompare("printf-16.c");
}
@Test
public void testNoRecursionHeavy() throws IOException, URISyntaxException {
compileAndCompare("no-recursion-heavy.c");
}
@Test
public void testBitmapPlot2() throws IOException, URISyntaxException {
compileAndCompare("bitmap-plot-2.c");
}
@Test
public void testPlasmaUnroll() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/plasma/plasma-unroll.c");
}
@Test
public void testPrimes1000() throws IOException, URISyntaxException {
compileAndCompare("primes-1000.c");
}
@Test
public void testBitmapPlot1() throws IOException, URISyntaxException {
compileAndCompare("bitmap-plot-1.c");
}
@Test
public void testSinePlotter() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/sinplotter/sine-plotter.c");
}
@Test
public void testSinusSprites() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/sinsprites/sinus-sprites.c");
}
@Test
public void testConioNachtScreen() throws IOException, URISyntaxException {
compileAndCompare("examples/conio/nacht-screen.c");
}
@Test
public void testScreenShowSpiral() throws IOException, URISyntaxException {
compileAndCompare("screen-show-spiral.c");
}
@Test
public void testCircleChars() throws IOException, URISyntaxException {
compileAndCompare("circlechars.c");
}
@Test
public void testPrintfSpeed() throws IOException, URISyntaxException {
compileAndCompare("printf-speed.c");
}
@Test
public void testRotate() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/rotate/rotate.c");
}
@Test
public void testXMega65Logo() throws IOException, URISyntaxException {
compileAndCompare("complex/xmega65/xmega65logo.c");
}
@Test
public void testPlasma() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/plasma/plasma.c");
}
@Test
public void testPaulNelsenSandbox() throws IOException, URISyntaxException {
compileAndCompare("sandbox.c");
}
@Test
public void testScreenCenterDistance() throws IOException, URISyntaxException {
compileAndCompare("screen-center-distance.c");
}
@Test
public void testNesDemo() throws IOException, URISyntaxException {
compileAndCompare("examples/nes/nes-demo.c");
}
@Test
public void testCordicAtan2Ref() throws IOException, URISyntaxException {
compileAndCompare("cordic-atan2-16-ref.c");
}
@Test
public void testSieve() throws IOException, URISyntaxException {
compileAndCompare("sieve.c");
}
@Test
public void testAtoi() throws IOException, URISyntaxException {
compileAndCompare("atoi-1.c");
}
@Test
public void testTextbox() throws IOException, URISyntaxException {
compileAndCompare("textbox.c");
}
@Test
public void testSinusGen8() throws IOException, URISyntaxException {
compileAndCompare("sinusgen8.c");
}
@Test
public void testScreenCenterAngle() throws IOException, URISyntaxException {
compileAndCompare("screen-center-angle.c");
}
@Test
public void testFastMultiply127() throws IOException, URISyntaxException {
compileAndCompare("fastmultiply-127.c");
}
@Test
public void testComparisons() throws IOException, URISyntaxException {
compileAndCompare("test-comparisons.c", 10);
}
@Test
public void testChargenAnalysis() throws IOException, URISyntaxException {
compileAndCompare("examples/c64/chargen/chargen-analysis.c");
}
@Test
public void testLineAnim() throws IOException, URISyntaxException {
compileAndCompare("line-anim.c");
}
}

View File

@ -52,20 +52,19 @@ void render_logo(signed int xpos) {
char screen_idx;
*D016 = VICII_MCM|((char)xpos&7);
signed char x_char = (signed char)(xpos/8);
char line = 0;
if(xpos<0) {
// Render right side of the logo and some spaces
logo_idx = (char)(-x_char);
screen_idx = 0;
while(logo_idx!=40) {
inline for(line: 0..5) {
inline for(char line: 0..5) {
(SCREEN+40*line)[screen_idx] = logo_idx+40*line;
}
screen_idx++;
logo_idx++;
}
while(screen_idx!=40) {
inline for(line: 0..5) {
inline for(char line: 0..5) {
(SCREEN+40*line)[screen_idx] = $00;
}
screen_idx++;
@ -75,14 +74,14 @@ void render_logo(signed int xpos) {
char logo_start = (char)x_char;
screen_idx = 0;
while(screen_idx!=logo_start) {
inline for(line: 0..5) {
inline for(char line: 0..5) {
(SCREEN+40*line)[screen_idx] = $00;
}
screen_idx++;
}
logo_idx = 0;
while(screen_idx!=40) {
inline for(line: 0..5) {
inline for(char line: 0..5) {
(SCREEN+40*line)[screen_idx] = logo_idx+40*line;
}
screen_idx++;

View File

@ -1,14 +0,0 @@
// Range-loop without loop variable declaration causes NPE
// https://gitlab.com/camelot/kickc/-/issues/333
char * line = 0x0400;
void main() {
clear_line(line);
clear_line(line+40);
}
void clear_line(byte *line) {
for (i: 0..39)
line[i] = 0;
}

View File

@ -4,11 +4,10 @@ char* SCREEN1 = 0x0400;
char* SCREEN2 = 0x0500;
void main() {
for(byte i : 0..255) {
for(char i : 0..255) {
SCREEN1[i] = i;
}
byte j;
for(j : 100..0) {
for(char j : 100..0) {
SCREEN2[j] = j;
}
}

View File

@ -1,13 +0,0 @@
// Illustrated compiler NPE when doing ranged loop without declaring the loop variable.
void main() {
byte* SCREEN = 0x0400;
clear_line(SCREEN);
}
void clear_line(byte *line) {
for (i: 0..39)
line[i] = 0;
}

View File

@ -43,12 +43,10 @@ unsigned int sum(void) {
}
void main(void) {
unsigned int i;
unsigned char c;
start();
for(c : 0..4) {
for(unsigned char c : 0..4) {
init();
for(i : 0..2999) {
for(unsigned int i : 0..2999) {
prepend(i);
}
print_char((byte)sum());

File diff suppressed because it is too large Load Diff

View File

@ -166,6 +166,9 @@ byte~ render_logo::$76 reg byte a 200002.0
byte~ render_logo::$79 reg byte a 200002.0
byte~ render_logo::$82 reg byte a 200002.0
byte render_logo::line
byte render_logo::line1
byte render_logo::line2
byte render_logo::line3
byte render_logo::logo_idx
signed byte render_logo::logo_idx#1 reg byte a 1001.0
byte render_logo::logo_idx#10 logo_idx zp[1]:16 57143.42857142857

View File

@ -16,7 +16,7 @@ main: {
// SCREEN1[i] = i
txa
sta SCREEN1,x
// for(byte i : 0..255)
// for(char i : 0..255)
inx
cpx #0
bne __b1
@ -25,7 +25,7 @@ main: {
// SCREEN2[j] = j
txa
sta SCREEN2,x
// for(j : 100..0)
// for(char j : 100..0)
dex
cpx #$ff
bne __b2

View File

@ -10,10 +10,10 @@ main::@1: scope:[main] from main main::@1
[4] if(main::i#1!=0) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1 main::@2
[5] main::j#3 = phi( main::@1/$64, main::@2/main::j#2 )
[6] SCREEN2[main::j#3] = main::j#3
[7] main::j#2 = -- main::j#3
[8] if(main::j#2!=$ff) goto main::@2
[5] main::j#2 = phi( main::@1/$64, main::@2/main::j#1 )
[6] SCREEN2[main::j#2] = main::j#2
[7] main::j#1 = -- main::j#2
[8] if(main::j#1!=$ff) goto main::@2
to:main::@return
main::@return: scope:[main] from main::@2
[9] return

View File

@ -14,14 +14,13 @@ main::@1: scope:[main] from main main::@1
if(main::$0) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
main::j#0 = 0
main::j#1 = $64
main::j#0 = $64
to:main::@3
main::@3: scope:[main] from main::@2 main::@3
main::j#3 = phi( main::@2/main::j#1, main::@3/main::j#2 )
SCREEN2[main::j#3] = main::j#3
main::j#2 = main::j#3 + rangenext($64,0)
main::$1 = main::j#2 != rangelast($64,0)
main::j#2 = phi( main::@2/main::j#0, main::@3/main::j#1 )
SCREEN2[main::j#2] = main::j#2
main::j#1 = main::j#2 + rangenext($64,0)
main::$1 = main::j#1 != rangelast($64,0)
if(main::$1) goto main::@3
to:main::@return
main::@return: scope:[main] from main::@3
@ -57,31 +56,20 @@ byte main::j
byte main::j#0
byte main::j#1
byte main::j#2
byte main::j#3
Adding number conversion cast (unumber) $64 in main::j#1 = $64
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast main::j#1 = (unumber)$64
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (byte*) 1024
Simplifying constant pointer cast (byte*) 1280
Simplifying constant integer cast $64
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) $64
Successful SSA optimization PassNFinalizeNumberTypeConversions
Simple Condition main::$0 [5] if(main::i#1!=rangelast(0,$ff)) goto main::@1
Simple Condition main::$1 [12] if(main::j#2!=rangelast($64,0)) goto main::@3
Simple Condition main::$1 [11] if(main::j#1!=rangelast($64,0)) goto main::@3
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant main::i#0 = 0
Constant main::j#0 = 0
Constant main::j#1 = $64
Constant main::j#0 = $64
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [3] main::i#1 = ++ main::i#2 to ++
Resolved ranged comparison value [5] if(main::i#1!=rangelast(0,$ff)) goto main::@1 to 0
Resolved ranged next value [10] main::j#2 = -- main::j#3 to --
Resolved ranged comparison value [12] if(main::j#2!=rangelast($64,0)) goto main::@3 to $ff
Eliminating unused constant main::j#0
Successful SSA optimization PassNEliminateUnusedVars
Resolved ranged next value [9] main::j#1 = -- main::j#2 to --
Resolved ranged comparison value [11] if(main::j#1!=rangelast($64,0)) goto main::@3 to $ff
Removing unused procedure __start
Removing unused procedure block __start
Removing unused procedure block __start::__init1
@ -90,7 +78,7 @@ Removing unused procedure block __start::@2
Removing unused procedure block __start::@return
Successful SSA optimization PassNEliminateEmptyStart
Adding number conversion cast (unumber) 0 in [3] if(main::i#1!=0) goto main::@1
Adding number conversion cast (unumber) $ff in [7] if(main::j#2!=$ff) goto main::@3
Adding number conversion cast (unumber) $ff in [7] if(main::j#1!=$ff) goto main::@3
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast 0
Simplifying constant integer cast $ff
@ -99,9 +87,9 @@ Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $ff
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inlining constant with var siblings main::i#0
Inlining constant with var siblings main::j#1
Inlining constant with var siblings main::j#0
Constant inlined main::i#0 = 0
Constant inlined main::j#1 = $64
Constant inlined main::j#0 = $64
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@4(between main::@1 and main::@1)
Added new block during phi lifting main::@5(between main::@3 and main::@3)
@ -110,7 +98,7 @@ Adding NOP phi() at start of main::@2
CALL GRAPH
Created 2 initial phi equivalence classes
Coalesced [11] main::j#4 = main::j#2
Coalesced [11] main::j#3 = main::j#1
Coalesced [12] main::i#3 = main::i#1
Coalesced down to 2 phi equivalence classes
Culled Empty Block label main::@2
@ -132,10 +120,10 @@ main::@1: scope:[main] from main main::@1
[4] if(main::i#1!=0) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1 main::@2
[5] main::j#3 = phi( main::@1/$64, main::@2/main::j#2 )
[6] SCREEN2[main::j#3] = main::j#3
[7] main::j#2 = -- main::j#3
[8] if(main::j#2!=$ff) goto main::@2
[5] main::j#2 = phi( main::@1/$64, main::@2/main::j#1 )
[6] SCREEN2[main::j#2] = main::j#2
[7] main::j#1 = -- main::j#2
[8] if(main::j#1!=$ff) goto main::@2
to:main::@return
main::@return: scope:[main] from main::@2
[9] return
@ -148,26 +136,26 @@ byte main::i
byte main::i#1 16.5
byte main::i#2 22.0
byte main::j
byte main::j#2 16.5
byte main::j#3 22.0
byte main::j#1 16.5
byte main::j#2 22.0
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#3 main::j#2 ]
[ main::j#2 main::j#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::j#3 main::j#2 ]
[ main::j#2 main::j#1 ]
Allocated zp[1]:2 [ main::i#2 main::i#1 ]
Allocated zp[1]:3 [ main::j#3 main::j#2 ]
Allocated zp[1]:3 [ main::j#2 main::j#1 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ main::j#3 main::j#2 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ main::j#2 main::j#1 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 38.5: zp[1]:2 [ main::i#2 main::i#1 ] 38.5: zp[1]:3 [ main::j#3 main::j#2 ]
Uplift Scope [main] 38.5: zp[1]:2 [ main::i#2 main::i#1 ] 38.5: zp[1]:3 [ main::j#2 main::j#1 ]
Uplift Scope []
Uplifting [main] best 466 combination reg byte x [ main::i#2 main::i#1 ] reg byte x [ main::j#3 main::j#2 ]
Uplifting [main] best 466 combination reg byte x [ main::i#2 main::i#1 ] reg byte x [ main::j#2 main::j#1 ]
Uplifting [] best 466 combination
ASSEMBLER BEFORE OPTIMIZATION
@ -209,21 +197,21 @@ main: {
bne __b1_from___b1
// [5] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
__b2_from___b1:
// [5] phi main::j#3 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
// [5] phi main::j#2 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
ldx #$64
jmp __b2
// [5] phi from main::@2 to main::@2 [phi:main::@2->main::@2]
__b2_from___b2:
// [5] phi main::j#3 = main::j#2 [phi:main::@2->main::@2#0] -- register_copy
// [5] phi main::j#2 = main::j#1 [phi:main::@2->main::@2#0] -- register_copy
jmp __b2
// main::@2
__b2:
// [6] SCREEN2[main::j#3] = main::j#3 -- pbuc1_derefidx_vbuxx=vbuxx
// [6] SCREEN2[main::j#2] = main::j#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN2,x
// [7] main::j#2 = -- main::j#3 -- vbuxx=_dec_vbuxx
// [7] main::j#1 = -- main::j#2 -- vbuxx=_dec_vbuxx
dex
// [8] if(main::j#2!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1
// [8] if(main::j#1!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1
cpx #$ff
bne __b2_from___b2
jmp __breturn
@ -260,11 +248,11 @@ byte main::i
byte main::i#1 reg byte x 16.5
byte main::i#2 reg byte x 22.0
byte main::j
byte main::j#2 reg byte x 16.5
byte main::j#3 reg byte x 22.0
byte main::j#1 reg byte x 16.5
byte main::j#2 reg byte x 22.0
reg byte x [ main::i#2 main::i#1 ]
reg byte x [ main::j#3 main::j#2 ]
reg byte x [ main::j#2 main::j#1 ]
FINAL ASSEMBLER
@ -298,27 +286,27 @@ main: {
// [2] SCREEN1[main::i#2] = main::i#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN1,x
// for(byte i : 0..255)
// for(char i : 0..255)
// [3] main::i#1 = ++ main::i#2 -- vbuxx=_inc_vbuxx
inx
// [4] if(main::i#1!=0) goto main::@1 -- vbuxx_neq_0_then_la1
cpx #0
bne __b1
// [5] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
// [5] phi main::j#3 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
// [5] phi main::j#2 = $64 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
ldx #$64
// [5] phi from main::@2 to main::@2 [phi:main::@2->main::@2]
// [5] phi main::j#3 = main::j#2 [phi:main::@2->main::@2#0] -- register_copy
// [5] phi main::j#2 = main::j#1 [phi:main::@2->main::@2#0] -- register_copy
// main::@2
__b2:
// SCREEN2[j] = j
// [6] SCREEN2[main::j#3] = main::j#3 -- pbuc1_derefidx_vbuxx=vbuxx
// [6] SCREEN2[main::j#2] = main::j#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN2,x
// for(j : 100..0)
// [7] main::j#2 = -- main::j#3 -- vbuxx=_dec_vbuxx
// for(char j : 100..0)
// [7] main::j#1 = -- main::j#2 -- vbuxx=_dec_vbuxx
dex
// [8] if(main::j#2!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1
// [8] if(main::j#1!=$ff) goto main::@2 -- vbuxx_neq_vbuc1_then_la1
cpx #$ff
bne __b2
// main::@return

View File

@ -5,8 +5,8 @@ byte main::i
byte main::i#1 reg byte x 16.5
byte main::i#2 reg byte x 22.0
byte main::j
byte main::j#2 reg byte x 16.5
byte main::j#3 reg byte x 22.0
byte main::j#1 reg byte x 16.5
byte main::j#2 reg byte x 22.0
reg byte x [ main::i#2 main::i#1 ]
reg byte x [ main::j#3 main::j#2 ]
reg byte x [ main::j#2 main::j#1 ]

View File

@ -47,7 +47,7 @@ main: {
__b2:
// prepend(i)
jsr prepend
// for(i : 0..2999)
// for(unsigned int i : 0..2999)
inc.z i
bne !+
inc.z i+1
@ -63,7 +63,7 @@ main: {
// print_char((byte)sum())
lda.z __5
jsr print_char
// for(c : 0..4)
// for(unsigned char c : 0..4)
inx
cpx #5
bne __b1

View File

@ -20,19 +20,19 @@ main: scope:[main] from __start::@1
[6] call start
to:main::@1
main::@1: scope:[main] from main main::@7
[7] main::c#8 = phi( main/0, main::@7/main::c#2 )
[7] main::c#7 = phi( main/0, main::@7/main::c#1 )
[7] print_char_cursor#48 = phi( main/print_screen#0, main::@7/print_char_cursor#28 )
to:main::@2
main::@2: scope:[main] from main::@1 main::@5
[8] root#22 = phi( main::@1/(struct node*) 0, main::@5/root#12 )
[8] free_#24 = phi( main::@1/0, main::@5/free_#14 )
[8] main::i#3 = phi( main::@1/0, main::@5/main::i#2 )
[9] prepend::x#0 = main::i#3
[8] main::i#2 = phi( main::@1/0, main::@5/main::i#1 )
[9] prepend::x#0 = main::i#2
[10] call prepend
to:main::@5
main::@5: scope:[main] from main::@2
[11] main::i#2 = ++ main::i#3
[12] if(main::i#2!=$bb8) goto main::@2
[11] main::i#1 = ++ main::i#2
[12] if(main::i#1!=$bb8) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@5
[13] phi()
@ -45,8 +45,8 @@ main::@6: scope:[main] from main::@3
[18] call print_char
to:main::@7
main::@7: scope:[main] from main::@6
[19] main::c#2 = ++ main::c#8
[20] if(main::c#2!=5) goto main::@1
[19] main::c#1 = ++ main::c#7
[20] if(main::c#1!=5) goto main::@1
to:main::@4
main::@4: scope:[main] from main::@7
[21] phi()

View File

@ -248,8 +248,6 @@ main: scope:[main] from __start::@1
print_char_cursor#51 = phi( __start::@1/print_char_cursor#43 )
root#28 = phi( __start::@1/root#24 )
free_#30 = phi( __start::@1/free_#26 )
main::i#0 = 0
main::c#0 = 0
call start
to:main::@5
main::@5: scope:[main] from main
@ -258,12 +256,12 @@ main::@5: scope:[main] from main
print_char_cursor#50 = phi( main/print_char_cursor#51 )
root#25 = phi( main/root#28 )
free_#27 = phi( main/free_#30 )
main::c#1 = 0
main::c#0 = 0
to:main::@1
main::@1: scope:[main] from main::@5 main::@9
print_line_cursor#30 = phi( main::@5/print_line_cursor#31, main::@9/print_line_cursor#23 )
Ticks#24 = phi( main::@5/Ticks#25, main::@9/Ticks#18 )
main::c#9 = phi( main::@5/main::c#1, main::@9/main::c#2 )
main::c#8 = phi( main::@5/main::c#0, main::@9/main::c#1 )
print_char_cursor#49 = phi( main::@5/print_char_cursor#50, main::@9/print_char_cursor#13 )
root#21 = phi( main::@5/root#25, main::@9/root#26 )
free_#23 = phi( main::@5/free_#27, main::@9/free_#28 )
@ -272,44 +270,44 @@ main::@1: scope:[main] from main::@5 main::@9
main::@6: scope:[main] from main::@1
print_line_cursor#29 = phi( main::@1/print_line_cursor#30 )
Ticks#23 = phi( main::@1/Ticks#24 )
main::c#8 = phi( main::@1/main::c#9 )
main::c#7 = phi( main::@1/main::c#8 )
print_char_cursor#48 = phi( main::@1/print_char_cursor#49 )
root#14 = phi( main::@1/root#1 )
free_#17 = phi( main::@1/free_#1 )
free_#6 = free_#17
root#4 = root#14
main::i#1 = 0
main::i#0 = 0
to:main::@2
main::@2: scope:[main] from main::@6 main::@7
print_line_cursor#28 = phi( main::@6/print_line_cursor#29, main::@7/print_line_cursor#27 )
Ticks#22 = phi( main::@6/Ticks#23, main::@7/Ticks#21 )
main::c#7 = phi( main::@6/main::c#8, main::@7/main::c#6 )
main::c#6 = phi( main::@6/main::c#7, main::@7/main::c#5 )
print_char_cursor#47 = phi( main::@6/print_char_cursor#48, main::@7/print_char_cursor#46 )
root#22 = phi( main::@6/root#4, main::@7/root#5 )
free_#24 = phi( main::@6/free_#6, main::@7/free_#7 )
main::i#3 = phi( main::@6/main::i#1, main::@7/main::i#2 )
prepend::x#0 = main::i#3
main::i#2 = phi( main::@6/main::i#0, main::@7/main::i#1 )
prepend::x#0 = main::i#2
call prepend
to:main::@7
main::@7: scope:[main] from main::@2
print_line_cursor#27 = phi( main::@2/print_line_cursor#28 )
Ticks#21 = phi( main::@2/Ticks#22 )
main::c#6 = phi( main::@2/main::c#7 )
main::c#5 = phi( main::@2/main::c#6 )
print_char_cursor#46 = phi( main::@2/print_char_cursor#47 )
main::i#4 = phi( main::@2/main::i#3 )
main::i#3 = phi( main::@2/main::i#2 )
root#15 = phi( main::@2/root#3 )
free_#18 = phi( main::@2/free_#5 )
free_#7 = free_#18
root#5 = root#15
main::i#2 = main::i#4 + rangenext(0,$bb7)
main::$4 = main::i#2 != rangelast(0,$bb7)
main::i#1 = main::i#3 + rangenext(0,$bb7)
main::$4 = main::i#1 != rangelast(0,$bb7)
if(main::$4) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@7
print_line_cursor#26 = phi( main::@7/print_line_cursor#27 )
Ticks#20 = phi( main::@7/Ticks#21 )
free_#32 = phi( main::@7/free_#7 )
main::c#5 = phi( main::@7/main::c#6 )
main::c#4 = phi( main::@7/main::c#5 )
print_char_cursor#45 = phi( main::@7/print_char_cursor#46 )
root#20 = phi( main::@7/root#5 )
call sum
@ -320,7 +318,7 @@ main::@8: scope:[main] from main::@3
Ticks#19 = phi( main::@3/Ticks#20 )
root#29 = phi( main::@3/root#20 )
free_#31 = phi( main::@3/free_#32 )
main::c#4 = phi( main::@3/main::c#5 )
main::c#3 = phi( main::@3/main::c#4 )
print_char_cursor#40 = phi( main::@3/print_char_cursor#45 )
sum::return#4 = phi( main::@3/sum::return#2 )
main::$5 = sum::return#4
@ -332,11 +330,11 @@ main::@9: scope:[main] from main::@8
Ticks#18 = phi( main::@8/Ticks#19 )
root#26 = phi( main::@8/root#29 )
free_#28 = phi( main::@8/free_#31 )
main::c#3 = phi( main::@8/main::c#4 )
main::c#2 = phi( main::@8/main::c#3 )
print_char_cursor#32 = phi( main::@8/print_char_cursor#9 )
print_char_cursor#13 = print_char_cursor#32
main::c#2 = main::c#3 + rangenext(0,4)
main::$7 = main::c#2 != rangelast(0,4)
main::c#1 = main::c#2 + rangenext(0,4)
main::$7 = main::c#1 != rangelast(0,4)
if(main::$7) goto main::@1
to:main::@4
main::@4: scope:[main] from main::@9
@ -522,13 +520,11 @@ byte main::c#5
byte main::c#6
byte main::c#7
byte main::c#8
byte main::c#9
word main::i
word main::i#0
word main::i#1
word main::i#2
word main::i#3
word main::i#4
void prepend(word prepend::x)
struct node*~ prepend::$0
struct node**~ prepend::$1
@ -725,14 +721,10 @@ Adding number conversion cast (unumber) $f in print_uchar::$2 = print_uchar::b#3
Adding number conversion cast (unumber) print_uchar::$2 in print_uchar::$2 = print_uchar::b#3 & (unumber)$f
Adding number conversion cast (unumber) 0 in free_#0 = 0
Adding number conversion cast (unumber) 0 in sum::s#1 = 0
Adding number conversion cast (unumber) 0 in main::c#1 = 0
Adding number conversion cast (unumber) 0 in main::i#1 = 0
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast free_#0 = (unumber)0
Inlining cast root#0 = (struct node*)0
Inlining cast sum::s#1 = (unumber)0
Inlining cast main::c#1 = (unumber)0
Inlining cast main::i#1 = (unumber)0
Successful SSA optimization Pass2InlineCast
Simplifying constant integer cast $28
Simplifying constant integer cast 4
@ -740,8 +732,6 @@ Simplifying constant integer cast $f
Simplifying constant integer cast 0
Simplifying constant pointer cast (struct node*) 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant pointer cast (byte*) 1024
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) $28
@ -749,8 +739,6 @@ Finalized unsigned number type (byte) 4
Finalized unsigned number type (byte) $f
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to byte in print_uchar::$2 = print_uchar::b#3 & $f
Alias print_line_cursor#0 = print_ln::$0 print_line_cursor#10 print_char_cursor#0 print_line_cursor#11 print_char_cursor#20 print_line_cursor#1 print_char_cursor#1
@ -788,14 +776,14 @@ Alias print_char_cursor#50 = print_char_cursor#51
Alias Ticks#25 = Ticks#26
Alias print_line_cursor#31 = print_line_cursor#32
Alias print_char_cursor#48 = print_char_cursor#49
Alias main::c#8 = main::c#9
Alias main::c#7 = main::c#8
Alias Ticks#23 = Ticks#24
Alias print_line_cursor#29 = print_line_cursor#30
Alias free_#17 = free_#6
Alias root#14 = root#4
Alias main::i#3 = main::i#4
Alias main::i#2 = main::i#3
Alias print_char_cursor#40 = print_char_cursor#46 print_char_cursor#47 print_char_cursor#45
Alias main::c#3 = main::c#6 main::c#7 main::c#5 main::c#4
Alias main::c#2 = main::c#5 main::c#6 main::c#4 main::c#3
Alias Ticks#15 = Ticks#21 Ticks#22 Ticks#20 Ticks#19 Ticks#18
Alias print_line_cursor#20 = print_line_cursor#27 print_line_cursor#28 print_line_cursor#26 print_line_cursor#25 print_line_cursor#23
Alias free_#18 = free_#7 free_#32 free_#31 free_#28 free_#29 free_#25 free_#19 free_#8
@ -843,7 +831,7 @@ Identical Phi Values print_line_cursor#31 print_screen#0
Identical Phi Values free_#17 free_#0
Identical Phi Values root#14 root#0
Identical Phi Values print_char_cursor#40 print_char_cursor#48
Identical Phi Values main::c#3 main::c#8
Identical Phi Values main::c#2 main::c#7
Identical Phi Values Ticks#15 Ticks#23
Identical Phi Values print_line_cursor#20 print_line_cursor#29
Identical Phi Values free_#18 free_#15
@ -864,8 +852,8 @@ Identical Phi Values print_line_cursor#29 print_screen#0
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition print_ln::$1 [4] if(print_line_cursor#0<print_char_cursor#28) goto print_ln::@1
Simple Condition sum::$4 [71] if((struct node*)0!=sum::current#3) goto sum::@2
Simple Condition main::$4 [94] if(main::i#2!=rangelast(0,$bb7)) goto main::@2
Simple Condition main::$7 [103] if(main::c#2!=rangelast(0,4)) goto main::@1
Simple Condition main::$4 [92] if(main::i#1!=rangelast(0,$bb7)) goto main::@2
Simple Condition main::$7 [101] if(main::c#1!=rangelast(0,4)) goto main::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant free_#0 = 0
Constant root#0 = (struct node*) 0
@ -874,19 +862,17 @@ Constant prepend::new#0 = (struct node*) 0
Constant sum::current#0 = (struct node*) 0
Constant sum::s#0 = 0
Constant sum::s#1 = 0
Constant main::i#0 = 0
Constant main::c#0 = 0
Constant main::c#1 = 0
Constant main::i#1 = 0
Constant main::i#0 = 0
Constant print_screen#0 = (byte*) 1024
Constant Ticks#16 = 0
Constant free_#26 = 0
Constant root#24 = (struct node*) 0
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [92] main::i#2 = ++ main::i#3 to ++
Resolved ranged comparison value [94] if(main::i#2!=rangelast(0,$bb7)) goto main::@2 to $bb8
Resolved ranged next value [101] main::c#2 = ++ main::c#8 to ++
Resolved ranged comparison value [103] if(main::c#2!=rangelast(0,4)) goto main::@1 to 5
Resolved ranged next value [90] main::i#1 = ++ main::i#2 to ++
Resolved ranged comparison value [92] if(main::i#1!=rangelast(0,$bb7)) goto main::@2 to $bb8
Resolved ranged next value [99] main::c#1 = ++ main::c#7 to ++
Resolved ranged comparison value [101] if(main::c#1!=rangelast(0,4)) goto main::@1 to 5
Converting *(pointer+n) to pointer[n] [58] *prepend::$1 = root#22 -- prepend::$3[OFFSET_STRUCT_NODE_NEXT]
Converting *(pointer+n) to pointer[n] [61] *prepend::$2 = prepend::x#0 -- prepend::$4[OFFSET_STRUCT_NODE_VALUE]
Converting *(pointer+n) to pointer[n] [74] sum::s#2 = sum::s#3 + *sum::$0 -- sum::$2[OFFSET_STRUCT_NODE_VALUE]
@ -907,8 +893,6 @@ Eliminating unused constant alloc::result#0
Eliminating unused constant prepend::new#0
Eliminating unused constant sum::current#0
Eliminating unused constant sum::s#0
Eliminating unused constant main::i#0
Eliminating unused constant main::c#0
Eliminating unused constant OFFSET_STRUCT_NODE_NEXT
Eliminating unused constant Ticks#16
Successful SSA optimization PassNEliminateUnusedVars
@ -920,8 +904,8 @@ Removing unused procedure init
Removing unused procedure block init
Removing unused procedure block init::@return
Successful SSA optimization PassNEliminateEmptyProcedure
Adding number conversion cast (unumber) $bb8 in [60] if(main::i#2!=$bb8) goto main::@2
Adding number conversion cast (unumber) 5 in [67] if(main::c#2!=5) goto main::@1
Adding number conversion cast (unumber) $bb8 in [60] if(main::i#1!=$bb8) goto main::@2
Adding number conversion cast (unumber) 5 in [67] if(main::c#1!=5) goto main::@1
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast $bb8
Simplifying constant integer cast 5
@ -937,14 +921,14 @@ Successful SSA optimization Pass2NopCastInlining
Rewriting multiplication to use shift [31] alloc::$1 = free_#24 * SIZEOF_STRUCT_NODE
Successful SSA optimization Pass2MultiplyToShiftRewriting
Inlining constant with var siblings sum::s#1
Inlining constant with var siblings main::c#1
Inlining constant with var siblings main::i#1
Inlining constant with var siblings main::c#0
Inlining constant with var siblings main::i#0
Inlining constant with var siblings free_#0
Inlining constant with var siblings root#0
Constant inlined main::i#0 = 0
Constant inlined main::c#0 = 0
Constant inlined free_#0 = 0
Constant inlined sum::s#1 = 0
Constant inlined main::i#1 = 0
Constant inlined main::c#1 = 0
Constant inlined root#0 = (struct node*) 0
Successful SSA optimization Pass2ConstantInlining
Eliminating unused constant SIZEOF_STRUCT_NODE
@ -988,8 +972,8 @@ Created 11 initial phi equivalence classes
Coalesced [21] print_char::ch#4 = print_char::ch#2
Coalesced [22] print_char_cursor#52 = print_char_cursor#48
Coalesced [30] print_char_cursor#55 = print_char_cursor#28
Coalesced [31] main::c#10 = main::c#2
Coalesced [32] main::i#5 = main::i#2
Coalesced [31] main::c#9 = main::c#1
Coalesced [32] main::i#4 = main::i#1
Coalesced [33] free_#33 = free_#14
Coalesced [34] root#30 = root#12
Not coalescing [43] root#12 = prepend::new#1
@ -1051,19 +1035,19 @@ main: scope:[main] from __start::@1
[6] call start
to:main::@1
main::@1: scope:[main] from main main::@7
[7] main::c#8 = phi( main/0, main::@7/main::c#2 )
[7] main::c#7 = phi( main/0, main::@7/main::c#1 )
[7] print_char_cursor#48 = phi( main/print_screen#0, main::@7/print_char_cursor#28 )
to:main::@2
main::@2: scope:[main] from main::@1 main::@5
[8] root#22 = phi( main::@1/(struct node*) 0, main::@5/root#12 )
[8] free_#24 = phi( main::@1/0, main::@5/free_#14 )
[8] main::i#3 = phi( main::@1/0, main::@5/main::i#2 )
[9] prepend::x#0 = main::i#3
[8] main::i#2 = phi( main::@1/0, main::@5/main::i#1 )
[9] prepend::x#0 = main::i#2
[10] call prepend
to:main::@5
main::@5: scope:[main] from main::@2
[11] main::i#2 = ++ main::i#3
[12] if(main::i#2!=$bb8) goto main::@2
[11] main::i#1 = ++ main::i#2
[12] if(main::i#1!=$bb8) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@5
[13] phi()
@ -1076,8 +1060,8 @@ main::@6: scope:[main] from main::@3
[18] call print_char
to:main::@7
main::@7: scope:[main] from main::@6
[19] main::c#2 = ++ main::c#8
[20] if(main::c#2!=5) goto main::@1
[19] main::c#1 = ++ main::c#7
[20] if(main::c#1!=5) goto main::@1
to:main::@4
main::@4: scope:[main] from main::@7
[21] phi()
@ -1230,11 +1214,11 @@ volatile word last_time loadstore 18.454545454545453
void main()
word~ main::$5 101.0
byte main::c
byte main::c#2 151.5
byte main::c#8 16.833333333333332
byte main::c#1 151.5
byte main::c#7 16.833333333333332
word main::i
word main::i#2 1501.5
word main::i#3 1001.0
word main::i#1 1501.5
word main::i#2 1001.0
void prepend(word prepend::x)
struct node* prepend::new
struct node* prepend::new#1 6667.333333333333
@ -1281,8 +1265,8 @@ word sum::s#2 100001.0
word sum::s#3 50025.75
Initial phi equivalence classes
[ main::c#8 main::c#2 ]
[ main::i#3 main::i#2 ]
[ main::c#7 main::c#1 ]
[ main::i#2 main::i#1 ]
[ free_#24 free_#14 ]
[ root#22 root#12 ]
[ sum::current#3 sum::current#1 sum::current#2 ]
@ -1305,8 +1289,8 @@ Added variable alloc::return#0 to live range equivalence class [ alloc::return#0
Added variable print_uchar::$0 to live range equivalence class [ print_uchar::$0 ]
Added variable print_uchar::$2 to live range equivalence class [ print_uchar::$2 ]
Complete equivalence classes
[ main::c#8 main::c#2 ]
[ main::i#3 main::i#2 ]
[ main::c#7 main::c#1 ]
[ main::i#2 main::i#1 ]
[ free_#24 free_#14 ]
[ root#22 root#12 ]
[ sum::current#3 sum::current#1 sum::current#2 ]
@ -1328,8 +1312,8 @@ Complete equivalence classes
[ alloc::return#0 ]
[ print_uchar::$0 ]
[ print_uchar::$2 ]
Allocated zp[1]:2 [ main::c#8 main::c#2 ]
Allocated zp[2]:3 [ main::i#3 main::i#2 ]
Allocated zp[1]:2 [ main::c#7 main::c#1 ]
Allocated zp[2]:3 [ main::i#2 main::i#1 ]
Allocated zp[2]:5 [ free_#24 free_#14 ]
Allocated zp[2]:7 [ root#22 root#12 ]
Allocated zp[2]:9 [ sum::current#3 sum::current#1 sum::current#2 ]
@ -1353,65 +1337,65 @@ Allocated zp[1]:41 [ print_uchar::$0 ]
Allocated zp[1]:42 [ print_uchar::$2 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] last_time = 0 [ last_time ] ( [ last_time ] { } ) always clobbers reg byte a
Statement [9] prepend::x#0 = main::i#3 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#24 root#22 prepend::x#0 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#24 root#22 prepend::x#0 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::c#8 main::c#2 ]
Statement [12] if(main::i#2!=$bb8) goto main::@2 [ last_time print_char_cursor#48 main::c#8 main::i#2 free_#14 root#12 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::i#2 free_#14 root#12 ] { } ) always clobbers reg byte a
Statement [15] sum::return#2 = sum::s#3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [16] main::$5 = sum::return#2 [ last_time print_char_cursor#48 main::c#8 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::$5 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement [17] print_char::ch#2 = (byte)main::$5 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement [9] prepend::x#0 = main::i#2 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#24 root#22 prepend::x#0 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#24 root#22 prepend::x#0 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::c#7 main::c#1 ]
Statement [12] if(main::i#1!=$bb8) goto main::@2 [ last_time print_char_cursor#48 main::c#7 main::i#1 free_#14 root#12 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::i#1 free_#14 root#12 ] { } ) always clobbers reg byte a
Statement [15] sum::return#2 = sum::s#3 [ last_time print_char_cursor#48 main::c#7 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [16] main::$5 = sum::return#2 [ last_time print_char_cursor#48 main::c#7 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::$5 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement [17] print_char::ch#2 = (byte)main::$5 [ last_time print_char_cursor#48 main::c#7 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 print_char::ch#2 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 } always clobbers reg byte a reg byte x reg byte y
Statement [28] alloc::return#2 = alloc::return#0 [ root#22 free_#14 prepend::x#0 alloc::return#2 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 free_#14 prepend::x#0 alloc::return#2 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [29] prepend::new#1 = alloc::return#2 [ root#22 free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a
Statement [30] *((struct node**)prepend::new#1) = root#22 [ free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::c#8 main::c#2 ]
Statement [31] ((word*)prepend::new#1)[OFFSET_STRUCT_NODE_VALUE] = prepend::x#0 [ free_#14 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a reg byte y
Statement [32] root#12 = prepend::new#1 [ free_#14 root#12 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 root#12 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a
Statement [34] sum::current#1 = root#12 [ sum::current#1 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [36] if((struct node*)0!=sum::current#3) goto sum::@2 [ sum::s#3 sum::current#3 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::s#3 sum::current#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [38] sum::s#2 = sum::s#3 + ((word*)sum::current#3)[OFFSET_STRUCT_NODE_VALUE] [ sum::current#3 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#3 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [39] sum::current#2 = *((struct node**)sum::current#3) [ sum::current#2 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#2 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [41] *print_char_cursor#27 = print_char::ch#3 [ print_char_cursor#27 ] ( main:3::print_char:18 [ last_time main::c#8 print_char_cursor#27 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:70 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:70 [ print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:73 [ print_uint::w#0 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:73 [ print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte y
Statement [28] alloc::return#2 = alloc::return#0 [ root#22 free_#14 prepend::x#0 alloc::return#2 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 free_#14 prepend::x#0 alloc::return#2 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [29] prepend::new#1 = alloc::return#2 [ root#22 free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a
Statement [30] *((struct node**)prepend::new#1) = root#22 [ free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::c#7 main::c#1 ]
Statement [31] ((word*)prepend::new#1)[OFFSET_STRUCT_NODE_VALUE] = prepend::x#0 [ free_#14 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a reg byte y
Statement [32] root#12 = prepend::new#1 [ free_#14 root#12 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 root#12 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a
Statement [34] sum::current#1 = root#12 [ sum::current#1 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [36] if((struct node*)0!=sum::current#3) goto sum::@2 [ sum::s#3 sum::current#3 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::s#3 sum::current#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [38] sum::s#2 = sum::s#3 + ((word*)sum::current#3)[OFFSET_STRUCT_NODE_VALUE] [ sum::current#3 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#3 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [39] sum::current#2 = *((struct node**)sum::current#3) [ sum::current#2 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#2 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [41] *print_char_cursor#27 = print_char::ch#3 [ print_char_cursor#27 ] ( main:3::print_char:18 [ last_time main::c#7 print_char_cursor#27 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:70 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:70 [ print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:73 [ print_uint::w#0 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:73 [ print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:18 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [44] Ticks#0 = last_time [ last_time print_char_cursor#28 Ticks#0 ] ( main:3::end:22 [ last_time print_char_cursor#28 Ticks#0 ] { } ) always clobbers reg byte a
Statement [46] last_time = last_time - Ticks#0 [ last_time print_char_cursor#28 ] ( main:3::end:22 [ last_time print_char_cursor#28 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [47] Ticks#1 = last_time [ print_char_cursor#28 Ticks#1 ] ( main:3::end:22 [ print_char_cursor#28 Ticks#1 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [48] print_uint::w#0 = Ticks#1 [ print_char_cursor#28 print_uint::w#0 ] ( main:3::end:22 [ print_char_cursor#28 print_uint::w#0 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [53] alloc::$1 = free_#24 << 2 [ free_#24 alloc::$1 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 prepend::x#0 free_#24 alloc::$1 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [54] alloc::return#0 = heap + alloc::$1 [ free_#24 alloc::return#0 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 prepend::x#0 free_#24 alloc::return#0 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [53] alloc::$1 = free_#24 << 2 [ free_#24 alloc::$1 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 prepend::x#0 free_#24 alloc::$1 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [54] alloc::return#0 = heap + alloc::$1 [ free_#24 alloc::return#0 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 prepend::x#0 free_#24 alloc::return#0 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [64] print_line_cursor#0 = print_line_cursor#9 + $28 [ print_char_cursor#28 print_line_cursor#0 ] ( main:3::end:22::print_ln:51 [ print_char_cursor#28 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement [65] if(print_line_cursor#0<print_char_cursor#28) goto print_ln::@1 [ print_char_cursor#28 print_line_cursor#0 ] ( main:3::end:22::print_ln:51 [ print_char_cursor#28 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement [68] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:18 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [71] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#28 print_uchar::$2 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a
Statement [1] last_time = 0 [ last_time ] ( [ last_time ] { } ) always clobbers reg byte a
Statement [9] prepend::x#0 = main::i#3 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#24 root#22 prepend::x#0 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#24 root#22 prepend::x#0 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a
Statement [12] if(main::i#2!=$bb8) goto main::@2 [ last_time print_char_cursor#48 main::c#8 main::i#2 free_#14 root#12 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::i#2 free_#14 root#12 ] { } ) always clobbers reg byte a
Statement [15] sum::return#2 = sum::s#3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [16] main::$5 = sum::return#2 [ last_time print_char_cursor#48 main::c#8 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::$5 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement [17] print_char::ch#2 = (byte)main::$5 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement [9] prepend::x#0 = main::i#2 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#24 root#22 prepend::x#0 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#24 root#22 prepend::x#0 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a
Statement [12] if(main::i#1!=$bb8) goto main::@2 [ last_time print_char_cursor#48 main::c#7 main::i#1 free_#14 root#12 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::i#1 free_#14 root#12 ] { } ) always clobbers reg byte a
Statement [15] sum::return#2 = sum::s#3 [ last_time print_char_cursor#48 main::c#7 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [16] main::$5 = sum::return#2 [ last_time print_char_cursor#48 main::c#7 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 main::$5 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement [17] print_char::ch#2 = (byte)main::$5 [ last_time print_char_cursor#48 main::c#7 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#7 print_char::ch#2 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } ) always clobbers reg byte a
Statement asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 } always clobbers reg byte a reg byte x reg byte y
Statement [28] alloc::return#2 = alloc::return#0 [ root#22 free_#14 prepend::x#0 alloc::return#2 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 free_#14 prepend::x#0 alloc::return#2 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [29] prepend::new#1 = alloc::return#2 [ root#22 free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a
Statement [30] *((struct node**)prepend::new#1) = root#22 [ free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a reg byte y
Statement [31] ((word*)prepend::new#1)[OFFSET_STRUCT_NODE_VALUE] = prepend::x#0 [ free_#14 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 prepend::new#1 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a reg byte y
Statement [32] root#12 = prepend::new#1 [ free_#14 root#12 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#8 main::i#3 free_#14 root#12 ] { { prepend::x#0 = main::i#3 } } ) always clobbers reg byte a
Statement [34] sum::current#1 = root#12 [ sum::current#1 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [36] if((struct node*)0!=sum::current#3) goto sum::@2 [ sum::s#3 sum::current#3 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::s#3 sum::current#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [38] sum::s#2 = sum::s#3 + ((word*)sum::current#3)[OFFSET_STRUCT_NODE_VALUE] [ sum::current#3 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#3 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [39] sum::current#2 = *((struct node**)sum::current#3) [ sum::current#2 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#8 sum::current#2 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [41] *print_char_cursor#27 = print_char::ch#3 [ print_char_cursor#27 ] ( main:3::print_char:18 [ last_time main::c#8 print_char_cursor#27 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:70 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:70 [ print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:73 [ print_uint::w#0 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:73 [ print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte y
Statement [28] alloc::return#2 = alloc::return#0 [ root#22 free_#14 prepend::x#0 alloc::return#2 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 free_#14 prepend::x#0 alloc::return#2 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [29] prepend::new#1 = alloc::return#2 [ root#22 free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a
Statement [30] *((struct node**)prepend::new#1) = root#22 [ free_#14 prepend::x#0 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 prepend::x#0 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a reg byte y
Statement [31] ((word*)prepend::new#1)[OFFSET_STRUCT_NODE_VALUE] = prepend::x#0 [ free_#14 prepend::new#1 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 prepend::new#1 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a reg byte y
Statement [32] root#12 = prepend::new#1 [ free_#14 root#12 ] ( main:3::prepend:10 [ last_time print_char_cursor#48 main::c#7 main::i#2 free_#14 root#12 ] { { prepend::x#0 = main::i#2 } } ) always clobbers reg byte a
Statement [34] sum::current#1 = root#12 [ sum::current#1 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [36] if((struct node*)0!=sum::current#3) goto sum::@2 [ sum::s#3 sum::current#3 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::s#3 sum::current#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [38] sum::s#2 = sum::s#3 + ((word*)sum::current#3)[OFFSET_STRUCT_NODE_VALUE] [ sum::current#3 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#3 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [39] sum::current#2 = *((struct node**)sum::current#3) [ sum::current#2 sum::s#2 ] ( main:3::sum:14 [ last_time print_char_cursor#48 main::c#7 sum::current#2 sum::s#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a reg byte y
Statement [41] *print_char_cursor#27 = print_char::ch#3 [ print_char_cursor#27 ] ( main:3::print_char:18 [ last_time main::c#7 print_char_cursor#27 ] { { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#48 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:70 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:70 [ print_uchar::b#2 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:58::print_char:73 [ print_uint::w#0 print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60::print_char:73 [ print_char_cursor#27 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte y
Statement [44] Ticks#0 = last_time [ last_time print_char_cursor#28 Ticks#0 ] ( main:3::end:22 [ last_time print_char_cursor#28 Ticks#0 ] { } ) always clobbers reg byte a
Statement [46] last_time = last_time - Ticks#0 [ last_time print_char_cursor#28 ] ( main:3::end:22 [ last_time print_char_cursor#28 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [47] Ticks#1 = last_time [ print_char_cursor#28 Ticks#1 ] ( main:3::end:22 [ print_char_cursor#28 Ticks#1 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [48] print_uint::w#0 = Ticks#1 [ print_char_cursor#28 print_uint::w#0 ] ( main:3::end:22 [ print_char_cursor#28 print_uint::w#0 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [53] alloc::$1 = free_#24 << 2 [ free_#24 alloc::$1 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 prepend::x#0 free_#24 alloc::$1 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [54] alloc::return#0 = heap + alloc::$1 [ free_#24 alloc::return#0 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#8 main::i#3 root#22 prepend::x#0 free_#24 alloc::return#0 ] { { prepend::x#0 = main::i#3 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [53] alloc::$1 = free_#24 << 2 [ free_#24 alloc::$1 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 prepend::x#0 free_#24 alloc::$1 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [54] alloc::return#0 = heap + alloc::$1 [ free_#24 alloc::return#0 ] ( main:3::prepend:10::alloc:27 [ last_time print_char_cursor#48 main::c#7 main::i#2 root#22 prepend::x#0 free_#24 alloc::return#0 ] { { prepend::x#0 = main::i#2 } { alloc::return#0 = alloc::return#2 } } ) always clobbers reg byte a
Statement [64] print_line_cursor#0 = print_line_cursor#9 + $28 [ print_char_cursor#28 print_line_cursor#0 ] ( main:3::end:22::print_ln:51 [ print_char_cursor#28 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement [65] if(print_line_cursor#0<print_char_cursor#28) goto print_ln::@1 [ print_char_cursor#28 print_line_cursor#0 ] ( main:3::end:22::print_ln:51 [ print_char_cursor#28 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement [68] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::b#2 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a
Statement [71] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#28 print_uchar::$2 ] ( main:3::end:22::print_uint:49::print_uchar:58 [ print_uint::w#0 print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } main:3::end:22::print_uint:49::print_uchar:60 [ print_char_cursor#28 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#3 } { print_char_cursor#27 = print_char_cursor#28 } } ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::c#8 main::c#2 ] : zp[1]:2 , reg byte x ,
Potential registers zp[2]:3 [ main::i#3 main::i#2 ] : zp[2]:3 ,
Potential registers zp[1]:2 [ main::c#7 main::c#1 ] : zp[1]:2 , reg byte x ,
Potential registers zp[2]:3 [ main::i#2 main::i#1 ] : zp[2]:3 ,
Potential registers zp[2]:5 [ free_#24 free_#14 ] : zp[2]:5 ,
Potential registers zp[2]:7 [ root#22 root#12 ] : zp[2]:7 ,
Potential registers zp[2]:9 [ sum::current#3 sum::current#1 sum::current#2 ] : zp[2]:9 ,
@ -1441,7 +1425,7 @@ Uplift Scope [] 114,407.7: zp[2]:14 [ print_char_cursor#27 print_char_cursor#48
Uplift Scope [print_char] 160,310: zp[1]:13 [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplift Scope [print_uchar] 20,002: zp[1]:41 [ print_uchar::$0 ] 20,002: zp[1]:42 [ print_uchar::$2 ] 9,505: zp[1]:18 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Uplift Scope [prepend] 6,667.33: zp[2]:29 [ prepend::new#1 ] 1,833.67: zp[2]:21 [ prepend::x#0 ]
Uplift Scope [main] 2,502.5: zp[2]:3 [ main::i#3 main::i#2 ] 168.33: zp[1]:2 [ main::c#8 main::c#2 ] 101: zp[2]:25 [ main::$5 ]
Uplift Scope [main] 2,502.5: zp[2]:3 [ main::i#2 main::i#1 ] 168.33: zp[1]:2 [ main::c#7 main::c#1 ] 101: zp[2]:25 [ main::$5 ]
Uplift Scope [print_uint] 701: zp[2]:35 [ print_uint::w#0 ]
Uplift Scope [RADIX]
Uplift Scope [print_ln]
@ -1459,7 +1443,7 @@ Uplifting [] best 18498 combination zp[2]:14 [ print_char_cursor#27 print_char_c
Uplifting [print_char] best 18459 combination reg byte a [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplifting [print_uchar] best 18441 combination reg byte a [ print_uchar::$0 ] reg byte x [ print_uchar::$2 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Uplifting [prepend] best 18441 combination zp[2]:29 [ prepend::new#1 ] zp[2]:21 [ prepend::x#0 ]
Uplifting [main] best 18351 combination zp[2]:3 [ main::i#3 main::i#2 ] reg byte x [ main::c#8 main::c#2 ] zp[2]:25 [ main::$5 ]
Uplifting [main] best 18351 combination zp[2]:3 [ main::i#2 main::i#1 ] reg byte x [ main::c#7 main::c#1 ] zp[2]:25 [ main::$5 ]
Uplifting [print_uint] best 18351 combination zp[2]:35 [ print_uint::w#0 ]
Uplifting [RADIX] best 18351 combination
Uplifting [print_ln] best 18351 combination
@ -1470,7 +1454,7 @@ Uplifting [start] best 18351 combination
Uplifting [end] best 18351 combination
Uplifting [node] best 18351 combination
Uplifting [__start] best 18351 combination
Coalescing zero page register [ zp[2]:3 [ main::i#3 main::i#2 ] ] with [ zp[2]:21 [ prepend::x#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:3 [ main::i#2 main::i#1 ] ] with [ zp[2]:21 [ prepend::x#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:7 [ root#22 root#12 ] ] with [ zp[2]:9 [ sum::current#3 sum::current#1 sum::current#2 ] ] - score: 1
Coalescing zero page register [ zp[2]:11 [ sum::s#3 sum::s#2 ] ] with [ zp[2]:23 [ sum::return#2 ] ] - score: 1
Coalescing zero page register [ zp[2]:27 [ alloc::return#2 ] ] with [ zp[2]:29 [ prepend::new#1 ] ] - score: 1
@ -1479,12 +1463,12 @@ Coalescing zero page register [ zp[2]:33 [ Ticks#1 ] ] with [ zp[2]:35 [ print_u
Coalescing zero page register [ zp[2]:11 [ sum::s#3 sum::s#2 sum::return#2 ] ] with [ zp[2]:25 [ main::$5 ] ] - score: 1
Coalescing zero page register [ zp[2]:27 [ alloc::return#2 prepend::new#1 alloc::return#0 ] ] with [ zp[2]:37 [ alloc::$1 ] ] - score: 1
Coalescing zero page register [ zp[2]:11 [ sum::s#3 sum::s#2 sum::return#2 main::$5 ] ] with [ zp[2]:5 [ free_#24 free_#14 ] ]
Coalescing zero page register [ zp[2]:16 [ print_line_cursor#9 print_line_cursor#0 ] ] with [ zp[2]:3 [ main::i#3 main::i#2 prepend::x#0 ] ]
Coalescing zero page register [ zp[2]:16 [ print_line_cursor#9 print_line_cursor#0 ] ] with [ zp[2]:3 [ main::i#2 main::i#1 prepend::x#0 ] ]
Coalescing zero page register [ zp[2]:31 [ Ticks#0 ] ] with [ zp[2]:27 [ alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ] ]
Allocated (was zp[2]:7) zp[2]:2 [ root#22 root#12 sum::current#3 sum::current#1 sum::current#2 ]
Allocated (was zp[2]:11) zp[2]:4 [ sum::s#3 sum::s#2 sum::return#2 main::$5 free_#24 free_#14 ]
Allocated (was zp[2]:14) zp[2]:6 [ print_char_cursor#27 print_char_cursor#48 print_char_cursor#28 ]
Allocated (was zp[2]:16) zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#3 main::i#2 prepend::x#0 ]
Allocated (was zp[2]:16) zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#2 main::i#1 prepend::x#0 ]
Allocated (was zp[2]:19) zp[2]:10 [ last_time ]
Allocated (was zp[2]:31) zp[2]:12 [ Ticks#0 alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ]
Allocated (was zp[2]:33) zp[2]:14 [ Ticks#1 print_uint::w#0 ]
@ -1546,7 +1530,7 @@ main: {
jsr start
// [7] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [7] phi main::c#8 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
// [7] phi main::c#7 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
// [7] phi print_char_cursor#48 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1
lda #<print_screen
@ -1556,7 +1540,7 @@ main: {
jmp __b1
// [7] phi from main::@7 to main::@1 [phi:main::@7->main::@1]
__b1_from___b7:
// [7] phi main::c#8 = main::c#2 [phi:main::@7->main::@1#0] -- register_copy
// [7] phi main::c#7 = main::c#1 [phi:main::@7->main::@1#0] -- register_copy
// [7] phi print_char_cursor#48 = print_char_cursor#28 [phi:main::@7->main::@1#1] -- register_copy
jmp __b1
// main::@1
@ -1573,7 +1557,7 @@ main: {
sta.z free_
lda #>0
sta.z free_+1
// [8] phi main::i#3 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vbuc1
// [8] phi main::i#2 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vwuc1
lda #<0
sta.z i
lda #>0
@ -1583,11 +1567,11 @@ main: {
__b2_from___b5:
// [8] phi root#22 = root#12 [phi:main::@5->main::@2#0] -- register_copy
// [8] phi free_#24 = free_#14 [phi:main::@5->main::@2#1] -- register_copy
// [8] phi main::i#3 = main::i#2 [phi:main::@5->main::@2#2] -- register_copy
// [8] phi main::i#2 = main::i#1 [phi:main::@5->main::@2#2] -- register_copy
jmp __b2
// main::@2
__b2:
// [9] prepend::x#0 = main::i#3
// [9] prepend::x#0 = main::i#2
// [10] call prepend
// [26] phi from main::@2 to prepend [phi:main::@2->prepend]
prepend_from___b2:
@ -1595,12 +1579,12 @@ main: {
jmp __b5
// main::@5
__b5:
// [11] main::i#2 = ++ main::i#3 -- vwuz1=_inc_vwuz1
// [11] main::i#1 = ++ main::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [12] if(main::i#2!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1
// [12] if(main::i#1!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1
lda.z i+1
cmp #>$bb8
bne __b2_from___b5
@ -1630,9 +1614,9 @@ main: {
jmp __b7
// main::@7
__b7:
// [19] main::c#2 = ++ main::c#8 -- vbuxx=_inc_vbuxx
// [19] main::c#1 = ++ main::c#7 -- vbuxx=_inc_vbuxx
inx
// [20] if(main::c#2!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
// [20] if(main::c#1!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #5
bne __b1_from___b7
// [21] phi from main::@7 to main::@4 [phi:main::@7->main::@4]
@ -2077,11 +2061,11 @@ volatile word last_time loadstore zp[2]:10 18.454545454545453
void main()
word~ main::$5 zp[2]:4 101.0
byte main::c
byte main::c#2 reg byte x 151.5
byte main::c#8 reg byte x 16.833333333333332
byte main::c#1 reg byte x 151.5
byte main::c#7 reg byte x 16.833333333333332
word main::i
word main::i#2 i zp[2]:8 1501.5
word main::i#3 i zp[2]:8 1001.0
word main::i#1 i zp[2]:8 1501.5
word main::i#2 i zp[2]:8 1001.0
void prepend(word prepend::x)
struct node* prepend::new
struct node* prepend::new#1 new zp[2]:12 6667.333333333333
@ -2130,12 +2114,12 @@ word sum::s
word sum::s#2 s zp[2]:4 100001.0
word sum::s#3 s zp[2]:4 50025.75
reg byte x [ main::c#8 main::c#2 ]
reg byte x [ main::c#7 main::c#1 ]
zp[2]:2 [ root#22 root#12 sum::current#3 sum::current#1 sum::current#2 ]
zp[2]:4 [ sum::s#3 sum::s#2 sum::return#2 main::$5 free_#24 free_#14 ]
reg byte a [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
zp[2]:6 [ print_char_cursor#27 print_char_cursor#48 print_char_cursor#28 ]
zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#3 main::i#2 prepend::x#0 ]
zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#2 main::i#1 prepend::x#0 ]
reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
zp[2]:10 [ last_time ]
zp[2]:12 [ Ticks#0 alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ]
@ -2195,7 +2179,7 @@ main: {
// [6] call start
jsr start
// [7] phi from main to main::@1 [phi:main->main::@1]
// [7] phi main::c#8 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
// [7] phi main::c#7 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
// [7] phi print_char_cursor#48 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1
lda #<print_screen
@ -2203,7 +2187,7 @@ main: {
lda #>print_screen
sta.z print_char_cursor+1
// [7] phi from main::@7 to main::@1 [phi:main::@7->main::@1]
// [7] phi main::c#8 = main::c#2 [phi:main::@7->main::@1#0] -- register_copy
// [7] phi main::c#7 = main::c#1 [phi:main::@7->main::@1#0] -- register_copy
// [7] phi print_char_cursor#48 = print_char_cursor#28 [phi:main::@7->main::@1#1] -- register_copy
// main::@1
__b1:
@ -2215,28 +2199,28 @@ main: {
// [8] phi free_#24 = 0 [phi:main::@1->main::@2#1] -- vwuz1=vbuc1
sta.z free_
sta.z free_+1
// [8] phi main::i#3 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vbuc1
// [8] phi main::i#2 = 0 [phi:main::@1->main::@2#2] -- vwuz1=vwuc1
sta.z i
sta.z i+1
// [8] phi from main::@5 to main::@2 [phi:main::@5->main::@2]
// [8] phi root#22 = root#12 [phi:main::@5->main::@2#0] -- register_copy
// [8] phi free_#24 = free_#14 [phi:main::@5->main::@2#1] -- register_copy
// [8] phi main::i#3 = main::i#2 [phi:main::@5->main::@2#2] -- register_copy
// [8] phi main::i#2 = main::i#1 [phi:main::@5->main::@2#2] -- register_copy
// main::@2
__b2:
// prepend(i)
// [9] prepend::x#0 = main::i#3
// [9] prepend::x#0 = main::i#2
// [10] call prepend
// [26] phi from main::@2 to prepend [phi:main::@2->prepend]
jsr prepend
// main::@5
// for(i : 0..2999)
// [11] main::i#2 = ++ main::i#3 -- vwuz1=_inc_vwuz1
// for(unsigned int i : 0..2999)
// [11] main::i#1 = ++ main::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [12] if(main::i#2!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1
// [12] if(main::i#1!=$bb8) goto main::@2 -- vwuz1_neq_vwuc1_then_la1
lda.z i+1
cmp #>$bb8
bne __b2
@ -2260,10 +2244,10 @@ main: {
// [40] phi print_char::ch#3 = print_char::ch#2 [phi:main::@6->print_char#1] -- register_copy
jsr print_char
// main::@7
// for(c : 0..4)
// [19] main::c#2 = ++ main::c#8 -- vbuxx=_inc_vbuxx
// for(unsigned char c : 0..4)
// [19] main::c#1 = ++ main::c#7 -- vbuxx=_inc_vbuxx
inx
// [20] if(main::c#2!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
// [20] if(main::c#1!=5) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #5
bne __b1
// [21] phi from main::@7 to main::@4 [phi:main::@7->main::@4]

View File

@ -22,11 +22,11 @@ volatile word last_time loadstore zp[2]:10 18.454545454545453
void main()
word~ main::$5 zp[2]:4 101.0
byte main::c
byte main::c#2 reg byte x 151.5
byte main::c#8 reg byte x 16.833333333333332
byte main::c#1 reg byte x 151.5
byte main::c#7 reg byte x 16.833333333333332
word main::i
word main::i#2 i zp[2]:8 1501.5
word main::i#3 i zp[2]:8 1001.0
word main::i#1 i zp[2]:8 1501.5
word main::i#2 i zp[2]:8 1001.0
void prepend(word prepend::x)
struct node* prepend::new
struct node* prepend::new#1 new zp[2]:12 6667.333333333333
@ -75,12 +75,12 @@ word sum::s
word sum::s#2 s zp[2]:4 100001.0
word sum::s#3 s zp[2]:4 50025.75
reg byte x [ main::c#8 main::c#2 ]
reg byte x [ main::c#7 main::c#1 ]
zp[2]:2 [ root#22 root#12 sum::current#3 sum::current#1 sum::current#2 ]
zp[2]:4 [ sum::s#3 sum::s#2 sum::return#2 main::$5 free_#24 free_#14 ]
reg byte a [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
zp[2]:6 [ print_char_cursor#27 print_char_cursor#48 print_char_cursor#28 ]
zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#3 main::i#2 prepend::x#0 ]
zp[2]:8 [ print_line_cursor#9 print_line_cursor#0 main::i#2 main::i#1 prepend::x#0 ]
reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
zp[2]:10 [ last_time ]
zp[2]:12 [ Ticks#0 alloc::return#2 prepend::new#1 alloc::return#0 alloc::$1 ]