CONTROL FLOW GRAPH SSA @begin: scope:[] from to:@1 (void()) main() main: scope:[main] from @1 (byte) main::idx#0 ← (byte) 0 (byte) main::a#0 ← (byte) 0 to:main::@1 main::@1: scope:[main] from main main::@3 (byte) main::idx#3 ← phi( main/(byte) main::idx#0 main::@3/(byte) main::idx#4 ) (byte) main::a#4 ← phi( main/(byte) main::a#0 main::@3/(byte) main::a#1 ) (byte) main::b#0 ← (byte) 0 to:main::@2 main::@2: scope:[main] from main::@1 main::@2 (byte) main::idx#2 ← phi( main::@1/(byte) main::idx#3 main::@2/(byte) main::idx#1 ) (byte) main::b#2 ← phi( main::@1/(byte) main::b#0 main::@2/(byte) main::b#1 ) (byte) main::a#2 ← phi( main::@1/(byte) main::a#4 main::@2/(byte) main::a#2 ) (byte) main::c#0 ← (byte) main::a#2 (byte) main::d#0 ← (byte) main::b#2 (byte~) main::$0 ← (byte) main::b#2 + (byte) main::c#0 (byte) main::e#0 ← (byte~) main::$0 (byte~) main::$1 ← (byte) main::d#0 + (byte) main::a#2 (byte) main::f#0 ← (byte~) main::$1 (byte~) main::$2 ← (byte) main::e#0 + (byte) main::f#0 (byte) main::g#0 ← (byte~) main::$2 *((const nomodify byte*) main::SCREEN + (byte) main::idx#2) ← (byte) main::g#0 (byte) main::idx#1 ← ++ (byte) main::idx#2 (byte) main::b#1 ← (byte) main::b#2 + rangenext(0,5) (bool~) main::$3 ← (byte) main::b#1 != rangelast(0,5) if((bool~) main::$3) goto main::@2 to:main::@3 main::@3: scope:[main] from main::@2 (byte) main::idx#4 ← phi( main::@2/(byte) main::idx#1 ) (byte) main::a#3 ← phi( main::@2/(byte) main::a#2 ) (byte) main::a#1 ← (byte) main::a#3 + rangenext(0,5) (bool~) main::$4 ← (byte) main::a#1 != rangelast(0,5) if((bool~) main::$4) goto main::@1 to:main::@return main::@return: scope:[main] from main::@3 return to:@return @1: scope:[] from @begin call main to:@2 @2: scope:[] from @1 to:@end @end: scope:[] from @2 SYMBOL TABLE SSA (label) @1 (label) @2 (label) @begin (label) @end (void()) main() (byte~) main::$0 (byte~) main::$1 (byte~) main::$2 (bool~) main::$3 (bool~) main::$4 (label) main::@1 (label) main::@2 (label) main::@3 (label) main::@return (const nomodify byte*) main::SCREEN = (byte*)(number) $400 (byte) main::a (byte) main::a#0 (byte) main::a#1 (byte) main::a#2 (byte) main::a#3 (byte) main::a#4 (byte) main::b (byte) main::b#0 (byte) main::b#1 (byte) main::b#2 (byte) main::c (byte) main::c#0 (byte) main::d (byte) main::d#0 (byte) main::e (byte) main::e#0 (byte) main::f (byte) main::f#0 (byte) main::g (byte) main::g#0 (byte) main::idx (byte) main::idx#0 (byte) main::idx#1 (byte) main::idx#2 (byte) main::idx#3 (byte) main::idx#4 Simplifying constant pointer cast (byte*) 1024 Successful SSA optimization PassNCastSimplification Alias main::a#2 = main::c#0 main::a#3 Alias main::d#0 = main::b#2 Alias main::e#0 = main::$0 Alias main::f#0 = main::$1 Alias main::g#0 = main::$2 Alias main::idx#1 = main::idx#4 Successful SSA optimization Pass2AliasElimination Identical Phi Values (byte) main::a#2 (byte) main::a#4 Successful SSA optimization Pass2IdenticalPhiElimination Simple Condition (bool~) main::$3 [12] if((byte) main::b#1!=rangelast(0,5)) goto main::@2 Simple Condition (bool~) main::$4 [15] if((byte) main::a#1!=rangelast(0,5)) goto main::@1 Successful SSA optimization Pass2ConditionalJumpSimplification Constant (const byte) main::idx#0 = 0 Constant (const byte) main::a#0 = 0 Constant (const byte) main::b#0 = 0 Successful SSA optimization Pass2ConstantIdentification Resolved ranged next value [10] main::b#1 ← ++ main::d#0 to ++ Resolved ranged comparison value [12] if(main::b#1!=rangelast(0,5)) goto main::@2 to (number) 6 Resolved ranged next value [13] main::a#1 ← ++ main::a#4 to ++ Resolved ranged comparison value [15] if(main::a#1!=rangelast(0,5)) goto main::@1 to (number) 6 Adding number conversion cast (unumber) 6 in if((byte) main::b#1!=(number) 6) goto main::@2 Adding number conversion cast (unumber) 6 in if((byte) main::a#1!=(number) 6) goto main::@1 Successful SSA optimization PassNAddNumberTypeConversions Simplifying constant integer cast 6 Simplifying constant integer cast 6 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (byte) 6 Finalized unsigned number type (byte) 6 Successful SSA optimization PassNFinalizeNumberTypeConversions Inlining constant with var siblings (const byte) main::idx#0 Inlining constant with var siblings (const byte) main::a#0 Inlining constant with var siblings (const byte) main::b#0 Constant inlined main::a#0 = (byte) 0 Constant inlined main::idx#0 = (byte) 0 Constant inlined main::b#0 = (byte) 0 Successful SSA optimization Pass2ConstantInlining Added new block during phi lifting main::@4(between main::@3 and main::@1) Added new block during phi lifting main::@5(between main::@2 and main::@2) Adding NOP phi() at start of @begin Adding NOP phi() at start of @1 Adding NOP phi() at start of @2 Adding NOP phi() at start of @end Adding NOP phi() at start of main CALL GRAPH Calls in [] to main:2 Created 4 initial phi equivalence classes Coalesced [7] main::idx#6 ← main::idx#3 Coalesced [19] main::a#5 ← main::a#1 Coalesced [20] main::idx#5 ← main::idx#1 Coalesced [21] main::d#1 ← main::b#1 Coalesced (already) [22] main::idx#7 ← main::idx#1 Coalesced down to 3 phi equivalence classes Culled Empty Block (label) @2 Culled Empty Block (label) main::@4 Culled Empty Block (label) main::@5 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 FINAL CONTROL FLOW GRAPH @begin: scope:[] from [0] phi() to:@1 @1: scope:[] from @begin [1] phi() [2] call main to:@end @end: scope:[] from @1 [3] phi() (void()) main() main: scope:[main] from @1 [4] phi() to:main::@1 main::@1: scope:[main] from main main::@3 [5] (byte) main::idx#3 ← phi( main/(byte) 0 main::@3/(byte) main::idx#1 ) [5] (byte) main::a#4 ← phi( main/(byte) 0 main::@3/(byte) main::a#1 ) to:main::@2 main::@2: scope:[main] from main::@1 main::@2 [6] (byte) main::idx#2 ← phi( main::@1/(byte) main::idx#3 main::@2/(byte) main::idx#1 ) [6] (byte) main::d#0 ← phi( main::@1/(byte) 0 main::@2/(byte) main::b#1 ) [7] (byte) main::e#0 ← (byte) main::d#0 + (byte) main::a#4 [8] (byte) main::f#0 ← (byte) main::d#0 + (byte) main::a#4 [9] (byte) main::g#0 ← (byte) main::e#0 + (byte) main::f#0 [10] *((const nomodify byte*) main::SCREEN + (byte) main::idx#2) ← (byte) main::g#0 [11] (byte) main::idx#1 ← ++ (byte) main::idx#2 [12] (byte) main::b#1 ← ++ (byte) main::d#0 [13] if((byte) main::b#1!=(byte) 6) goto main::@2 to:main::@3 main::@3: scope:[main] from main::@2 [14] (byte) main::a#1 ← ++ (byte) main::a#4 [15] if((byte) main::a#1!=(byte) 6) goto main::@1 to:main::@return main::@return: scope:[main] from main::@3 [16] return to:@return VARIABLE REGISTER WEIGHTS (void()) main() (byte) main::a (byte) main::a#1 151.5 (byte) main::a#4 244.8888888888889 (byte) main::b (byte) main::b#1 1501.5 (byte) main::c (byte) main::d (byte) main::d#0 667.3333333333334 (byte) main::e (byte) main::e#0 1001.0 (byte) main::f (byte) main::f#0 2002.0 (byte) main::g (byte) main::g#0 2002.0 (byte) main::idx (byte) main::idx#1 420.59999999999997 (byte) main::idx#2 620.8 (byte) main::idx#3 202.0 Initial phi equivalence classes [ main::a#4 main::a#1 ] [ main::d#0 main::b#1 ] [ main::idx#2 main::idx#3 main::idx#1 ] Added variable main::e#0 to live range equivalence class [ main::e#0 ] Added variable main::f#0 to live range equivalence class [ main::f#0 ] Added variable main::g#0 to live range equivalence class [ main::g#0 ] Complete equivalence classes [ main::a#4 main::a#1 ] [ main::d#0 main::b#1 ] [ main::idx#2 main::idx#3 main::idx#1 ] [ main::e#0 ] [ main::f#0 ] [ main::g#0 ] Allocated zp[1]:2 [ main::a#4 main::a#1 ] Allocated zp[1]:3 [ main::d#0 main::b#1 ] Allocated zp[1]:4 [ main::idx#2 main::idx#3 main::idx#1 ] Allocated zp[1]:5 [ main::e#0 ] Allocated zp[1]:6 [ main::f#0 ] Allocated zp[1]:7 [ main::g#0 ] INITIAL ASM Target platform is c64basic / MOS6502X // File Comments // Tests variable coalescing over assignments // Upstart .pc = $801 "Basic" :BasicUpstart(main) .pc = $80d "Program" // Global Constants & labels // @begin __bbegin: // [1] phi from @begin to @1 [phi:@begin->@1] __b1_from___bbegin: jmp __b1 // @1 __b1: // [2] call main // [4] phi from @1 to main [phi:@1->main] main_from___b1: jsr main // [3] phi from @1 to @end [phi:@1->@end] __bend_from___b1: jmp __bend // @end __bend: // main main: { .label SCREEN = $400 .label d = 3 .label e = 5 .label f = 6 .label g = 7 .label idx = 4 .label b = 3 .label a = 2 // [5] phi from main to main::@1 [phi:main->main::@1] __b1_from_main: // [5] phi (byte) main::idx#3 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 lda #0 sta.z idx // [5] phi (byte) main::a#4 = (byte) 0 [phi:main->main::@1#1] -- vbuz1=vbuc1 lda #0 sta.z a jmp __b1 // [5] phi from main::@3 to main::@1 [phi:main::@3->main::@1] __b1_from___b3: // [5] phi (byte) main::idx#3 = (byte) main::idx#1 [phi:main::@3->main::@1#0] -- register_copy // [5] phi (byte) main::a#4 = (byte) main::a#1 [phi:main::@3->main::@1#1] -- register_copy jmp __b1 // main::@1 __b1: // [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2] __b2_from___b1: // [6] phi (byte) main::idx#2 = (byte) main::idx#3 [phi:main::@1->main::@2#0] -- register_copy // [6] phi (byte) main::d#0 = (byte) 0 [phi:main::@1->main::@2#1] -- vbuz1=vbuc1 lda #0 sta.z d jmp __b2 // [6] phi from main::@2 to main::@2 [phi:main::@2->main::@2] __b2_from___b2: // [6] phi (byte) main::idx#2 = (byte) main::idx#1 [phi:main::@2->main::@2#0] -- register_copy // [6] phi (byte) main::d#0 = (byte) main::b#1 [phi:main::@2->main::@2#1] -- register_copy jmp __b2 // main::@2 __b2: // [7] (byte) main::e#0 ← (byte) main::d#0 + (byte) main::a#4 -- vbuz1=vbuz2_plus_vbuz3 lda.z d clc adc.z a sta.z e // [8] (byte) main::f#0 ← (byte) main::d#0 + (byte) main::a#4 -- vbuz1=vbuz2_plus_vbuz3 lda.z d clc adc.z a sta.z f // [9] (byte) main::g#0 ← (byte) main::e#0 + (byte) main::f#0 -- vbuz1=vbuz2_plus_vbuz3 lda.z e clc adc.z f sta.z g // [10] *((const nomodify byte*) main::SCREEN + (byte) main::idx#2) ← (byte) main::g#0 -- pbuc1_derefidx_vbuz1=vbuz2 lda.z g ldy.z idx sta SCREEN,y // [11] (byte) main::idx#1 ← ++ (byte) main::idx#2 -- vbuz1=_inc_vbuz1 inc.z idx // [12] (byte) main::b#1 ← ++ (byte) main::d#0 -- vbuz1=_inc_vbuz1 inc.z b // [13] if((byte) main::b#1!=(byte) 6) goto main::@2 -- vbuz1_neq_vbuc1_then_la1 lda #6 cmp.z b bne __b2_from___b2 jmp __b3 // main::@3 __b3: // [14] (byte) main::a#1 ← ++ (byte) main::a#4 -- vbuz1=_inc_vbuz1 inc.z a // [15] if((byte) main::a#1!=(byte) 6) goto main::@1 -- vbuz1_neq_vbuc1_then_la1 lda #6 cmp.z a bne __b1_from___b3 jmp __breturn // main::@return __breturn: // [16] return rts } // File Data REGISTER UPLIFT POTENTIAL REGISTERS Statement [7] (byte) main::e#0 ← (byte) main::d#0 + (byte) main::a#4 [ main::a#4 main::d#0 main::idx#2 main::e#0 ] ( main:2 [ main::a#4 main::d#0 main::idx#2 main::e#0 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::a#4 main::a#1 ] Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::d#0 main::b#1 ] Removing always clobbered register reg byte a as potential for zp[1]:4 [ main::idx#2 main::idx#3 main::idx#1 ] Statement [8] (byte) main::f#0 ← (byte) main::d#0 + (byte) main::a#4 [ main::a#4 main::d#0 main::idx#2 main::e#0 main::f#0 ] ( main:2 [ main::a#4 main::d#0 main::idx#2 main::e#0 main::f#0 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:5 [ main::e#0 ] Statement [9] (byte) main::g#0 ← (byte) main::e#0 + (byte) main::f#0 [ main::a#4 main::d#0 main::idx#2 main::g#0 ] ( main:2 [ main::a#4 main::d#0 main::idx#2 main::g#0 ] { } ) always clobbers reg byte a Statement [7] (byte) main::e#0 ← (byte) main::d#0 + (byte) main::a#4 [ main::a#4 main::d#0 main::idx#2 main::e#0 ] ( main:2 [ main::a#4 main::d#0 main::idx#2 main::e#0 ] { } ) always clobbers reg byte a Statement [8] (byte) main::f#0 ← (byte) main::d#0 + (byte) main::a#4 [ main::a#4 main::d#0 main::idx#2 main::e#0 main::f#0 ] ( main:2 [ main::a#4 main::d#0 main::idx#2 main::e#0 main::f#0 ] { } ) always clobbers reg byte a Statement [9] (byte) main::g#0 ← (byte) main::e#0 + (byte) main::f#0 [ main::a#4 main::d#0 main::idx#2 main::g#0 ] ( main:2 [ main::a#4 main::d#0 main::idx#2 main::g#0 ] { } ) always clobbers reg byte a Potential registers zp[1]:2 [ main::a#4 main::a#1 ] : zp[1]:2 , reg byte x , reg byte y , Potential registers zp[1]:3 [ main::d#0 main::b#1 ] : zp[1]:3 , reg byte x , reg byte y , Potential registers zp[1]:4 [ main::idx#2 main::idx#3 main::idx#1 ] : zp[1]:4 , reg byte x , reg byte y , Potential registers zp[1]:5 [ main::e#0 ] : zp[1]:5 , reg byte x , reg byte y , Potential registers zp[1]:6 [ main::f#0 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:7 [ main::g#0 ] : zp[1]:7 , reg byte a , reg byte x , reg byte y , REGISTER UPLIFT SCOPES Uplift Scope [main] 2,168.83: zp[1]:3 [ main::d#0 main::b#1 ] 2,002: zp[1]:6 [ main::f#0 ] 2,002: zp[1]:7 [ main::g#0 ] 1,243.4: zp[1]:4 [ main::idx#2 main::idx#3 main::idx#1 ] 1,001: zp[1]:5 [ main::e#0 ] 396.39: zp[1]:2 [ main::a#4 main::a#1 ] Uplift Scope [] Uplifting [main] best 4953 combination reg byte y [ main::d#0 main::b#1 ] reg byte a [ main::f#0 ] reg byte a [ main::g#0 ] reg byte x [ main::idx#2 main::idx#3 main::idx#1 ] zp[1]:5 [ main::e#0 ] zp[1]:2 [ main::a#4 main::a#1 ] Limited combination testing to 100 combinations of 1296 possible. Uplifting [] best 4953 combination Attempting to uplift remaining variables inzp[1]:5 [ main::e#0 ] Uplifting [main] best 4953 combination zp[1]:5 [ main::e#0 ] Attempting to uplift remaining variables inzp[1]:2 [ main::a#4 main::a#1 ] Uplifting [main] best 4953 combination zp[1]:2 [ main::a#4 main::a#1 ] Allocated (was zp[1]:5) zp[1]:3 [ main::e#0 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments // Tests variable coalescing over assignments // Upstart .pc = $801 "Basic" :BasicUpstart(main) .pc = $80d "Program" // Global Constants & labels // @begin __bbegin: // [1] phi from @begin to @1 [phi:@begin->@1] __b1_from___bbegin: jmp __b1 // @1 __b1: // [2] call main // [4] phi from @1 to main [phi:@1->main] main_from___b1: jsr main // [3] phi from @1 to @end [phi:@1->@end] __bend_from___b1: jmp __bend // @end __bend: // main main: { .label SCREEN = $400 .label e = 3 .label a = 2 // [5] phi from main to main::@1 [phi:main->main::@1] __b1_from_main: // [5] phi (byte) main::idx#3 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 ldx #0 // [5] phi (byte) main::a#4 = (byte) 0 [phi:main->main::@1#1] -- vbuz1=vbuc1 lda #0 sta.z a jmp __b1 // [5] phi from main::@3 to main::@1 [phi:main::@3->main::@1] __b1_from___b3: // [5] phi (byte) main::idx#3 = (byte) main::idx#1 [phi:main::@3->main::@1#0] -- register_copy // [5] phi (byte) main::a#4 = (byte) main::a#1 [phi:main::@3->main::@1#1] -- register_copy jmp __b1 // main::@1 __b1: // [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2] __b2_from___b1: // [6] phi (byte) main::idx#2 = (byte) main::idx#3 [phi:main::@1->main::@2#0] -- register_copy // [6] phi (byte) main::d#0 = (byte) 0 [phi:main::@1->main::@2#1] -- vbuyy=vbuc1 ldy #0 jmp __b2 // [6] phi from main::@2 to main::@2 [phi:main::@2->main::@2] __b2_from___b2: // [6] phi (byte) main::idx#2 = (byte) main::idx#1 [phi:main::@2->main::@2#0] -- register_copy // [6] phi (byte) main::d#0 = (byte) main::b#1 [phi:main::@2->main::@2#1] -- register_copy jmp __b2 // main::@2 __b2: // [7] (byte) main::e#0 ← (byte) main::d#0 + (byte) main::a#4 -- vbuz1=vbuyy_plus_vbuz2 tya clc adc.z a sta.z e // [8] (byte) main::f#0 ← (byte) main::d#0 + (byte) main::a#4 -- vbuaa=vbuyy_plus_vbuz1 tya clc adc.z a // [9] (byte) main::g#0 ← (byte) main::e#0 + (byte) main::f#0 -- vbuaa=vbuz1_plus_vbuaa clc adc.z e // [10] *((const nomodify byte*) main::SCREEN + (byte) main::idx#2) ← (byte) main::g#0 -- pbuc1_derefidx_vbuxx=vbuaa sta SCREEN,x // [11] (byte) main::idx#1 ← ++ (byte) main::idx#2 -- vbuxx=_inc_vbuxx inx // [12] (byte) main::b#1 ← ++ (byte) main::d#0 -- vbuyy=_inc_vbuyy iny // [13] if((byte) main::b#1!=(byte) 6) goto main::@2 -- vbuyy_neq_vbuc1_then_la1 cpy #6 bne __b2_from___b2 jmp __b3 // main::@3 __b3: // [14] (byte) main::a#1 ← ++ (byte) main::a#4 -- vbuz1=_inc_vbuz1 inc.z a // [15] if((byte) main::a#1!=(byte) 6) goto main::@1 -- vbuz1_neq_vbuc1_then_la1 lda #6 cmp.z a bne __b1_from___b3 jmp __breturn // main::@return __breturn: // [16] return rts } // File Data ASSEMBLER OPTIMIZATIONS Removing instruction jmp __b1 Removing instruction jmp __bend Removing instruction jmp __b1 Removing instruction jmp __b2 Removing instruction jmp __b3 Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination Replacing instruction lda #0 with TXA Replacing label __b2_from___b2 with __b2 Replacing label __b1_from___b3 with __b1 Removing instruction __b1_from___bbegin: Removing instruction __b1: Removing instruction main_from___b1: Removing instruction __bend_from___b1: Removing instruction __b1_from___b3: Removing instruction __b2_from___b1: Removing instruction __b2_from___b2: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction __bbegin: Removing instruction __bend: Removing instruction __b1_from_main: Removing instruction __b3: Removing instruction __breturn: Succesful ASM optimization Pass5UnusedLabelElimination Removing instruction jsr main Succesful ASM optimization Pass5SkipBegin Removing instruction jmp __b1 Removing instruction jmp __b2 Succesful ASM optimization Pass5NextJumpElimination FINAL SYMBOL TABLE (label) @1 (label) @begin (label) @end (void()) main() (label) main::@1 (label) main::@2 (label) main::@3 (label) main::@return (const nomodify byte*) main::SCREEN = (byte*) 1024 (byte) main::a (byte) main::a#1 a zp[1]:2 151.5 (byte) main::a#4 a zp[1]:2 244.8888888888889 (byte) main::b (byte) main::b#1 reg byte y 1501.5 (byte) main::c (byte) main::d (byte) main::d#0 reg byte y 667.3333333333334 (byte) main::e (byte) main::e#0 e zp[1]:3 1001.0 (byte) main::f (byte) main::f#0 reg byte a 2002.0 (byte) main::g (byte) main::g#0 reg byte a 2002.0 (byte) main::idx (byte) main::idx#1 reg byte x 420.59999999999997 (byte) main::idx#2 reg byte x 620.8 (byte) main::idx#3 reg byte x 202.0 zp[1]:2 [ main::a#4 main::a#1 ] reg byte y [ main::d#0 main::b#1 ] reg byte x [ main::idx#2 main::idx#3 main::idx#1 ] zp[1]:3 [ main::e#0 ] reg byte a [ main::f#0 ] reg byte a [ main::g#0 ] FINAL ASSEMBLER Score: 3951 // File Comments // Tests variable coalescing over assignments // Upstart .pc = $801 "Basic" :BasicUpstart(main) .pc = $80d "Program" // Global Constants & labels // @begin // [1] phi from @begin to @1 [phi:@begin->@1] // @1 // [2] call main // [4] phi from @1 to main [phi:@1->main] // [3] phi from @1 to @end [phi:@1->@end] // @end // main main: { .label SCREEN = $400 .label e = 3 .label a = 2 // [5] phi from main to main::@1 [phi:main->main::@1] // [5] phi (byte) main::idx#3 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 ldx #0 // [5] phi (byte) main::a#4 = (byte) 0 [phi:main->main::@1#1] -- vbuz1=vbuc1 txa sta.z a // [5] phi from main::@3 to main::@1 [phi:main::@3->main::@1] // [5] phi (byte) main::idx#3 = (byte) main::idx#1 [phi:main::@3->main::@1#0] -- register_copy // [5] phi (byte) main::a#4 = (byte) main::a#1 [phi:main::@3->main::@1#1] -- register_copy // main::@1 __b1: // [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2] // [6] phi (byte) main::idx#2 = (byte) main::idx#3 [phi:main::@1->main::@2#0] -- register_copy // [6] phi (byte) main::d#0 = (byte) 0 [phi:main::@1->main::@2#1] -- vbuyy=vbuc1 ldy #0 // [6] phi from main::@2 to main::@2 [phi:main::@2->main::@2] // [6] phi (byte) main::idx#2 = (byte) main::idx#1 [phi:main::@2->main::@2#0] -- register_copy // [6] phi (byte) main::d#0 = (byte) main::b#1 [phi:main::@2->main::@2#1] -- register_copy // main::@2 __b2: // e = b+c // [7] (byte) main::e#0 ← (byte) main::d#0 + (byte) main::a#4 -- vbuz1=vbuyy_plus_vbuz2 tya clc adc.z a sta.z e // f = d+a // [8] (byte) main::f#0 ← (byte) main::d#0 + (byte) main::a#4 -- vbuaa=vbuyy_plus_vbuz1 tya clc adc.z a // g = e+f // [9] (byte) main::g#0 ← (byte) main::e#0 + (byte) main::f#0 -- vbuaa=vbuz1_plus_vbuaa clc adc.z e // SCREEN[idx++] = g // [10] *((const nomodify byte*) main::SCREEN + (byte) main::idx#2) ← (byte) main::g#0 -- pbuc1_derefidx_vbuxx=vbuaa sta SCREEN,x // SCREEN[idx++] = g; // [11] (byte) main::idx#1 ← ++ (byte) main::idx#2 -- vbuxx=_inc_vbuxx inx // for( byte b: 0..5) // [12] (byte) main::b#1 ← ++ (byte) main::d#0 -- vbuyy=_inc_vbuyy iny // [13] if((byte) main::b#1!=(byte) 6) goto main::@2 -- vbuyy_neq_vbuc1_then_la1 cpy #6 bne __b2 // main::@3 // for( byte a: 0..5) // [14] (byte) main::a#1 ← ++ (byte) main::a#4 -- vbuz1=_inc_vbuz1 inc.z a // [15] if((byte) main::a#1!=(byte) 6) goto main::@1 -- vbuz1_neq_vbuc1_then_la1 lda #6 cmp.z a bne __b1 // main::@return // } // [16] return rts } // File Data