1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-10-21 17:24:39 +00:00
kickc/src/test/ref/longjump2.log

2147 lines
39 KiB
Plaintext

CONTROL FLOW GRAPH SSA
@begin: scope:[] from
to:@1
(void()) main()
main: scope:[main] from @1
call long1
to:main::@1
main::@1: scope:[main] from main
call long2
to:main::@2
main::@2: scope:[main] from main::@1
to:main::@return
main::@return: scope:[main] from main::@2
return
to:@return
(void()) long1()
long1: scope:[long1] from main
(byte) long1::i#0 ← (byte) 0
to:long1::@1
long1::@1: scope:[long1] from long1 long1::@1
(byte) long1::i#2 ← phi( long1/(byte) long1::i#0 long1::@1/(byte) long1::i#1 )
asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
*((const byte*) long1::SCREEN + (byte) long1::i#2) ← (byte) long1::i#2
(byte) long1::i#1 ← (byte) long1::i#2 + rangenext(0,$a)
(bool~) long1::$0 ← (byte) long1::i#1 != rangelast(0,$a)
if((bool~) long1::$0) goto long1::@1
to:long1::@return
long1::@return: scope:[long1] from long1::@1
return
to:@return
(void()) long2()
long2: scope:[long2] from main::@1
(byte) long2::i#0 ← (byte) 0
to:long2::@1
long2::@1: scope:[long2] from long2 long2::@1
(byte) long2::i#2 ← phi( long2/(byte) long2::i#0 long2::@1/(byte) long2::i#1 )
asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
*((const byte*) long2::SCREEN + (byte) long2::i#2) ← (byte) long2::i#2
(byte) long2::i#1 ← (byte) long2::i#2 + rangenext(0,$a)
(bool~) long2::$0 ← (byte) long2::i#1 != rangelast(0,$a)
if((bool~) long2::$0) goto long2::@1
to:long2::@return
long2::@return: scope:[long2] from long2::@1
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()) long1()
(bool~) long1::$0
(label) long1::@1
(label) long1::@return
(const byte*) long1::SCREEN = (byte*)(number) $400
(byte) long1::i
(byte) long1::i#0
(byte) long1::i#1
(byte) long1::i#2
(void()) long2()
(bool~) long2::$0
(label) long2::@1
(label) long2::@return
(const byte*) long2::SCREEN = (byte*)(number) $400
(byte) long2::i
(byte) long2::i#0
(byte) long2::i#1
(byte) long2::i#2
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@return
Simplifying constant pointer cast (byte*) 1024
Simplifying constant pointer cast (byte*) 1024
Successful SSA optimization PassNCastSimplification
Simple Condition (bool~) long1::$0 [9] if((byte) long1::i#1!=rangelast(0,$a)) goto long1::@1
Simple Condition (bool~) long2::$0 [17] if((byte) long2::i#1!=rangelast(0,$a)) goto long2::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) long1::i#0 = 0
Constant (const byte) long2::i#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [7] long1::i#1 ← ++ long1::i#2 to ++
Resolved ranged comparison value [9] if(long1::i#1!=rangelast(0,$a)) goto long1::@1 to (number) $b
Resolved ranged next value [15] long2::i#1 ← ++ long2::i#2 to ++
Resolved ranged comparison value [17] if(long2::i#1!=rangelast(0,$a)) goto long2::@1 to (number) $b
Adding number conversion cast (unumber) $b in if((byte) long1::i#1!=(number) $b) goto long1::@1
Adding number conversion cast (unumber) $b in if((byte) long2::i#1!=(number) $b) goto long2::@1
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast $b
Simplifying constant integer cast $b
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) $b
Finalized unsigned number type (byte) $b
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inlining constant with var siblings (const byte) long1::i#0
Inlining constant with var siblings (const byte) long2::i#0
Constant inlined long1::i#0 = (byte) 0
Constant inlined long2::i#0 = (byte) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting long1::@2(between long1::@1 and long1::@1)
Added new block during phi lifting long2::@2(between long2::@1 and long2::@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of long2
Adding NOP phi() at start of long1
CALL GRAPH
Calls in [] to main:2
Calls in [main] to long1:6 long2:8
Created 2 initial phi equivalence classes
Coalesced [18] long2::i#3 ← long2::i#1
Coalesced [26] long1::i#3 ← long1::i#1
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) @2
Culled Empty Block (label) main::@2
Culled Empty Block (label) long2::@2
Culled Empty Block (label) long1::@2
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of long2
Adding NOP phi() at start of long1
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()
[5] call long1
to:main::@1
main::@1: scope:[main] from main
[6] phi()
[7] call long2
to:main::@return
main::@return: scope:[main] from main::@1
[8] return
to:@return
(void()) long2()
long2: scope:[long2] from main::@1
[9] phi()
to:long2::@1
long2::@1: scope:[long2] from long2 long2::@1
[10] (byte) long2::i#2 ← phi( long2/(byte) 0 long2::@1/(byte) long2::i#1 )
asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
[12] *((const byte*) long2::SCREEN + (byte) long2::i#2) ← (byte) long2::i#2
[13] (byte) long2::i#1 ← ++ (byte) long2::i#2
[14] if((byte) long2::i#1!=(byte) $b) goto long2::@1
to:long2::@return
long2::@return: scope:[long2] from long2::@1
[15] return
to:@return
(void()) long1()
long1: scope:[long1] from main
[16] phi()
to:long1::@1
long1::@1: scope:[long1] from long1 long1::@1
[17] (byte) long1::i#2 ← phi( long1/(byte) 0 long1::@1/(byte) long1::i#1 )
asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
[19] *((const byte*) long1::SCREEN + (byte) long1::i#2) ← (byte) long1::i#2
[20] (byte) long1::i#1 ← ++ (byte) long1::i#2
[21] if((byte) long1::i#1!=(byte) $b) goto long1::@1
to:long1::@return
long1::@return: scope:[long1] from long1::@1
[22] return
to:@return
VARIABLE REGISTER WEIGHTS
(void()) long1()
(byte) long1::i
(byte) long1::i#1 1501.5
(byte) long1::i#2 1334.6666666666667
(void()) long2()
(byte) long2::i
(byte) long2::i#1 1501.5
(byte) long2::i#2 1334.6666666666667
(void()) main()
Initial phi equivalence classes
[ long2::i#2 long2::i#1 ]
[ long1::i#2 long1::i#1 ]
Complete equivalence classes
[ long2::i#2 long2::i#1 ]
[ long1::i#2 long1::i#1 ]
Allocated zp[1]:2 [ long2::i#2 long2::i#1 ]
Allocated zp[1]:3 [ long1::i#2 long1::i#1 ]
INITIAL ASM
Target platform is c64basic / MOS6502X
// File Comments
// Minimal example program generating two long jumps
// 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: {
// [5] call long1
// [16] phi from main to long1 [phi:main->long1]
long1_from_main:
jsr long1
// [6] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
jmp __b1
// main::@1
__b1:
// [7] call long2
// [9] phi from main::@1 to long2 [phi:main::@1->long2]
long2_from___b1:
jsr long2
jmp __breturn
// main::@return
__breturn:
// [8] return
rts
}
// long2
long2: {
.label SCREEN = $400
.label i = 2
// [10] phi from long2 to long2::@1 [phi:long2->long2::@1]
__b1_from_long2:
// [10] phi (byte) long2::i#2 = (byte) 0 [phi:long2->long2::@1#0] -- vbuz1=vbuc1
lda #0
sta.z i
jmp __b1
// [10] phi from long2::@1 to long2::@1 [phi:long2::@1->long2::@1]
__b1_from___b1:
// [10] phi (byte) long2::i#2 = (byte) long2::i#1 [phi:long2::@1->long2::@1#0] -- register_copy
jmp __b1
// long2::@1
__b1:
// asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
// [12] *((const byte*) long2::SCREEN + (byte) long2::i#2) ← (byte) long2::i#2 -- pbuc1_derefidx_vbuz1=vbuz1
ldy.z i
tya
sta SCREEN,y
// [13] (byte) long2::i#1 ← ++ (byte) long2::i#2 -- vbuz1=_inc_vbuz1
inc.z i
// [14] if((byte) long2::i#1!=(byte) $b) goto long2::@1 -- vbuz1_neq_vbuc1_then_la1
lda #$b
cmp.z i
bne __b1_from___b1
jmp __breturn
// long2::@return
__breturn:
// [15] return
rts
}
// long1
long1: {
.label SCREEN = $400
.label i = 3
// [17] phi from long1 to long1::@1 [phi:long1->long1::@1]
__b1_from_long1:
// [17] phi (byte) long1::i#2 = (byte) 0 [phi:long1->long1::@1#0] -- vbuz1=vbuc1
lda #0
sta.z i
jmp __b1
// [17] phi from long1::@1 to long1::@1 [phi:long1::@1->long1::@1]
__b1_from___b1:
// [17] phi (byte) long1::i#2 = (byte) long1::i#1 [phi:long1::@1->long1::@1#0] -- register_copy
jmp __b1
// long1::@1
__b1:
// asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
// [19] *((const byte*) long1::SCREEN + (byte) long1::i#2) ← (byte) long1::i#2 -- pbuc1_derefidx_vbuz1=vbuz1
ldy.z i
tya
sta SCREEN,y
// [20] (byte) long1::i#1 ← ++ (byte) long1::i#2 -- vbuz1=_inc_vbuz1
inc.z i
// [21] if((byte) long1::i#1!=(byte) $b) goto long1::@1 -- vbuz1_neq_vbuc1_then_la1
lda #$b
cmp.z i
bne __b1_from___b1
jmp __breturn
// long1::@return
__breturn:
// [22] return
rts
}
// File Data
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp[1]:2 [ long2::i#2 long2::i#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ long1::i#2 long1::i#1 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [long1] 2,836.17: zp[1]:3 [ long1::i#2 long1::i#1 ]
Uplift Scope [long2] 2,836.17: zp[1]:2 [ long2::i#2 long2::i#1 ]
Uplift Scope [main]
Uplift Scope []
Uplifting [long1] best 10898 combination reg byte x [ long1::i#2 long1::i#1 ]
Uplifting [long2] best 10778 combination reg byte x [ long2::i#2 long2::i#1 ]
Uplifting [main] best 10778 combination
Uplifting [] best 10778 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Minimal example program generating two long jumps
// 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: {
// [5] call long1
// [16] phi from main to long1 [phi:main->long1]
long1_from_main:
jsr long1
// [6] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
jmp __b1
// main::@1
__b1:
// [7] call long2
// [9] phi from main::@1 to long2 [phi:main::@1->long2]
long2_from___b1:
jsr long2
jmp __breturn
// main::@return
__breturn:
// [8] return
rts
}
// long2
long2: {
.label SCREEN = $400
// [10] phi from long2 to long2::@1 [phi:long2->long2::@1]
__b1_from_long2:
// [10] phi (byte) long2::i#2 = (byte) 0 [phi:long2->long2::@1#0] -- vbuxx=vbuc1
ldx #0
jmp __b1
// [10] phi from long2::@1 to long2::@1 [phi:long2::@1->long2::@1]
__b1_from___b1:
// [10] phi (byte) long2::i#2 = (byte) long2::i#1 [phi:long2::@1->long2::@1#0] -- register_copy
jmp __b1
// long2::@1
__b1:
// asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
// [12] *((const byte*) long2::SCREEN + (byte) long2::i#2) ← (byte) long2::i#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN,x
// [13] (byte) long2::i#1 ← ++ (byte) long2::i#2 -- vbuxx=_inc_vbuxx
inx
// [14] if((byte) long2::i#1!=(byte) $b) goto long2::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #$b
bne __b1_from___b1
jmp __breturn
// long2::@return
__breturn:
// [15] return
rts
}
// long1
long1: {
.label SCREEN = $400
// [17] phi from long1 to long1::@1 [phi:long1->long1::@1]
__b1_from_long1:
// [17] phi (byte) long1::i#2 = (byte) 0 [phi:long1->long1::@1#0] -- vbuxx=vbuc1
ldx #0
jmp __b1
// [17] phi from long1::@1 to long1::@1 [phi:long1::@1->long1::@1]
__b1_from___b1:
// [17] phi (byte) long1::i#2 = (byte) long1::i#1 [phi:long1::@1->long1::@1#0] -- register_copy
jmp __b1
// long1::@1
__b1:
// asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
// [19] *((const byte*) long1::SCREEN + (byte) long1::i#2) ← (byte) long1::i#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN,x
// [20] (byte) long1::i#1 ← ++ (byte) long1::i#2 -- vbuxx=_inc_vbuxx
inx
// [21] if((byte) long1::i#1!=(byte) $b) goto long1::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #$b
bne __b1_from___b1
jmp __breturn
// long1::@return
__breturn:
// [22] return
rts
}
// File Data
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __bend
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label __b1_from___b1 with __b1
Replacing label __b1_from___b1 with __b1
Removing instruction __b1_from___bbegin:
Removing instruction __b1:
Removing instruction main_from___b1:
Removing instruction __bend_from___b1:
Removing instruction __b1_from_main:
Removing instruction long2_from___b1:
Removing instruction __b1_from___b1:
Removing instruction __b1_from___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __bbegin:
Removing instruction __bend:
Removing instruction long1_from_main:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __b1_from_long2:
Removing instruction __breturn:
Removing instruction __b1_from_long1:
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp __b1
Removing instruction jmp __b1
Succesful ASM optimization Pass5NextJumpElimination
Fixing long branch [273] bne __b1 to beq
Fixing long branch [542] bne __b1 to beq
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(void()) long1()
(label) long1::@1
(label) long1::@return
(const byte*) long1::SCREEN = (byte*) 1024
(byte) long1::i
(byte) long1::i#1 reg byte x 1501.5
(byte) long1::i#2 reg byte x 1334.6666666666667
(void()) long2()
(label) long2::@1
(label) long2::@return
(const byte*) long2::SCREEN = (byte*) 1024
(byte) long2::i
(byte) long2::i#1 reg byte x 1501.5
(byte) long2::i#2 reg byte x 1334.6666666666667
(void()) main()
(label) main::@1
(label) main::@return
reg byte x [ long2::i#2 long2::i#1 ]
reg byte x [ long1::i#2 long1::i#1 ]
FINAL ASSEMBLER
Score: 10640
// File Comments
// Minimal example program generating two long jumps
// 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: {
// long1()
// [5] call long1
// [16] phi from main to long1 [phi:main->long1]
jsr long1
// [6] phi from main to main::@1 [phi:main->main::@1]
// main::@1
// long2()
// [7] call long2
// [9] phi from main::@1 to long2 [phi:main::@1->long2]
jsr long2
// main::@return
// }
// [8] return
rts
}
// long2
long2: {
.label SCREEN = $400
// [10] phi from long2 to long2::@1 [phi:long2->long2::@1]
// [10] phi (byte) long2::i#2 = (byte) 0 [phi:long2->long2::@1#0] -- vbuxx=vbuc1
ldx #0
// [10] phi from long2::@1 to long2::@1 [phi:long2::@1->long2::@1]
// [10] phi (byte) long2::i#2 = (byte) long2::i#1 [phi:long2::@1->long2::@1#0] -- register_copy
// long2::@1
__b1:
// asm
// asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
// SCREEN[i] = i
// [12] *((const byte*) long2::SCREEN + (byte) long2::i#2) ← (byte) long2::i#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN,x
// for(byte i : 0..10)
// [13] (byte) long2::i#1 ← ++ (byte) long2::i#2 -- vbuxx=_inc_vbuxx
inx
// [14] if((byte) long2::i#1!=(byte) $b) goto long2::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #$b
beq !__b1+
jmp __b1
!__b1:
// long2::@return
// }
// [15] return
rts
}
// long1
long1: {
.label SCREEN = $400
// [17] phi from long1 to long1::@1 [phi:long1->long1::@1]
// [17] phi (byte) long1::i#2 = (byte) 0 [phi:long1->long1::@1#0] -- vbuxx=vbuc1
ldx #0
// [17] phi from long1::@1 to long1::@1 [phi:long1::@1->long1::@1]
// [17] phi (byte) long1::i#2 = (byte) long1::i#1 [phi:long1::@1->long1::@1#0] -- register_copy
// long1::@1
__b1:
// asm
// asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop }
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
// SCREEN[i] = i
// [19] *((const byte*) long1::SCREEN + (byte) long1::i#2) ← (byte) long1::i#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta SCREEN,x
// for(byte i : 0..10)
// [20] (byte) long1::i#1 ← ++ (byte) long1::i#2 -- vbuxx=_inc_vbuxx
inx
// [21] if((byte) long1::i#1!=(byte) $b) goto long1::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #$b
beq !__b1+
jmp __b1
!__b1:
// long1::@return
// }
// [22] return
rts
}
// File Data