
CONTROL FLOW GRAPH SSA
@begin: scope:[]  from
  (byte*) screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
  to:@2
main: scope:[main]  from @2
  (byte*) screen#1 ← phi( @2/(byte*) screen#3 )
  (byte*) main::hello#0 ← (const string) main::$3
  (byte*) print2::at#0 ← (byte*) screen#1
  (byte*) print2::msg#0 ← (byte*) main::hello#0
  call print2 
  to:main::@1
main::@1: scope:[main]  from main
  (byte*) main::hello#1 ← phi( main/(byte*) main::hello#0 )
  (byte*) screen#2 ← phi( main/(byte*) screen#1 )
  (byte*~) main::$1 ← (byte*) screen#2 + (byte/signed byte/word/signed word/dword/signed dword) 80
  (byte*) print2::at#1 ← (byte*~) main::$1
  (byte*) print2::msg#1 ← (byte*) main::hello#1
  call print2 
  to:main::@2
main::@2: scope:[main]  from main::@1
  to:main::@return
main::@return: scope:[main]  from main::@2
  return 
  to:@return
print2: scope:[print2]  from main main::@1
  (byte*) print2::at#3 ← phi( main/(byte*) print2::at#0 main::@1/(byte*) print2::at#1 )
  (byte*) print2::msg#3 ← phi( main/(byte*) print2::msg#0 main::@1/(byte*) print2::msg#1 )
  (byte) print2::j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
  (byte) print2::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
  to:print2::@1
print2::@1: scope:[print2]  from print2 print2::@1
  (byte) print2::j#2 ← phi( print2/(byte) print2::j#0 print2::@1/(byte) print2::j#1 )
  (byte*) print2::at#2 ← phi( print2/(byte*) print2::at#3 print2::@1/(byte*) print2::at#2 )
  (byte) print2::i#2 ← phi( print2/(byte) print2::i#0 print2::@1/(byte) print2::i#1 )
  (byte*) print2::msg#2 ← phi( print2/(byte*) print2::msg#3 print2::@1/(byte*) print2::msg#2 )
  *((byte*) print2::at#2 + (byte) print2::j#2) ← *((byte*) print2::msg#2 + (byte) print2::i#2)
  (byte) print2::j#1 ← (byte) print2::j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2
  (byte) print2::i#1 ← ++ (byte) print2::i#2
  (bool~) print2::$0 ← *((byte*) print2::msg#2 + (byte) print2::i#1) != (byte) '@'
  if((bool~) print2::$0) goto print2::@1
  to:print2::@return
print2::@return: scope:[print2]  from print2::@1
  return 
  to:@return
@2: scope:[]  from @begin
  (byte*) screen#3 ← phi( @begin/(byte*) screen#0 )
  call main 
  to:@3
@3: scope:[]  from @2
  to:@end
@end: scope:[]  from @3

SYMBOL TABLE SSA
(label) @2
(label) @3
(label) @begin
(label) @end
(void()) main()
(byte*~) main::$1
(const string) main::$3 = (string) "hello world!@"
(label) main::@1
(label) main::@2
(label) main::@return
(byte*) main::hello
(byte*) main::hello#0
(byte*) main::hello#1
(void()) print2((byte*) print2::at , (byte*) print2::msg)
(bool~) print2::$0
(label) print2::@1
(label) print2::@return
(byte*) print2::at
(byte*) print2::at#0
(byte*) print2::at#1
(byte*) print2::at#2
(byte*) print2::at#3
(byte) print2::i
(byte) print2::i#0
(byte) print2::i#1
(byte) print2::i#2
(byte) print2::j
(byte) print2::j#0
(byte) print2::j#1
(byte) print2::j#2
(byte*) print2::msg
(byte*) print2::msg#0
(byte*) print2::msg#1
(byte*) print2::msg#2
(byte*) print2::msg#3
(byte*) screen
(byte*) screen#0
(byte*) screen#1
(byte*) screen#2
(byte*) screen#3

Culled Empty Block (label) main::@2
Culled Empty Block (label) @3
Successful SSA optimization Pass2CullEmptyBlocks
Alias (byte*) screen#1 = (byte*) screen#2 
Alias (byte*) main::hello#0 = (byte*) main::hello#1 
Alias (byte*) print2::at#1 = (byte*~) main::$1 
Alias (byte*) screen#0 = (byte*) screen#3 
Successful SSA optimization Pass2AliasElimination
Self Phi Eliminated (byte*) print2::msg#2
Self Phi Eliminated (byte*) print2::at#2
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte*) screen#1 (byte*) screen#0
Redundant Phi (byte*) print2::msg#2 (byte*) print2::msg#3
Redundant Phi (byte*) print2::at#2 (byte*) print2::at#3
Successful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) print2::$0 [20] if(*((byte*) print2::msg#3 + (byte) print2::i#1)!=(byte) '@') goto print2::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) screen#0 = ((byte*))1024
Constant (const byte*) main::hello#0 = main::$3
Constant (const byte) print2::j#0 = 0
Constant (const byte) print2::i#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) print2::at#0 = screen#0
Constant (const byte*) print2::msg#0 = main::hello#0
Constant (const byte*) print2::at#1 = screen#0+80
Constant (const byte*) print2::msg#1 = main::hello#0
Successful SSA optimization Pass2ConstantIdentification
Inlining constant with var siblings (const byte) print2::j#0
Inlining constant with var siblings (const byte) print2::i#0
Inlining constant with var siblings (const byte*) print2::at#0
Inlining constant with var siblings (const byte*) print2::msg#0
Inlining constant with var siblings (const byte*) print2::at#1
Inlining constant with var siblings (const byte*) print2::msg#1
Constant inlined print2::msg#1 = (const byte*) main::hello#0
Constant inlined print2::j#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined print2::msg#0 = (const byte*) main::hello#0
Constant inlined print2::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined print2::at#1 = (const byte*) screen#0+(byte/signed byte/word/signed word/dword/signed dword) 80
Constant inlined main::$3 = (const byte*) main::hello#0
Constant inlined print2::at#0 = (const byte*) screen#0
Successful SSA optimization Pass2ConstantInlining
Identical Phi Values (byte*) print2::msg#3 (const byte*) main::hello#0
Successful SSA optimization Pass2IdenticalPhiElimination
Added new block during phi lifting print2::@3(between print2::@1 and print2::@1)
Adding NOP phi() at start of @begin
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
CALL GRAPH
Calls in [] to main:2 
Calls in [main] to print2:5 print2:7 

Created 3 initial phi equivalence classes
Coalesced [16] print2::i#3 ← print2::i#1
Coalesced [17] print2::j#3 ← print2::j#1
Coalesced down to 3 phi equivalence classes
Culled Empty Block (label) print2::@3
Adding NOP phi() at start of @begin
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

FINAL CONTROL FLOW GRAPH
@begin: scope:[]  from
  [0] phi()
  to:@2
@2: scope:[]  from @begin
  [1] phi()
  [2] call main 
  to:@end
@end: scope:[]  from @2
  [3] phi()
main: scope:[main]  from @2
  [4] phi()
  [5] call print2 
  to:main::@1
main::@1: scope:[main]  from main
  [6] phi()
  [7] call print2 
  to:main::@return
main::@return: scope:[main]  from main::@1
  [8] return 
  to:@return
print2: scope:[print2]  from main main::@1
  [9] (byte*) print2::at#3 ← phi( main/(const byte*) screen#0 main::@1/(const byte*) screen#0+(byte/signed byte/word/signed word/dword/signed dword) 80 )
  to:print2::@1
print2::@1: scope:[print2]  from print2 print2::@1
  [10] (byte) print2::j#2 ← phi( print2/(byte/signed byte/word/signed word/dword/signed dword) 0 print2::@1/(byte) print2::j#1 )
  [10] (byte) print2::i#2 ← phi( print2/(byte/signed byte/word/signed word/dword/signed dword) 0 print2::@1/(byte) print2::i#1 )
  [11] *((byte*) print2::at#3 + (byte) print2::j#2) ← *((const byte*) main::hello#0 + (byte) print2::i#2)
  [12] (byte) print2::j#1 ← (byte) print2::j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2
  [13] (byte) print2::i#1 ← ++ (byte) print2::i#2
  [14] if(*((const byte*) main::hello#0 + (byte) print2::i#1)!=(byte) '@') goto print2::@1
  to:print2::@return
print2::@return: scope:[print2]  from print2::@1
  [15] return 
  to:@return


VARIABLE REGISTER WEIGHTS
(void()) main()
(byte*) main::hello
(void()) print2((byte*) print2::at , (byte*) print2::msg)
(byte*) print2::at
(byte*) print2::at#3 1.8333333333333333
(byte) print2::i
(byte) print2::i#1 16.5
(byte) print2::i#2 11.0
(byte) print2::j
(byte) print2::j#1 7.333333333333333
(byte) print2::j#2 16.5
(byte*) print2::msg
(byte*) screen

Initial phi equivalence classes
[ print2::at#3 ]
[ print2::i#2 print2::i#1 ]
[ print2::j#2 print2::j#1 ]
Complete equivalence classes
[ print2::at#3 ]
[ print2::i#2 print2::i#1 ]
[ print2::j#2 print2::j#1 ]
Allocated zp ZP_WORD:2 [ print2::at#3 ]
Allocated zp ZP_BYTE:4 [ print2::i#2 print2::i#1 ]
Allocated zp ZP_BYTE:5 [ print2::j#2 print2::j#1 ]

INITIAL ASM
//SEG0 File Comments
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label screen = $400
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @2 [phi:@begin->@2]
b2_from_bbegin:
  jmp b2
//SEG5 @2
b2:
//SEG6 [2] call main 
//SEG7 [4] phi from @2 to main [phi:@2->main]
main_from_b2:
  jsr main
//SEG8 [3] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
  jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
  //SEG11 [5] call print2 
  //SEG12 [9] phi from main to print2 [phi:main->print2]
  print2_from_main:
  //SEG13 [9] phi (byte*) print2::at#3 = (const byte*) screen#0 [phi:main->print2#0] -- pbuz1=pbuc1 
    lda #<screen
    sta print2.at
    lda #>screen
    sta print2.at+1
    jsr print2
  //SEG14 [6] phi from main to main::@1 [phi:main->main::@1]
  b1_from_main:
    jmp b1
  //SEG15 main::@1
  b1:
  //SEG16 [7] call print2 
  //SEG17 [9] phi from main::@1 to print2 [phi:main::@1->print2]
  print2_from_b1:
  //SEG18 [9] phi (byte*) print2::at#3 = (const byte*) screen#0+(byte/signed byte/word/signed word/dword/signed dword) 80 [phi:main::@1->print2#0] -- pbuz1=pbuc1 
    lda #<screen+$50
    sta print2.at
    lda #>screen+$50
    sta print2.at+1
    jsr print2
    jmp breturn
  //SEG19 main::@return
  breturn:
  //SEG20 [8] return 
    rts
    hello: .text "hello world!@"
}
//SEG21 print2
// print2(byte* zeropage(2) at)
print2: {
    .label j = 5
    .label i = 4
    .label at = 2
  //SEG22 [10] phi from print2 to print2::@1 [phi:print2->print2::@1]
  b1_from_print2:
  //SEG23 [10] phi (byte) print2::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:print2->print2::@1#0] -- vbuz1=vbuc1 
    lda #0
    sta j
  //SEG24 [10] phi (byte) print2::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:print2->print2::@1#1] -- vbuz1=vbuc1 
    lda #0
    sta i
    jmp b1
  //SEG25 [10] phi from print2::@1 to print2::@1 [phi:print2::@1->print2::@1]
  b1_from_b1:
  //SEG26 [10] phi (byte) print2::j#2 = (byte) print2::j#1 [phi:print2::@1->print2::@1#0] -- register_copy 
  //SEG27 [10] phi (byte) print2::i#2 = (byte) print2::i#1 [phi:print2::@1->print2::@1#1] -- register_copy 
    jmp b1
  //SEG28 print2::@1
  b1:
  //SEG29 [11] *((byte*) print2::at#3 + (byte) print2::j#2) ← *((const byte*) main::hello#0 + (byte) print2::i#2) -- pbuz1_derefidx_vbuz2=pbuc1_derefidx_vbuz3 
    ldy i
    lda main.hello,y
    ldy j
    sta (at),y
  //SEG30 [12] (byte) print2::j#1 ← (byte) print2::j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 -- vbuz1=vbuz1_plus_2 
    lda j
    clc
    adc #2
    sta j
  //SEG31 [13] (byte) print2::i#1 ← ++ (byte) print2::i#2 -- vbuz1=_inc_vbuz1 
    inc i
  //SEG32 [14] if(*((const byte*) main::hello#0 + (byte) print2::i#1)!=(byte) '@') goto print2::@1 -- pbuc1_derefidx_vbuz1_neq_vbuc2_then_la1 
    ldy i
    lda main.hello,y
    cmp #'@'
    bne b1_from_b1
    jmp breturn
  //SEG33 print2::@return
  breturn:
  //SEG34 [15] return 
    rts
}

REGISTER UPLIFT POTENTIAL REGISTERS
Statement [11] *((byte*) print2::at#3 + (byte) print2::j#2) ← *((const byte*) main::hello#0 + (byte) print2::i#2) [ print2::at#3 print2::i#2 print2::j#2 ] ( main:2::print2:5 [ print2::at#3 print2::i#2 print2::j#2 ] main:2::print2:7 [ print2::at#3 print2::i#2 print2::j#2 ] ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ print2::i#2 print2::i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ print2::j#2 print2::j#1 ]
Statement [14] if(*((const byte*) main::hello#0 + (byte) print2::i#1)!=(byte) '@') goto print2::@1 [ print2::at#3 print2::i#1 print2::j#1 ] ( main:2::print2:5 [ print2::at#3 print2::i#1 print2::j#1 ] main:2::print2:7 [ print2::at#3 print2::i#1 print2::j#1 ] ) always clobbers reg byte a 
Statement [11] *((byte*) print2::at#3 + (byte) print2::j#2) ← *((const byte*) main::hello#0 + (byte) print2::i#2) [ print2::at#3 print2::i#2 print2::j#2 ] ( main:2::print2:5 [ print2::at#3 print2::i#2 print2::j#2 ] main:2::print2:7 [ print2::at#3 print2::i#2 print2::j#2 ] ) always clobbers reg byte a 
Statement [14] if(*((const byte*) main::hello#0 + (byte) print2::i#1)!=(byte) '@') goto print2::@1 [ print2::at#3 print2::i#1 print2::j#1 ] ( main:2::print2:5 [ print2::at#3 print2::i#1 print2::j#1 ] main:2::print2:7 [ print2::at#3 print2::i#1 print2::j#1 ] ) always clobbers reg byte a 
Potential registers zp ZP_WORD:2 [ print2::at#3 ] : zp ZP_WORD:2 , 
Potential registers zp ZP_BYTE:4 [ print2::i#2 print2::i#1 ] : zp ZP_BYTE:4 , reg byte x , reg byte y , 
Potential registers zp ZP_BYTE:5 [ print2::j#2 print2::j#1 ] : zp ZP_BYTE:5 , reg byte x , reg byte y , 

REGISTER UPLIFT SCOPES
Uplift Scope [print2] 27.5: zp ZP_BYTE:4 [ print2::i#2 print2::i#1 ] 23.83: zp ZP_BYTE:5 [ print2::j#2 print2::j#1 ] 1.83: zp ZP_WORD:2 [ print2::at#3 ] 
Uplift Scope [main] 
Uplift Scope [] 

Uplifting [print2] best 447 combination reg byte x [ print2::i#2 print2::i#1 ] reg byte y [ print2::j#2 print2::j#1 ] zp ZP_WORD:2 [ print2::at#3 ] 
Uplifting [main] best 447 combination 
Uplifting [] best 447 combination 

ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label screen = $400
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @2 [phi:@begin->@2]
b2_from_bbegin:
  jmp b2
//SEG5 @2
b2:
//SEG6 [2] call main 
//SEG7 [4] phi from @2 to main [phi:@2->main]
main_from_b2:
  jsr main
//SEG8 [3] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
  jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
  //SEG11 [5] call print2 
  //SEG12 [9] phi from main to print2 [phi:main->print2]
  print2_from_main:
  //SEG13 [9] phi (byte*) print2::at#3 = (const byte*) screen#0 [phi:main->print2#0] -- pbuz1=pbuc1 
    lda #<screen
    sta print2.at
    lda #>screen
    sta print2.at+1
    jsr print2
  //SEG14 [6] phi from main to main::@1 [phi:main->main::@1]
  b1_from_main:
    jmp b1
  //SEG15 main::@1
  b1:
  //SEG16 [7] call print2 
  //SEG17 [9] phi from main::@1 to print2 [phi:main::@1->print2]
  print2_from_b1:
  //SEG18 [9] phi (byte*) print2::at#3 = (const byte*) screen#0+(byte/signed byte/word/signed word/dword/signed dword) 80 [phi:main::@1->print2#0] -- pbuz1=pbuc1 
    lda #<screen+$50
    sta print2.at
    lda #>screen+$50
    sta print2.at+1
    jsr print2
    jmp breturn
  //SEG19 main::@return
  breturn:
  //SEG20 [8] return 
    rts
    hello: .text "hello world!@"
}
//SEG21 print2
// print2(byte* zeropage(2) at)
print2: {
    .label at = 2
  //SEG22 [10] phi from print2 to print2::@1 [phi:print2->print2::@1]
  b1_from_print2:
  //SEG23 [10] phi (byte) print2::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:print2->print2::@1#0] -- vbuyy=vbuc1 
    ldy #0
  //SEG24 [10] phi (byte) print2::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:print2->print2::@1#1] -- vbuxx=vbuc1 
    ldx #0
    jmp b1
  //SEG25 [10] phi from print2::@1 to print2::@1 [phi:print2::@1->print2::@1]
  b1_from_b1:
  //SEG26 [10] phi (byte) print2::j#2 = (byte) print2::j#1 [phi:print2::@1->print2::@1#0] -- register_copy 
  //SEG27 [10] phi (byte) print2::i#2 = (byte) print2::i#1 [phi:print2::@1->print2::@1#1] -- register_copy 
    jmp b1
  //SEG28 print2::@1
  b1:
  //SEG29 [11] *((byte*) print2::at#3 + (byte) print2::j#2) ← *((const byte*) main::hello#0 + (byte) print2::i#2) -- pbuz1_derefidx_vbuyy=pbuc1_derefidx_vbuxx 
    lda main.hello,x
    sta (at),y
  //SEG30 [12] (byte) print2::j#1 ← (byte) print2::j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 -- vbuyy=vbuyy_plus_2 
    iny
    iny
  //SEG31 [13] (byte) print2::i#1 ← ++ (byte) print2::i#2 -- vbuxx=_inc_vbuxx 
    inx
  //SEG32 [14] if(*((const byte*) main::hello#0 + (byte) print2::i#1)!=(byte) '@') goto print2::@1 -- pbuc1_derefidx_vbuxx_neq_vbuc2_then_la1 
    lda main.hello,x
    cmp #'@'
    bne b1_from_b1
    jmp breturn
  //SEG33 print2::@return
  breturn:
  //SEG34 [15] return 
    rts
}

ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b2
Removing instruction jmp bend
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
Removing instruction b2_from_bbegin:
Removing instruction b2:
Removing instruction main_from_b2:
Removing instruction bend_from_b2:
Removing instruction b1_from_main:
Removing instruction print2_from_b1:
Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction print2_from_main:
Removing instruction b1:
Removing instruction breturn:
Removing instruction b1_from_print2:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp b1
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Succesful ASM optimization Pass5UnusedLabelElimination

FINAL SYMBOL TABLE
(label) @2
(label) @begin
(label) @end
(void()) main()
(label) main::@1
(label) main::@return
(byte*) main::hello
(const byte*) main::hello#0 hello = (string) "hello world!@"
(void()) print2((byte*) print2::at , (byte*) print2::msg)
(label) print2::@1
(label) print2::@return
(byte*) print2::at
(byte*) print2::at#3 at zp ZP_WORD:2 1.8333333333333333
(byte) print2::i
(byte) print2::i#1 reg byte x 16.5
(byte) print2::i#2 reg byte x 11.0
(byte) print2::j
(byte) print2::j#1 reg byte y 7.333333333333333
(byte) print2::j#2 reg byte y 16.5
(byte*) print2::msg
(byte*) screen
(const byte*) screen#0 screen = ((byte*))(word/signed word/dword/signed dword) 1024

zp ZP_WORD:2 [ print2::at#3 ]
reg byte x [ print2::i#2 print2::i#1 ]
reg byte y [ print2::j#2 print2::j#1 ]


FINAL ASSEMBLER
Score: 339

//SEG0 File Comments
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label screen = $400
//SEG3 @begin
//SEG4 [1] phi from @begin to @2 [phi:@begin->@2]
//SEG5 @2
//SEG6 [2] call main 
//SEG7 [4] phi from @2 to main [phi:@2->main]
//SEG8 [3] phi from @2 to @end [phi:@2->@end]
//SEG9 @end
//SEG10 main
main: {
  //SEG11 [5] call print2 
  //SEG12 [9] phi from main to print2 [phi:main->print2]
  //SEG13 [9] phi (byte*) print2::at#3 = (const byte*) screen#0 [phi:main->print2#0] -- pbuz1=pbuc1 
    lda #<screen
    sta print2.at
    lda #>screen
    sta print2.at+1
    jsr print2
  //SEG14 [6] phi from main to main::@1 [phi:main->main::@1]
  //SEG15 main::@1
  //SEG16 [7] call print2 
  //SEG17 [9] phi from main::@1 to print2 [phi:main::@1->print2]
  //SEG18 [9] phi (byte*) print2::at#3 = (const byte*) screen#0+(byte/signed byte/word/signed word/dword/signed dword) 80 [phi:main::@1->print2#0] -- pbuz1=pbuc1 
    lda #<screen+$50
    sta print2.at
    lda #>screen+$50
    sta print2.at+1
    jsr print2
  //SEG19 main::@return
  //SEG20 [8] return 
    rts
    hello: .text "hello world!@"
}
//SEG21 print2
// print2(byte* zeropage(2) at)
print2: {
    .label at = 2
  //SEG22 [10] phi from print2 to print2::@1 [phi:print2->print2::@1]
  //SEG23 [10] phi (byte) print2::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:print2->print2::@1#0] -- vbuyy=vbuc1 
    ldy #0
  //SEG24 [10] phi (byte) print2::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:print2->print2::@1#1] -- vbuxx=vbuc1 
    ldx #0
  //SEG25 [10] phi from print2::@1 to print2::@1 [phi:print2::@1->print2::@1]
  //SEG26 [10] phi (byte) print2::j#2 = (byte) print2::j#1 [phi:print2::@1->print2::@1#0] -- register_copy 
  //SEG27 [10] phi (byte) print2::i#2 = (byte) print2::i#1 [phi:print2::@1->print2::@1#1] -- register_copy 
  //SEG28 print2::@1
  b1:
  //SEG29 [11] *((byte*) print2::at#3 + (byte) print2::j#2) ← *((const byte*) main::hello#0 + (byte) print2::i#2) -- pbuz1_derefidx_vbuyy=pbuc1_derefidx_vbuxx 
    lda main.hello,x
    sta (at),y
  //SEG30 [12] (byte) print2::j#1 ← (byte) print2::j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 -- vbuyy=vbuyy_plus_2 
    iny
    iny
  //SEG31 [13] (byte) print2::i#1 ← ++ (byte) print2::i#2 -- vbuxx=_inc_vbuxx 
    inx
  //SEG32 [14] if(*((const byte*) main::hello#0 + (byte) print2::i#1)!=(byte) '@') goto print2::@1 -- pbuc1_derefidx_vbuxx_neq_vbuc2_then_la1 
    lda main.hello,x
    cmp #'@'
    bne b1
  //SEG33 print2::@return
  //SEG34 [15] return 
    rts
}

