From f09e4da4d4e32fec7b94dca21cb5e38b907c0b7e Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 29 Sep 2019 20:59:38 +0200 Subject: [PATCH] Fixed struct tests --- src/test/ref/struct-11.cfg | 10 +- src/test/ref/struct-11.log | 152 +++++++++++-------------- src/test/ref/struct-11.sym | 12 +- src/test/ref/struct-ptr-23.cfg | 14 +-- src/test/ref/struct-ptr-23.log | 130 ++++++++++----------- src/test/ref/struct-ptr-23.sym | 8 +- src/test/ref/struct-ptr-31.cfg | 10 +- src/test/ref/struct-ptr-31.log | 121 +++++++++----------- src/test/ref/struct-ptr-31.sym | 9 +- src/test/ref/struct-ptr-32.cfg | 16 +-- src/test/ref/struct-ptr-32.log | 202 ++++++++++++++++----------------- src/test/ref/struct-ptr-32.sym | 8 +- src/test/ref/struct-ptr-33.cfg | 4 +- src/test/ref/struct-ptr-33.log | 70 ++++++------ src/test/ref/struct-ptr-33.sym | 8 +- src/test/ref/struct-ptr-34.cfg | 8 +- src/test/ref/struct-ptr-34.log | 78 ++++++------- src/test/ref/struct-ptr-34.sym | 6 +- 18 files changed, 399 insertions(+), 467 deletions(-) diff --git a/src/test/ref/struct-11.cfg b/src/test/ref/struct-11.cfg index eb147eb60..a577c2f22 100644 --- a/src/test/ref/struct-11.cfg +++ b/src/test/ref/struct-11.cfg @@ -62,7 +62,7 @@ print_ln::@return: scope:[print_ln] from print_ln::@1 (void()) print_str((byte*) print_str::str) print_str: scope:[print_str] from print_dword_decimal::@1 print_person::@2 [24] (byte*) print_char_cursor#41 ← phi( print_dword_decimal::@1/(byte*) print_char_cursor#39 print_person::@2/(byte*) print_char_cursor#25 ) - [24] (byte*) print_str::str#5 ← phi( print_dword_decimal::@1/(const byte[$b]) decimal_digits_long#0 print_person::@2/(byte*) print_str::str#2 ) + [24] (byte*) print_str::str#5 ← phi( print_dword_decimal::@1/(const byte[$b]) decimal_digits_long print_person::@2/(byte*) print_str::str#2 ) to:print_str::@1 print_str::@1: scope:[print_str] from print_str print_str::@2 [25] (byte*) print_char_cursor#18 ← phi( print_str/(byte*) print_char_cursor#41 print_str::@2/(byte*) print_char_cursor#1 ) @@ -105,7 +105,7 @@ ultoa: scope:[ultoa] from print_dword_decimal [39] phi() to:ultoa::@1 ultoa::@1: scope:[ultoa] from ultoa ultoa::@4 - [40] (byte*) ultoa::buffer#11 ← phi( ultoa::@4/(byte*) ultoa::buffer#14 ultoa/(const byte[$b]) decimal_digits_long#0 ) + [40] (byte*) ultoa::buffer#11 ← phi( ultoa::@4/(byte*) ultoa::buffer#14 ultoa/(const byte[$b]) decimal_digits_long ) [40] (byte) ultoa::started#2 ← phi( ultoa::@4/(byte) ultoa::started#4 ultoa/(byte) 0 ) [40] (dword) ultoa::value#2 ← phi( ultoa::@4/(dword) ultoa::value#6 ultoa/(dword) ultoa::value#1 ) [40] (byte) ultoa::digit#2 ← phi( ultoa::@4/(byte) ultoa::digit#1 ultoa/(byte) 0 ) @@ -113,7 +113,7 @@ ultoa::@1: scope:[ultoa] from ultoa ultoa::@4 to:ultoa::@3 ultoa::@3: scope:[ultoa] from ultoa::@1 [42] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 - [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS#0 + (byte~) ultoa::$4) + [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS + (byte~) ultoa::$4) [44] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 [45] *((byte*) ultoa::buffer#3) ← (byte) 0 to:ultoa::@return @@ -122,7 +122,7 @@ ultoa::@return: scope:[ultoa] from ultoa::@3 to:@return ultoa::@2: scope:[ultoa] from ultoa::@1 [47] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 - [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (byte~) ultoa::$11) + [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) [49] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@5 to:ultoa::@7 ultoa::@7: scope:[ultoa] from ultoa::@2 @@ -156,7 +156,7 @@ ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2 [62] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 to:ultoa_append::@3 ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1 - [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS#0 + (byte) ultoa_append::digit#2) + [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS + (byte) ultoa_append::digit#2) to:ultoa_append::@return ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3 [64] return diff --git a/src/test/ref/struct-11.log b/src/test/ref/struct-11.log index aa9dd3e9e..23b0ce820 100644 --- a/src/test/ref/struct-11.log +++ b/src/test/ref/struct-11.log @@ -91,13 +91,13 @@ CONTROL FLOW GRAPH SSA @begin: scope:[] from to:@8 @8: scope:[] from @begin - (byte[]) DIGITS#0 ← (const string) $0 + (byte[]) DIGITS ← (const string) $0 to:@10 @10: scope:[] from @8 - (dword[]) RADIX_BINARY_VALUES_LONG#0 ← { (number) $80000000, (number) $40000000, (number) $20000000, (number) $10000000, (number) $8000000, (number) $4000000, (number) $2000000, (number) $1000000, (number) $800000, (number) $400000, (number) $200000, (number) $100000, (number) $80000, (number) $40000, (number) $20000, (number) $10000, (number) $8000, (number) $4000, (number) $2000, (number) $1000, (number) $800, (number) $400, (number) $200, (number) $100, (number) $80, (number) $40, (number) $20, (number) $10, (number) 8, (number) 4, (number) 2 } - (dword[]) RADIX_OCTAL_VALUES_LONG#0 ← { (number) $40000000, (number) $8000000, (number) $1000000, (number) $200000, (number) $40000, (number) $8000, (number) $1000, (number) $200, (number) $40, (number) 8 } - (dword[]) RADIX_DECIMAL_VALUES_LONG#0 ← { (number) $3b9aca00, (number) $5f5e100, (number) $989680, (number) $f4240, (number) $186a0, (number) $2710, (number) $3e8, (number) $64, (number) $a } - (dword[]) RADIX_HEXADECIMAL_VALUES_LONG#0 ← { (number) $10000000, (number) $1000000, (number) $100000, (number) $10000, (number) $1000, (number) $100, (number) $10 } + (dword[]) RADIX_BINARY_VALUES_LONG ← { (number) $80000000, (number) $40000000, (number) $20000000, (number) $10000000, (number) $8000000, (number) $4000000, (number) $2000000, (number) $1000000, (number) $800000, (number) $400000, (number) $200000, (number) $100000, (number) $80000, (number) $40000, (number) $20000, (number) $10000, (number) $8000, (number) $4000, (number) $2000, (number) $1000, (number) $800, (number) $400, (number) $200, (number) $100, (number) $80, (number) $40, (number) $20, (number) $10, (number) 8, (number) 4, (number) 2 } + (dword[]) RADIX_OCTAL_VALUES_LONG ← { (number) $40000000, (number) $8000000, (number) $1000000, (number) $200000, (number) $40000, (number) $8000, (number) $1000, (number) $200, (number) $40, (number) 8 } + (dword[]) RADIX_DECIMAL_VALUES_LONG ← { (number) $3b9aca00, (number) $5f5e100, (number) $989680, (number) $f4240, (number) $186a0, (number) $2710, (number) $3e8, (number) $64, (number) $a } + (dword[]) RADIX_HEXADECIMAL_VALUES_LONG ← { (number) $10000000, (number) $1000000, (number) $100000, (number) $10000, (number) $1000, (number) $100, (number) $10 } to:@12 (void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix) @@ -114,7 +114,7 @@ ultoa::@1: scope:[ultoa] from ultoa (byte*) ultoa::buffer#17 ← phi( ultoa/(byte*) ultoa::buffer#21 ) (dword) ultoa::value#8 ← phi( ultoa/(dword) ultoa::value#12 ) (byte) ultoa::max_digits#1 ← (number) $a - (dword*) ultoa::digit_values#1 ← (dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (dword*) ultoa::digit_values#1 ← (dword[]) RADIX_DECIMAL_VALUES_LONG to:ultoa::@8 ultoa::@9: scope:[ultoa] from ultoa (dword) ultoa::value#13 ← phi( ultoa/(dword) ultoa::value#12 ) @@ -127,7 +127,7 @@ ultoa::@2: scope:[ultoa] from ultoa::@9 (byte*) ultoa::buffer#18 ← phi( ultoa::@9/(byte*) ultoa::buffer#16 ) (dword) ultoa::value#9 ← phi( ultoa::@9/(dword) ultoa::value#13 ) (byte) ultoa::max_digits#2 ← (number) 8 - (dword*) ultoa::digit_values#2 ← (dword[]) RADIX_HEXADECIMAL_VALUES_LONG#0 + (dword*) ultoa::digit_values#2 ← (dword[]) RADIX_HEXADECIMAL_VALUES_LONG to:ultoa::@8 ultoa::@10: scope:[ultoa] from ultoa::@9 (dword) ultoa::value#14 ← phi( ultoa::@9/(dword) ultoa::value#13 ) @@ -140,7 +140,7 @@ ultoa::@3: scope:[ultoa] from ultoa::@10 (byte*) ultoa::buffer#19 ← phi( ultoa::@10/(byte*) ultoa::buffer#13 ) (dword) ultoa::value#10 ← phi( ultoa::@10/(dword) ultoa::value#14 ) (byte) ultoa::max_digits#3 ← (number) $b - (dword*) ultoa::digit_values#3 ← (dword[]) RADIX_OCTAL_VALUES_LONG#0 + (dword*) ultoa::digit_values#3 ← (dword[]) RADIX_OCTAL_VALUES_LONG to:ultoa::@8 ultoa::@11: scope:[ultoa] from ultoa::@10 (dword) ultoa::value#15 ← phi( ultoa::@10/(dword) ultoa::value#14 ) @@ -153,7 +153,7 @@ ultoa::@4: scope:[ultoa] from ultoa::@11 (byte*) ultoa::buffer#20 ← phi( ultoa::@11/(byte*) ultoa::buffer#10 ) (dword) ultoa::value#11 ← phi( ultoa::@11/(dword) ultoa::value#15 ) (byte) ultoa::max_digits#4 ← (number) $20 - (dword*) ultoa::digit_values#4 ← (dword[]) RADIX_BINARY_VALUES_LONG#0 + (dword*) ultoa::digit_values#4 ← (dword[]) RADIX_BINARY_VALUES_LONG to:ultoa::@8 ultoa::@12: scope:[ultoa] from ultoa::@11 (byte*) ultoa::buffer#6 ← phi( ultoa::@11/(byte*) ultoa::buffer#10 ) @@ -205,7 +205,7 @@ ultoa::@20: scope:[ultoa] from ultoa::@18 (byte*) ultoa::buffer#7 ← phi( ultoa::@18/(byte*) ultoa::buffer#11 ) (dword) ultoa::value#3 ← phi( ultoa::@18/(dword) ultoa::value#5 ) (byte~) ultoa::$4 ← ((byte)) (dword) ultoa::value#3 - *((byte*) ultoa::buffer#7) ← *((byte[]) DIGITS#0 + (byte~) ultoa::$4) + *((byte*) ultoa::buffer#7) ← *((byte[]) DIGITS + (byte~) ultoa::$4) (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#7 *((byte*) ultoa::buffer#3) ← (number) 0 to:ultoa::@return @@ -270,7 +270,7 @@ ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1 (dword) ultoa_append::value#4 ← phi( ultoa_append::@1/(dword) ultoa_append::value#2 ) (byte*) ultoa_append::buffer#1 ← phi( ultoa_append::@1/(byte*) ultoa_append::buffer#2 ) (byte) ultoa_append::digit#3 ← phi( ultoa_append::@1/(byte) ultoa_append::digit#4 ) - *((byte*) ultoa_append::buffer#1) ← *((byte[]) DIGITS#0 + (byte) ultoa_append::digit#3) + *((byte*) ultoa_append::buffer#1) ← *((byte[]) DIGITS + (byte) ultoa_append::digit#3) (dword) ultoa_append::return#1 ← (dword) ultoa_append::value#4 to:ultoa_append::@return ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3 @@ -335,7 +335,7 @@ print_ln::@return: scope:[print_ln] from print_ln::@2 @26: scope:[] from @12 (byte*) print_line_cursor#24 ← phi( @12/(byte*) print_line_cursor#0 ) (byte*) print_char_cursor#44 ← phi( @12/(byte*) print_char_cursor#0 ) - (byte[$b]) decimal_digits_long#0 ← { fill( $b, 0) } + (byte[$b]) decimal_digits_long ← { fill( $b, 0) } to:@36 (void()) print_dword_decimal((dword) print_dword_decimal::w) @@ -343,13 +343,13 @@ print_dword_decimal: scope:[print_dword_decimal] from print_person (byte*) print_char_cursor#42 ← phi( print_person/(byte*) print_char_cursor#39 ) (dword) print_dword_decimal::w#1 ← phi( print_person/(dword) print_dword_decimal::w#0 ) (dword) ultoa::value#1 ← (dword) print_dword_decimal::w#1 - (byte*) ultoa::buffer#5 ← (byte[$b]) decimal_digits_long#0 + (byte*) ultoa::buffer#5 ← (byte[$b]) decimal_digits_long (byte) ultoa::radix#0 ← (const byte) DECIMAL call ultoa to:print_dword_decimal::@1 print_dword_decimal::@1: scope:[print_dword_decimal] from print_dword_decimal (byte*) print_char_cursor#37 ← phi( print_dword_decimal/(byte*) print_char_cursor#42 ) - (byte*) print_str::str#1 ← (byte[$b]) decimal_digits_long#0 + (byte*) print_str::str#1 ← (byte[$b]) decimal_digits_long call print_str to:print_dword_decimal::@2 print_dword_decimal::@2: scope:[print_dword_decimal] from print_dword_decimal::@1 @@ -487,7 +487,6 @@ SYMBOL TABLE SSA (const byte) BINARY = (number) 2 (const byte) DECIMAL = (number) $a (byte[]) DIGITS -(byte[]) DIGITS#0 (const byte) HEXADECIMAL = (number) $10 (const byte) OCTAL = (number) 8 (dword) Person::id @@ -497,16 +496,11 @@ SYMBOL TABLE SSA (const byte) RADIX::HEXADECIMAL = (number) $10 (const byte) RADIX::OCTAL = (number) 8 (dword[]) RADIX_BINARY_VALUES_LONG -(dword[]) RADIX_BINARY_VALUES_LONG#0 (dword[]) RADIX_DECIMAL_VALUES_LONG -(dword[]) RADIX_DECIMAL_VALUES_LONG#0 (dword[]) RADIX_HEXADECIMAL_VALUES_LONG -(dword[]) RADIX_HEXADECIMAL_VALUES_LONG#0 (dword[]) RADIX_OCTAL_VALUES_LONG -(dword[]) RADIX_OCTAL_VALUES_LONG#0 (const byte) SIZEOF_DWORD = (byte) 4 (byte[$b]) decimal_digits_long -(byte[$b]) decimal_digits_long#0 (dword) henry_id (dword) henry_id#0 (byte[3]) henry_initials @@ -812,10 +806,10 @@ Adding number conversion cast (unumber) $28 in (byte*~) print_ln::$0 ← (byte*) Adding number conversion cast (unumber) $1b244 in (dword) jesper_id#0 ← (number) $1b244 Adding number conversion cast (unumber) $4466d in (dword) henry_id#0 ← (number) $4466d Successful SSA optimization PassNAddNumberTypeConversions -Added casts to value list in (dword[]) RADIX_BINARY_VALUES_LONG#0 ← (dword[]){ (dword)(number) $80000000, (dword)(number) $40000000, (dword)(number) $20000000, (dword)(number) $10000000, (dword)(number) $8000000, (dword)(number) $4000000, (dword)(number) $2000000, (dword)(number) $1000000, (dword)(number) $800000, (dword)(number) $400000, (dword)(number) $200000, (dword)(number) $100000, (dword)(number) $80000, (dword)(number) $40000, (dword)(number) $20000, (dword)(number) $10000, (dword)(number) $8000, (dword)(number) $4000, (dword)(number) $2000, (dword)(number) $1000, (dword)(number) $800, (dword)(number) $400, (dword)(number) $200, (dword)(number) $100, (dword)(number) $80, (dword)(number) $40, (dword)(number) $20, (dword)(number) $10, (dword)(number) 8, (dword)(number) 4, (dword)(number) 2 } -Added casts to value list in (dword[]) RADIX_OCTAL_VALUES_LONG#0 ← (dword[]){ (dword)(number) $40000000, (dword)(number) $8000000, (dword)(number) $1000000, (dword)(number) $200000, (dword)(number) $40000, (dword)(number) $8000, (dword)(number) $1000, (dword)(number) $200, (dword)(number) $40, (dword)(number) 8 } -Added casts to value list in (dword[]) RADIX_DECIMAL_VALUES_LONG#0 ← (dword[]){ (dword)(number) $3b9aca00, (dword)(number) $5f5e100, (dword)(number) $989680, (dword)(number) $f4240, (dword)(number) $186a0, (dword)(number) $2710, (dword)(number) $3e8, (dword)(number) $64, (dword)(number) $a } -Added casts to value list in (dword[]) RADIX_HEXADECIMAL_VALUES_LONG#0 ← (dword[]){ (dword)(number) $10000000, (dword)(number) $1000000, (dword)(number) $100000, (dword)(number) $10000, (dword)(number) $1000, (dword)(number) $100, (dword)(number) $10 } +Added casts to value list in (dword[]) RADIX_BINARY_VALUES_LONG ← (dword[]){ (dword)(number) $80000000, (dword)(number) $40000000, (dword)(number) $20000000, (dword)(number) $10000000, (dword)(number) $8000000, (dword)(number) $4000000, (dword)(number) $2000000, (dword)(number) $1000000, (dword)(number) $800000, (dword)(number) $400000, (dword)(number) $200000, (dword)(number) $100000, (dword)(number) $80000, (dword)(number) $40000, (dword)(number) $20000, (dword)(number) $10000, (dword)(number) $8000, (dword)(number) $4000, (dword)(number) $2000, (dword)(number) $1000, (dword)(number) $800, (dword)(number) $400, (dword)(number) $200, (dword)(number) $100, (dword)(number) $80, (dword)(number) $40, (dword)(number) $20, (dword)(number) $10, (dword)(number) 8, (dword)(number) 4, (dword)(number) 2 } +Added casts to value list in (dword[]) RADIX_OCTAL_VALUES_LONG ← (dword[]){ (dword)(number) $40000000, (dword)(number) $8000000, (dword)(number) $1000000, (dword)(number) $200000, (dword)(number) $40000, (dword)(number) $8000, (dword)(number) $1000, (dword)(number) $200, (dword)(number) $40, (dword)(number) 8 } +Added casts to value list in (dword[]) RADIX_DECIMAL_VALUES_LONG ← (dword[]){ (dword)(number) $3b9aca00, (dword)(number) $5f5e100, (dword)(number) $989680, (dword)(number) $f4240, (dword)(number) $186a0, (dword)(number) $2710, (dword)(number) $3e8, (dword)(number) $64, (dword)(number) $a } +Added casts to value list in (dword[]) RADIX_HEXADECIMAL_VALUES_LONG ← (dword[]){ (dword)(number) $10000000, (dword)(number) $1000000, (dword)(number) $100000, (dword)(number) $10000, (dword)(number) $1000, (dword)(number) $100, (dword)(number) $10 } Successful SSA optimization PassNAddInitializerValueListTypeCasts Inlining cast (byte) ultoa::max_digits#1 ← (unumber)(number) $a Inlining cast (byte) ultoa::max_digits#2 ← (unumber)(number) 8 @@ -1011,18 +1005,18 @@ Rewriting ! if()-condition to reversed if() [52] (bool~) ultoa::$9 ← ! (bool~) Rewriting || if()-condition to two if()s [51] (bool~) ultoa::$8 ← (byte) ultoa::started#2 || (bool~) ultoa::$7 Successful SSA optimization Pass2ConditionalAndOrRewriting Warning! Adding boolean cast to non-boolean condition (byte) ultoa::started#2 -Constant right-side identified [113] (byte[$b]) decimal_digits_long#0 ← { fill( $b, 0) } +Constant right-side identified [113] (byte[$b]) decimal_digits_long ← { fill( $b, 0) } Successful SSA optimization Pass2ConstantRValueConsolidation Identified constant from value list (dword[]) { (dword) $80000000, (dword) $40000000, (dword) $20000000, (dword) $10000000, (dword) $8000000, (dword) $4000000, (dword) $2000000, (dword) $1000000, (dword) $800000, (dword) $400000, (dword) $200000, (dword) $100000, (dword) $80000, (dword) $40000, (dword) $20000, (dword) $10000, (dword) $8000, (dword) $4000, (dword) $2000, (dword) $1000, (dword) $800, (dword) $400, (dword) $200, (dword) $100, (dword) $80, (dword) $40, (dword) $20, (dword) $10, (dword) 8, (dword) 4, (dword) 2 } Identified constant from value list (dword[]) { (dword) $40000000, (dword) $8000000, (dword) $1000000, (dword) $200000, (dword) $40000, (dword) $8000, (dword) $1000, (dword) $200, (dword) $40, (dword) 8 } Identified constant from value list (dword[]) { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } Identified constant from value list (dword[]) { (dword) $10000000, (dword) $1000000, (dword) $100000, (dword) $10000, (dword) $1000, (dword) $100, (dword) $10 } Successful SSA optimization Pass2ConstantInitializerValueLists -Constant (const byte[]) DIGITS#0 = $0 -Constant (const dword[]) RADIX_BINARY_VALUES_LONG#0 = { $80000000, $40000000, $20000000, $10000000, $8000000, $4000000, $2000000, $1000000, $800000, $400000, $200000, $100000, $80000, $40000, $20000, $10000, $8000, $4000, $2000, $1000, $800, $400, $200, $100, $80, $40, $20, $10, 8, 4, 2 } -Constant (const dword[]) RADIX_OCTAL_VALUES_LONG#0 = { $40000000, $8000000, $1000000, $200000, $40000, $8000, $1000, $200, $40, 8 } -Constant (const dword[]) RADIX_DECIMAL_VALUES_LONG#0 = { $3b9aca00, $5f5e100, $989680, $f4240, $186a0, $2710, $3e8, $64, $a } -Constant (const dword[]) RADIX_HEXADECIMAL_VALUES_LONG#0 = { $10000000, $1000000, $100000, $10000, $1000, $100, $10 } +Constant (const byte[]) DIGITS = $0 +Constant (const dword[]) RADIX_BINARY_VALUES_LONG = { $80000000, $40000000, $20000000, $10000000, $8000000, $4000000, $2000000, $1000000, $800000, $400000, $200000, $100000, $80000, $40000, $20000, $10000, $8000, $4000, $2000, $1000, $800, $400, $200, $100, $80, $40, $20, $10, 8, 4, 2 } +Constant (const dword[]) RADIX_OCTAL_VALUES_LONG = { $40000000, $8000000, $1000000, $200000, $40000, $8000, $1000, $200, $40, 8 } +Constant (const dword[]) RADIX_DECIMAL_VALUES_LONG = { $3b9aca00, $5f5e100, $989680, $f4240, $186a0, $2710, $3e8, $64, $a } +Constant (const dword[]) RADIX_HEXADECIMAL_VALUES_LONG = { $10000000, $1000000, $100000, $10000, $1000, $100, $10 } Constant (const byte) ultoa::max_digits#0 = 0 Constant (const dword*) ultoa::digit_values#0 = (dword*) 0 Constant (const byte) ultoa::max_digits#1 = $a @@ -1034,7 +1028,7 @@ Constant (const byte) ultoa::digit#0 = 0 Constant (const byte) ultoa::started#1 = 1 Constant (const byte) ultoa_append::digit#0 = 0 Constant (const byte*) print_char_cursor#0 = (byte*) 1024 -Constant (const byte[$b]) decimal_digits_long#0 = { fill( $b, 0) } +Constant (const byte[$b]) decimal_digits_long = { fill( $b, 0) } Constant (const byte) ultoa::radix#0 = DECIMAL Constant (const dword) jesper_id#0 = $1b244 Constant (const byte[3]) jesper_initials#0 = $1 @@ -1042,12 +1036,12 @@ Constant (const dword) henry_id#0 = $4466d Constant (const byte[3]) henry_initials#0 = $2 Constant (const byte) print_char::ch#0 = ' ' Successful SSA optimization Pass2ConstantIdentification -Constant (const dword*) ultoa::digit_values#1 = RADIX_DECIMAL_VALUES_LONG#0 -Constant (const dword*) ultoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES_LONG#0 -Constant (const dword*) ultoa::digit_values#3 = RADIX_OCTAL_VALUES_LONG#0 -Constant (const dword*) ultoa::digit_values#4 = RADIX_BINARY_VALUES_LONG#0 -Constant (const byte*) ultoa::buffer#5 = decimal_digits_long#0 -Constant (const byte*) print_str::str#1 = decimal_digits_long#0 +Constant (const dword*) ultoa::digit_values#1 = RADIX_DECIMAL_VALUES_LONG +Constant (const dword*) ultoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES_LONG +Constant (const dword*) ultoa::digit_values#3 = RADIX_OCTAL_VALUES_LONG +Constant (const dword*) ultoa::digit_values#4 = RADIX_BINARY_VALUES_LONG +Constant (const byte*) ultoa::buffer#5 = decimal_digits_long +Constant (const byte*) print_str::str#1 = decimal_digits_long Constant (const dword) print_person::person_id#0 = jesper_id#0 Constant (const byte[3]) print_person::person_initials#0 = jesper_initials#0 Constant (const dword) print_person::person_id#1 = henry_id#0 @@ -1107,9 +1101,9 @@ Eliminating unused constant (const dword*) ultoa::digit_values#2 Eliminating unused constant (const dword*) ultoa::digit_values#3 Eliminating unused constant (const dword*) ultoa::digit_values#4 Successful SSA optimization PassNEliminateUnusedVars -Eliminating unused constant (const dword[]) RADIX_BINARY_VALUES_LONG#0 -Eliminating unused constant (const dword[]) RADIX_OCTAL_VALUES_LONG#0 -Eliminating unused constant (const dword[]) RADIX_HEXADECIMAL_VALUES_LONG#0 +Eliminating unused constant (const dword[]) RADIX_BINARY_VALUES_LONG +Eliminating unused constant (const dword[]) RADIX_OCTAL_VALUES_LONG +Eliminating unused constant (const dword[]) RADIX_HEXADECIMAL_VALUES_LONG Successful SSA optimization PassNEliminateUnusedVars Rewriting multiplication to use shift [3] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 * (const byte) SIZEOF_DWORD Successful SSA optimization Pass2MultiplyToShiftRewriting @@ -1126,19 +1120,19 @@ Inlining constant with var siblings (const byte[3]) print_person::person_initial Inlining constant with var siblings (const byte*) print_char_cursor#0 Constant inlined print_person::person_initials#1 = (const byte[3]) henry_initials#0 Constant inlined ultoa::started#1 = (byte) 1 -Constant inlined $0 = (const byte[]) DIGITS#0 +Constant inlined $0 = (const byte[]) DIGITS Constant inlined $1 = (const byte[3]) jesper_initials#0 Constant inlined $2 = (const byte[3]) henry_initials#0 Constant inlined print_char_cursor#0 = (byte*) 1024 -Constant inlined ultoa::buffer#5 = (const byte[$b]) decimal_digits_long#0 +Constant inlined ultoa::buffer#5 = (const byte[$b]) decimal_digits_long Constant inlined print_person::person_id#1 = (const dword) henry_id#0 Constant inlined print_person::person_id#0 = (const dword) jesper_id#0 Constant inlined ultoa::$5 = (const byte) ultoa::max_digits#1-(byte) 1 Constant inlined ultoa::started#0 = (byte) 0 Constant inlined ultoa::digit#0 = (byte) 0 Constant inlined ultoa_append::digit#0 = (byte) 0 -Constant inlined ultoa::digit_values#1 = (const dword[]) RADIX_DECIMAL_VALUES_LONG#0 -Constant inlined print_str::str#1 = (const byte[$b]) decimal_digits_long#0 +Constant inlined ultoa::digit_values#1 = (const dword[]) RADIX_DECIMAL_VALUES_LONG +Constant inlined print_str::str#1 = (const byte[$b]) decimal_digits_long Constant inlined print_person::person_initials#0 = (const byte[3]) jesper_initials#0 Successful SSA optimization Pass2ConstantInlining Eliminating unused constant (const byte) SIZEOF_DWORD @@ -1294,7 +1288,7 @@ print_ln::@return: scope:[print_ln] from print_ln::@1 (void()) print_str((byte*) print_str::str) print_str: scope:[print_str] from print_dword_decimal::@1 print_person::@2 [24] (byte*) print_char_cursor#41 ← phi( print_dword_decimal::@1/(byte*) print_char_cursor#39 print_person::@2/(byte*) print_char_cursor#25 ) - [24] (byte*) print_str::str#5 ← phi( print_dword_decimal::@1/(const byte[$b]) decimal_digits_long#0 print_person::@2/(byte*) print_str::str#2 ) + [24] (byte*) print_str::str#5 ← phi( print_dword_decimal::@1/(const byte[$b]) decimal_digits_long print_person::@2/(byte*) print_str::str#2 ) to:print_str::@1 print_str::@1: scope:[print_str] from print_str print_str::@2 [25] (byte*) print_char_cursor#18 ← phi( print_str/(byte*) print_char_cursor#41 print_str::@2/(byte*) print_char_cursor#1 ) @@ -1337,7 +1331,7 @@ ultoa: scope:[ultoa] from print_dword_decimal [39] phi() to:ultoa::@1 ultoa::@1: scope:[ultoa] from ultoa ultoa::@4 - [40] (byte*) ultoa::buffer#11 ← phi( ultoa::@4/(byte*) ultoa::buffer#14 ultoa/(const byte[$b]) decimal_digits_long#0 ) + [40] (byte*) ultoa::buffer#11 ← phi( ultoa::@4/(byte*) ultoa::buffer#14 ultoa/(const byte[$b]) decimal_digits_long ) [40] (byte) ultoa::started#2 ← phi( ultoa::@4/(byte) ultoa::started#4 ultoa/(byte) 0 ) [40] (dword) ultoa::value#2 ← phi( ultoa::@4/(dword) ultoa::value#6 ultoa/(dword) ultoa::value#1 ) [40] (byte) ultoa::digit#2 ← phi( ultoa::@4/(byte) ultoa::digit#1 ultoa/(byte) 0 ) @@ -1345,7 +1339,7 @@ ultoa::@1: scope:[ultoa] from ultoa ultoa::@4 to:ultoa::@3 ultoa::@3: scope:[ultoa] from ultoa::@1 [42] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 - [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS#0 + (byte~) ultoa::$4) + [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS + (byte~) ultoa::$4) [44] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 [45] *((byte*) ultoa::buffer#3) ← (byte) 0 to:ultoa::@return @@ -1354,7 +1348,7 @@ ultoa::@return: scope:[ultoa] from ultoa::@3 to:@return ultoa::@2: scope:[ultoa] from ultoa::@1 [47] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 - [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (byte~) ultoa::$11) + [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) [49] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@5 to:ultoa::@7 ultoa::@7: scope:[ultoa] from ultoa::@2 @@ -1388,7 +1382,7 @@ ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2 [62] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 to:ultoa_append::@3 ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1 - [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS#0 + (byte) ultoa_append::digit#2) + [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS + (byte) ultoa_append::digit#2) to:ultoa_append::@return ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3 [64] return @@ -1400,14 +1394,8 @@ ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1 VARIABLE REGISTER WEIGHTS -(byte[]) DIGITS (dword) Person::id (byte[3]) Person::initials -(dword[]) RADIX_BINARY_VALUES_LONG -(dword[]) RADIX_DECIMAL_VALUES_LONG -(dword[]) RADIX_HEXADECIMAL_VALUES_LONG -(dword[]) RADIX_OCTAL_VALUES_LONG -(byte[$b]) decimal_digits_long (dword) henry_id (byte[3]) henry_initials (dword) jesper_id @@ -1808,7 +1796,7 @@ print_dword_decimal: { // [24] phi from print_dword_decimal::@1 to print_str [phi:print_dword_decimal::@1->print_str] print_str_from_b1: // [24] phi (byte*) print_char_cursor#41 = (byte*) print_char_cursor#39 [phi:print_dword_decimal::@1->print_str#0] -- register_copy - // [24] phi (byte*) print_str::str#5 = (const byte[$b]) decimal_digits_long#0 [phi:print_dword_decimal::@1->print_str#1] -- pbuz1=pbuc1 + // [24] phi (byte*) print_str::str#5 = (const byte[$b]) decimal_digits_long [phi:print_dword_decimal::@1->print_str#1] -- pbuz1=pbuc1 lda #decimal_digits_long @@ -1841,7 +1829,7 @@ ultoa: { .label buffer_14 = $14 // [40] phi from ultoa to ultoa::@1 [phi:ultoa->ultoa::@1] b1_from_ultoa: - // [40] phi (byte*) ultoa::buffer#11 = (const byte[$b]) decimal_digits_long#0 [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 + // [40] phi (byte*) ultoa::buffer#11 = (const byte[$b]) decimal_digits_long [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 lda #decimal_digits_long @@ -1866,7 +1854,7 @@ ultoa: { // [42] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 -- vbuz1=_byte_vduz2 lda.z value sta.z _4 - // [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS#0 + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 + // [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 ldy.z _4 lda DIGITS,y ldy #0 @@ -1895,7 +1883,7 @@ ultoa: { asl asl sta.z _11 - // [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuz2 + // [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuz2 ldy.z _11 lda RADIX_DECIMAL_VALUES_LONG,y sta.z digit_value @@ -2055,7 +2043,7 @@ ultoa_append: { jmp b3 // ultoa_append::@3 b3: - // [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS#0 + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 + // [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 ldy.z digit lda DIGITS,y ldy #0 @@ -2112,13 +2100,13 @@ Statement [28] *((byte*) print_char_cursor#18) ← *((byte*) print_str::str#3) [ Statement [31] *((byte*) print_char_cursor#18) ← (const byte) print_char::ch#0 [ print_char_cursor#18 ] ( main:2::print_person:5::print_char:13 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#18 ] main:2::print_person:7::print_char:13 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#18 ] ) always clobbers reg byte a reg byte y Statement [34] (dword) ultoa::value#1 ← (dword) print_dword_decimal::w#0 [ print_char_cursor#39 ultoa::value#1 ] ( main:2::print_person:5::print_dword_decimal:11 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::value#1 ] main:2::print_person:7::print_dword_decimal:11 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::value#1 ] ) always clobbers reg byte a Statement [42] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 [ ultoa::buffer#11 ultoa::$4 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ultoa::$4 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ultoa::$4 ] ) always clobbers reg byte a -Statement [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS#0 + (byte~) ultoa::$4) [ ultoa::buffer#11 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] ) always clobbers reg byte a reg byte y +Statement [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS + (byte~) ultoa::$4) [ ultoa::buffer#11 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] ) always clobbers reg byte a reg byte y Statement [44] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 [ ultoa::buffer#3 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#3 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#3 ] ) always clobbers reg byte a Statement [45] *((byte*) ultoa::buffer#3) ← (byte) 0 [ ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ] ) always clobbers reg byte a reg byte y Statement [47] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:14 [ ultoa::digit#2 ultoa::digit#1 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:19 [ ultoa::started#2 ultoa::started#4 ] -Statement [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (byte~) ultoa::$11) [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ) always clobbers reg byte a +Statement [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ) always clobbers reg byte a Statement [50] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ) always clobbers reg byte a Statement [53] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 [ ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] ) always clobbers reg byte a Statement [54] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 [ ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] ) always clobbers reg byte a @@ -2127,7 +2115,7 @@ Statement [57] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 Statement [58] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 [ ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] ) always clobbers reg byte a Statement [62] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:26 [ ultoa_append::digit#2 ultoa_append::digit#1 ] -Statement [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS#0 + (byte) ultoa_append::digit#2) [ ultoa_append::value#2 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] ) always clobbers reg byte a reg byte y +Statement [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS + (byte) ultoa_append::digit#2) [ ultoa_append::value#2 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte y as potential for zp ZP_BYTE:14 [ ultoa::digit#2 ultoa::digit#1 ] Statement [66] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] ) always clobbers reg byte a Statement [6] (byte*~) print_char_cursor#49 ← (byte*) print_line_cursor#1 [ print_char_cursor#49 print_line_cursor#1 ] ( main:2 [ print_char_cursor#49 print_line_cursor#1 ] ) always clobbers reg byte a @@ -2140,11 +2128,11 @@ Statement [28] *((byte*) print_char_cursor#18) ← *((byte*) print_str::str#3) [ Statement [31] *((byte*) print_char_cursor#18) ← (const byte) print_char::ch#0 [ print_char_cursor#18 ] ( main:2::print_person:5::print_char:13 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#18 ] main:2::print_person:7::print_char:13 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#18 ] ) always clobbers reg byte a reg byte y Statement [34] (dword) ultoa::value#1 ← (dword) print_dword_decimal::w#0 [ print_char_cursor#39 ultoa::value#1 ] ( main:2::print_person:5::print_dword_decimal:11 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::value#1 ] main:2::print_person:7::print_dword_decimal:11 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::value#1 ] ) always clobbers reg byte a Statement [42] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 [ ultoa::buffer#11 ultoa::$4 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ultoa::$4 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ultoa::$4 ] ) always clobbers reg byte a -Statement [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS#0 + (byte~) ultoa::$4) [ ultoa::buffer#11 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] ) always clobbers reg byte a reg byte y +Statement [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS + (byte~) ultoa::$4) [ ultoa::buffer#11 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#11 ] ) always clobbers reg byte a reg byte y Statement [44] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 [ ultoa::buffer#3 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#3 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::buffer#3 ] ) always clobbers reg byte a Statement [45] *((byte*) ultoa::buffer#3) ← (byte) 0 [ ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ] ) always clobbers reg byte a reg byte y Statement [47] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] ) always clobbers reg byte a -Statement [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (byte~) ultoa::$11) [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ) always clobbers reg byte a +Statement [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ) always clobbers reg byte a Statement [50] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ) always clobbers reg byte a Statement [53] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 [ ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] ) always clobbers reg byte a Statement [54] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 [ ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] ) always clobbers reg byte a @@ -2152,7 +2140,7 @@ Statement [55] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 [ ul Statement [57] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 [ ultoa::digit#2 ultoa::buffer#11 ultoa_append::return#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::return#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::return#0 ] ) always clobbers reg byte a Statement [58] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 [ ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] ) always clobbers reg byte a Statement [62] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] ) always clobbers reg byte a -Statement [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS#0 + (byte) ultoa_append::digit#2) [ ultoa_append::value#2 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] ) always clobbers reg byte a reg byte y +Statement [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS + (byte) ultoa_append::digit#2) [ ultoa_append::value#2 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] ) always clobbers reg byte a reg byte y Statement [66] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] ( main:2::print_person:5::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] main:2::print_person:7::print_dword_decimal:11::ultoa:35::ultoa_append:56 [ print_person::person_initials#2 print_line_cursor#20 print_char_cursor#39 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] ) always clobbers reg byte a Potential registers zp ZP_DWORD:2 [ print_person::person_id#2 ] : zp ZP_DWORD:2 , Potential registers zp ZP_WORD:6 [ print_person::person_initials#2 ] : zp ZP_WORD:6 , @@ -2462,7 +2450,7 @@ print_dword_decimal: { // [24] phi from print_dword_decimal::@1 to print_str [phi:print_dword_decimal::@1->print_str] print_str_from_b1: // [24] phi (byte*) print_char_cursor#41 = (byte*) print_char_cursor#39 [phi:print_dword_decimal::@1->print_str#0] -- register_copy - // [24] phi (byte*) print_str::str#5 = (const byte[$b]) decimal_digits_long#0 [phi:print_dword_decimal::@1->print_str#1] -- pbuz1=pbuc1 + // [24] phi (byte*) print_str::str#5 = (const byte[$b]) decimal_digits_long [phi:print_dword_decimal::@1->print_str#1] -- pbuz1=pbuc1 lda #decimal_digits_long @@ -2489,7 +2477,7 @@ ultoa: { .label value = 2 // [40] phi from ultoa to ultoa::@1 [phi:ultoa->ultoa::@1] b1_from_ultoa: - // [40] phi (byte*) ultoa::buffer#11 = (const byte[$b]) decimal_digits_long#0 [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 + // [40] phi (byte*) ultoa::buffer#11 = (const byte[$b]) decimal_digits_long [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 lda #decimal_digits_long @@ -2512,7 +2500,7 @@ ultoa: { b3: // [42] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 -- vbuaa=_byte_vduz1 lda.z value - // [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS#0 + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuaa + // [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuaa tay lda DIGITS,y ldy #0 @@ -2537,7 +2525,7 @@ ultoa: { lda.z digit asl asl - // [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuaa + // [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuaa tay lda RADIX_DECIMAL_VALUES_LONG,y sta.z digit_value @@ -2657,7 +2645,7 @@ ultoa_append: { jmp b3 // ultoa_append::@3 b3: - // [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS#0 + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx + // [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx lda DIGITS,x ldy #0 sta (buffer),y @@ -2789,21 +2777,15 @@ FINAL SYMBOL TABLE (label) @1 (label) @begin (label) @end -(byte[]) DIGITS -(const byte[]) DIGITS#0 DIGITS = (string) "0123456789abcdef"z +(const byte[]) DIGITS DIGITS = (string) "0123456789abcdef"z (dword) Person::id (byte[3]) Person::initials (const byte) RADIX::BINARY BINARY = (number) 2 (const byte) RADIX::DECIMAL DECIMAL = (number) $a (const byte) RADIX::HEXADECIMAL HEXADECIMAL = (number) $10 (const byte) RADIX::OCTAL OCTAL = (number) 8 -(dword[]) RADIX_BINARY_VALUES_LONG -(dword[]) RADIX_DECIMAL_VALUES_LONG -(const dword[]) RADIX_DECIMAL_VALUES_LONG#0 RADIX_DECIMAL_VALUES_LONG = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } -(dword[]) RADIX_HEXADECIMAL_VALUES_LONG -(dword[]) RADIX_OCTAL_VALUES_LONG -(byte[$b]) decimal_digits_long -(const byte[$b]) decimal_digits_long#0 decimal_digits_long = { fill( $b, 0) } +(const dword[]) RADIX_DECIMAL_VALUES_LONG RADIX_DECIMAL_VALUES_LONG = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } +(const byte[$b]) decimal_digits_long decimal_digits_long = { fill( $b, 0) } (dword) henry_id (const dword) henry_id#0 henry_id = (dword) $4466d (byte[3]) henry_initials @@ -3149,7 +3131,7 @@ print_dword_decimal: { // [37] call print_str // [24] phi from print_dword_decimal::@1 to print_str [phi:print_dword_decimal::@1->print_str] // [24] phi (byte*) print_char_cursor#41 = (byte*) print_char_cursor#39 [phi:print_dword_decimal::@1->print_str#0] -- register_copy - // [24] phi (byte*) print_str::str#5 = (const byte[$b]) decimal_digits_long#0 [phi:print_dword_decimal::@1->print_str#1] -- pbuz1=pbuc1 + // [24] phi (byte*) print_str::str#5 = (const byte[$b]) decimal_digits_long [phi:print_dword_decimal::@1->print_str#1] -- pbuz1=pbuc1 lda #decimal_digits_long @@ -3174,7 +3156,7 @@ ultoa: { .label digit = $c .label value = 2 // [40] phi from ultoa to ultoa::@1 [phi:ultoa->ultoa::@1] - // [40] phi (byte*) ultoa::buffer#11 = (const byte[$b]) decimal_digits_long#0 [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 + // [40] phi (byte*) ultoa::buffer#11 = (const byte[$b]) decimal_digits_long [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 lda #decimal_digits_long @@ -3197,7 +3179,7 @@ ultoa: { // [42] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 -- vbuaa=_byte_vduz1 lda.z value // *buffer++ = DIGITS[(char)value] - // [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS#0 + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuaa + // [43] *((byte*) ultoa::buffer#11) ← *((const byte[]) DIGITS + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuaa tay lda DIGITS,y ldy #0 @@ -3224,7 +3206,7 @@ ultoa: { lda.z digit asl asl - // [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG#0 + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuaa + // [48] (dword) ultoa::digit_value#0 ← *((const dword[]) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuaa tay lda RADIX_DECIMAL_VALUES_LONG,y sta.z digit_value @@ -3339,7 +3321,7 @@ ultoa_append: { !: // ultoa_append::@3 // *buffer = DIGITS[digit] - // [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS#0 + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx + // [63] *((byte*) ultoa_append::buffer#0) ← *((const byte[]) DIGITS + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx lda DIGITS,x ldy #0 sta (buffer),y diff --git a/src/test/ref/struct-11.sym b/src/test/ref/struct-11.sym index 9f0221138..d26596005 100644 --- a/src/test/ref/struct-11.sym +++ b/src/test/ref/struct-11.sym @@ -1,21 +1,15 @@ (label) @1 (label) @begin (label) @end -(byte[]) DIGITS -(const byte[]) DIGITS#0 DIGITS = (string) "0123456789abcdef"z +(const byte[]) DIGITS DIGITS = (string) "0123456789abcdef"z (dword) Person::id (byte[3]) Person::initials (const byte) RADIX::BINARY BINARY = (number) 2 (const byte) RADIX::DECIMAL DECIMAL = (number) $a (const byte) RADIX::HEXADECIMAL HEXADECIMAL = (number) $10 (const byte) RADIX::OCTAL OCTAL = (number) 8 -(dword[]) RADIX_BINARY_VALUES_LONG -(dword[]) RADIX_DECIMAL_VALUES_LONG -(const dword[]) RADIX_DECIMAL_VALUES_LONG#0 RADIX_DECIMAL_VALUES_LONG = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } -(dword[]) RADIX_HEXADECIMAL_VALUES_LONG -(dword[]) RADIX_OCTAL_VALUES_LONG -(byte[$b]) decimal_digits_long -(const byte[$b]) decimal_digits_long#0 decimal_digits_long = { fill( $b, 0) } +(const dword[]) RADIX_DECIMAL_VALUES_LONG RADIX_DECIMAL_VALUES_LONG = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } +(const byte[$b]) decimal_digits_long decimal_digits_long = { fill( $b, 0) } (dword) henry_id (const dword) henry_id#0 henry_id = (dword) $4466d (byte[3]) henry_initials diff --git a/src/test/ref/struct-ptr-23.cfg b/src/test/ref/struct-ptr-23.cfg index f1a706fc9..cb5d2f370 100644 --- a/src/test/ref/struct-ptr-23.cfg +++ b/src/test/ref/struct-ptr-23.cfg @@ -24,21 +24,21 @@ main::@return: scope:[main] from main::@1 (void()) print_person((struct Person*) print_person::person) print_person: scope:[print_person] from main main::@1 [9] (byte) idx#15 ← phi( main/(byte) 0 main::@1/(byte) idx#10 ) - [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons#0 main::@1/(const struct Person*) main::person#1 ) + [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons main::@1/(const struct Person*) main::person#1 ) [10] (byte~) print_person::$0 ← (byte) '0' + *((byte*)(struct Person*) print_person::person#2) - [11] *((const byte*) SCREEN#0 + (byte) idx#15) ← (byte~) print_person::$0 + [11] *((const byte*) SCREEN + (byte) idx#15) ← (byte~) print_person::$0 [12] (byte) idx#4 ← ++ (byte) idx#15 - [13] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + [13] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [14] (byte) idx#5 ← ++ (byte) idx#4 - [15] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) + [15] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) [16] (byte) idx#6 ← ++ (byte) idx#5 [17] (byte[4]) print_person::$3 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS - [18] *((const byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) + [18] *((const byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) [19] (byte) idx#7 ← ++ (byte) idx#6 [20] (byte[4]) print_person::$4 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS - [21] *((const byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) + [21] *((const byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) [22] (byte) idx#8 ← ++ (byte) idx#7 - [23] *((const byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' + [23] *((const byte*) SCREEN + (byte) idx#8) ← (byte) ' ' [24] (byte) idx#10 ← ++ (byte) idx#8 to:print_person::@return print_person::@return: scope:[print_person] from print_person diff --git a/src/test/ref/struct-ptr-23.log b/src/test/ref/struct-ptr-23.log index bd3d1d956..0d2d4c34c 100644 --- a/src/test/ref/struct-ptr-23.log +++ b/src/test/ref/struct-ptr-23.log @@ -9,13 +9,13 @@ Rewriting struct pointer member access *((struct Person*) print_person::person). CONTROL FLOW GRAPH SSA @begin: scope:[] from - (struct Person[]) persons#0 ← { { (number) 1, (const string) $0 }, { (number) 8, (const string) $1 } } + (struct Person[]) persons ← { { (number) 1, (const string) $0 }, { (number) 8, (const string) $1 } } to:@1 (void()) main() main: scope:[main] from @2 (byte) idx#18 ← phi( @2/(byte) idx#19 ) - (struct Person*) main::person#0 ← (struct Person[]) persons#0 + (struct Person*) main::person#0 ← (struct Person[]) persons (struct Person*) print_person::person#0 ← (struct Person*) main::person#0 call print_person to:main::@1 @@ -37,7 +37,7 @@ main::@return: scope:[main] from main::@2 return to:@return @1: scope:[] from @begin - (byte*) SCREEN#0 ← ((byte*)) (number) $400 + (byte*) SCREEN ← ((byte*)) (number) $400 (byte) idx#3 ← (number) 0 to:@2 @@ -47,20 +47,20 @@ print_person: scope:[print_person] from main main::@1 (struct Person*) print_person::person#2 ← phi( main/(struct Person*) print_person::person#0 main::@1/(struct Person*) print_person::person#1 ) (byte*) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID (byte~) print_person::$0 ← (byte) '0' + *((byte*) print_person::$1) - *((byte*) SCREEN#0 + (byte) idx#15) ← (byte~) print_person::$0 + *((byte*) SCREEN + (byte) idx#15) ← (byte~) print_person::$0 (byte) idx#4 ← ++ (byte) idx#15 - *((byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + *((byte*) SCREEN + (byte) idx#4) ← (byte) ' ' (byte) idx#5 ← ++ (byte) idx#4 (byte[4]) print_person::$2 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS - *((byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4]) print_person::$2 + (number) 0) + *((byte*) SCREEN + (byte) idx#5) ← *((byte[4]) print_person::$2 + (number) 0) (byte) idx#6 ← ++ (byte) idx#5 (byte[4]) print_person::$3 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS - *((byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (number) 1) + *((byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (number) 1) (byte) idx#7 ← ++ (byte) idx#6 (byte[4]) print_person::$4 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS - *((byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (number) 2) + *((byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (number) 2) (byte) idx#8 ← ++ (byte) idx#7 - *((byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' + *((byte*) SCREEN + (byte) idx#8) ← (byte) ' ' (byte) idx#9 ← ++ (byte) idx#8 to:print_person::@return print_person::@return: scope:[print_person] from print_person @@ -91,7 +91,6 @@ SYMBOL TABLE SSA (byte) Person::id (byte[4]) Person::initials (byte*) SCREEN -(byte*) SCREEN#0 (const byte) SIZEOF_STRUCT_PERSON = (byte) 5 (byte) idx (byte) idx#0 @@ -123,7 +122,6 @@ SYMBOL TABLE SSA (struct Person*) main::person#1 (struct Person*) main::person#2 (struct Person[]) persons -(struct Person[]) persons#0 (void()) print_person((struct Person*) print_person::person) (byte~) print_person::$0 (byte*) print_person::$1 @@ -137,13 +135,13 @@ SYMBOL TABLE SSA (struct Person*) print_person::person#2 Adding number conversion cast (unumber) 0 in (byte) idx#3 ← (number) 0 -Adding number conversion cast (unumber) 0 in *((byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4]) print_person::$2 + (number) 0) -Adding number conversion cast (unumber) 1 in *((byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (number) 1) -Adding number conversion cast (unumber) 2 in *((byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (number) 2) +Adding number conversion cast (unumber) 0 in *((byte*) SCREEN + (byte) idx#5) ← *((byte[4]) print_person::$2 + (number) 0) +Adding number conversion cast (unumber) 1 in *((byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (number) 1) +Adding number conversion cast (unumber) 2 in *((byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (number) 2) Successful SSA optimization PassNAddNumberTypeConversions -Added casts to value list in (struct Person[]) persons#0 ← (struct Person[]){ (struct Person){ (byte)(number) 1, (const string) $0 }, (struct Person){ (byte)(number) 8, (const string) $1 } } +Added casts to value list in (struct Person[]) persons ← (struct Person[]){ (struct Person){ (byte)(number) 1, (const string) $0 }, (struct Person){ (byte)(number) 8, (const string) $1 } } Successful SSA optimization PassNAddInitializerValueListTypeCasts -Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400 +Inlining cast (byte*) SCREEN ← (byte*)(number) $400 Inlining cast (byte) idx#3 ← (unumber)(number) 0 Successful SSA optimization Pass2InlineCast Simplifying constant integer cast 1 @@ -176,11 +174,11 @@ Identified constant from value list (struct Person) { id: (byte) 8, initials: (c Successful SSA optimization Pass2ConstantInitializerValueLists Identified constant from value list (struct Person[]) { { id: (byte) 1, initials: (const string) $0 }, { id: (byte) 8, initials: (const string) $1 } } Successful SSA optimization Pass2ConstantInitializerValueLists -Constant (const struct Person[]) persons#0 = { { id: 1, initials: $0 }, { id: 8, initials: $1 } } -Constant (const byte*) SCREEN#0 = (byte*) 1024 +Constant (const struct Person[]) persons = { { id: 1, initials: $0 }, { id: 8, initials: $1 } } +Constant (const byte*) SCREEN = (byte*) 1024 Constant (const byte) idx#19 = 0 Successful SSA optimization Pass2ConstantIdentification -Constant (const struct Person*) main::person#0 = persons#0 +Constant (const struct Person*) main::person#0 = persons Successful SSA optimization Pass2ConstantIdentification Constant (const struct Person*) print_person::person#0 = main::person#0 Successful SSA optimization Pass2ConstantIdentification @@ -188,7 +186,7 @@ Converting *(pointer+n) to pointer[n] [19] (byte~) print_person::$0 ← (byte) ' Successful SSA optimization Pass2InlineDerefIdx Simplifying expression containing zero (byte*)print_person::person#2 in [18] (byte*) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID Simplifying expression containing zero (byte*)print_person::person#2 in [19] (byte~) print_person::$0 ← (byte) '0' + *((byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID) -Simplifying expression containing zero print_person::$2 in [25] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4]) print_person::$2 + (byte) 0) +Simplifying expression containing zero print_person::$2 in [25] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4]) print_person::$2 + (byte) 0) Successful SSA optimization PassNSimplifyExpressionWithZero Eliminating unused variable (byte*) print_person::$1 and assignment [6] (byte*) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 Eliminating unused constant (const byte) OFFSET_STRUCT_PERSON_ID @@ -199,7 +197,7 @@ Constant (const struct Person*) main::person#1 = main::person#0+SIZEOF_STRUCT_PE Successful SSA optimization Pass2ConstantIdentification Constant (const struct Person*) print_person::person#1 = main::person#1 Successful SSA optimization Pass2ConstantIdentification -Converting *(pointer+n) to pointer[n] [12] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4]) print_person::$2) -- *((byte[4])print_person::person#2 + OFFSET_STRUCT_PERSON_INITIALS) +Converting *(pointer+n) to pointer[n] [12] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4]) print_person::$2) -- *((byte[4])print_person::person#2 + OFFSET_STRUCT_PERSON_INITIALS) Successful SSA optimization Pass2InlineDerefIdx Eliminating unused variable (byte[4]) print_person::$2 and assignment [9] (byte[4]) print_person::$2 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS Successful SSA optimization PassNEliminateUnusedVars @@ -208,8 +206,8 @@ Inlining constant with var siblings (const struct Person*) print_person::person# Inlining constant with var siblings (const struct Person*) print_person::person#1 Inlining constant with var siblings (const byte) idx#19 Constant inlined idx#19 = (byte) 0 -Constant inlined print_person::person#0 = (const struct Person[]) persons#0 -Constant inlined main::person#0 = (const struct Person[]) persons#0 +Constant inlined print_person::person#0 = (const struct Person[]) persons +Constant inlined main::person#0 = (const struct Person[]) persons Constant inlined print_person::person#1 = (const struct Person*) main::person#1 Successful SSA optimization Pass2ConstantInlining Constant array inlined into struct $0 = (string) "jgr" @@ -266,21 +264,21 @@ main::@return: scope:[main] from main::@1 (void()) print_person((struct Person*) print_person::person) print_person: scope:[print_person] from main main::@1 [9] (byte) idx#15 ← phi( main/(byte) 0 main::@1/(byte) idx#10 ) - [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons#0 main::@1/(const struct Person*) main::person#1 ) + [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons main::@1/(const struct Person*) main::person#1 ) [10] (byte~) print_person::$0 ← (byte) '0' + *((byte*)(struct Person*) print_person::person#2) - [11] *((const byte*) SCREEN#0 + (byte) idx#15) ← (byte~) print_person::$0 + [11] *((const byte*) SCREEN + (byte) idx#15) ← (byte~) print_person::$0 [12] (byte) idx#4 ← ++ (byte) idx#15 - [13] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + [13] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [14] (byte) idx#5 ← ++ (byte) idx#4 - [15] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) + [15] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) [16] (byte) idx#6 ← ++ (byte) idx#5 [17] (byte[4]) print_person::$3 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS - [18] *((const byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) + [18] *((const byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) [19] (byte) idx#7 ← ++ (byte) idx#6 [20] (byte[4]) print_person::$4 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS - [21] *((const byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) + [21] *((const byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) [22] (byte) idx#8 ← ++ (byte) idx#7 - [23] *((const byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' + [23] *((const byte*) SCREEN + (byte) idx#8) ← (byte) ' ' [24] (byte) idx#10 ← ++ (byte) idx#8 to:print_person::@return print_person::@return: scope:[print_person] from print_person @@ -291,7 +289,6 @@ print_person::@return: scope:[print_person] from print_person VARIABLE REGISTER WEIGHTS (byte) Person::id (byte[4]) Person::initials -(byte*) SCREEN (byte) idx (byte) idx#10 1.0 (byte) idx#15 2.0 @@ -302,7 +299,6 @@ VARIABLE REGISTER WEIGHTS (byte) idx#8 3.0 (void()) main() (struct Person*) main::person -(struct Person[]) persons (void()) print_person((struct Person*) print_person::person) (byte~) print_person::$0 4.0 (byte[4]) print_person::$3 4.0 @@ -387,7 +383,7 @@ main: { // [9] phi (byte) idx#15 = (byte) 0 [phi:main->print_person#0] -- vbuz1=vbuc1 lda #0 sta.z idx_15 - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0 [phi:main->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons [phi:main->print_person#1] -- pssz1=pssc1 lda #persons @@ -427,7 +423,7 @@ print_person: { ldy #0 adc (person),y sta.z _0 - // [11] *((const byte*) SCREEN#0 + (byte) idx#15) ← (byte~) print_person::$0 -- pbuc1_derefidx_vbuz1=vbuz2 + // [11] *((const byte*) SCREEN + (byte) idx#15) ← (byte~) print_person::$0 -- pbuc1_derefidx_vbuz1=vbuz2 lda.z _0 ldy.z idx_15 sta SCREEN,y @@ -435,7 +431,7 @@ print_person: { ldy.z idx_15 iny sty.z idx - // [13] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 + // [13] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 lda #' ' ldy.z idx sta SCREEN,y @@ -443,7 +439,7 @@ print_person: { ldy.z idx iny sty.z idx_5 - // [15] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 + // [15] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 ldx.z idx_5 ldy #OFFSET_STRUCT_PERSON_INITIALS lda (person),y @@ -460,7 +456,7 @@ print_person: { lda #0 adc.z person+1 sta.z _3+1 - // [18] *((const byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 + // [18] *((const byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 ldx.z idx_6 ldy #1 lda (_3),y @@ -477,7 +473,7 @@ print_person: { lda #0 adc.z person+1 sta.z _4+1 - // [21] *((const byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 + // [21] *((const byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 ldx.z idx_7 ldy #2 lda (_4),y @@ -486,7 +482,7 @@ print_person: { ldy.z idx_7 iny sty.z idx_8 - // [23] *((const byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 + // [23] *((const byte*) SCREEN + (byte) idx#8) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 lda #' ' ldy.z idx_8 sta SCREEN,y @@ -511,29 +507,29 @@ REGISTER UPLIFT POTENTIAL REGISTERS Statement [10] (byte~) print_person::$0 ← (byte) '0' + *((byte*)(struct Person*) print_person::person#2) [ print_person::person#2 idx#15 print_person::$0 ] ( main:2::print_person:5 [ print_person::person#2 idx#15 print_person::$0 ] main:2::print_person:7 [ print_person::person#2 idx#15 print_person::$0 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ idx#15 idx#10 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:4 [ idx#15 idx#10 ] -Statement [13] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a +Statement [13] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:6 [ idx#4 ] -Statement [15] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) [ print_person::person#2 idx#5 ] ( main:2::print_person:5 [ print_person::person#2 idx#5 ] main:2::print_person:7 [ print_person::person#2 idx#5 ] ) always clobbers reg byte a reg byte y +Statement [15] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) [ print_person::person#2 idx#5 ] ( main:2::print_person:5 [ print_person::person#2 idx#5 ] main:2::print_person:7 [ print_person::person#2 idx#5 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:7 [ idx#5 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:7 [ idx#5 ] Statement [17] (byte[4]) print_person::$3 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS [ print_person::person#2 idx#6 print_person::$3 ] ( main:2::print_person:5 [ print_person::person#2 idx#6 print_person::$3 ] main:2::print_person:7 [ print_person::person#2 idx#6 print_person::$3 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:8 [ idx#6 ] -Statement [18] *((const byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) [ print_person::person#2 idx#6 ] ( main:2::print_person:5 [ print_person::person#2 idx#6 ] main:2::print_person:7 [ print_person::person#2 idx#6 ] ) always clobbers reg byte a reg byte y +Statement [18] *((const byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) [ print_person::person#2 idx#6 ] ( main:2::print_person:5 [ print_person::person#2 idx#6 ] main:2::print_person:7 [ print_person::person#2 idx#6 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte y as potential for zp ZP_BYTE:8 [ idx#6 ] Statement [20] (byte[4]) print_person::$4 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS [ idx#7 print_person::$4 ] ( main:2::print_person:5 [ idx#7 print_person::$4 ] main:2::print_person:7 [ idx#7 print_person::$4 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:11 [ idx#7 ] -Statement [21] *((const byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) [ idx#7 ] ( main:2::print_person:5 [ idx#7 ] main:2::print_person:7 [ idx#7 ] ) always clobbers reg byte a reg byte y +Statement [21] *((const byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) [ idx#7 ] ( main:2::print_person:5 [ idx#7 ] main:2::print_person:7 [ idx#7 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte y as potential for zp ZP_BYTE:11 [ idx#7 ] -Statement [23] *((const byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' [ idx#8 ] ( main:2::print_person:5 [ idx#8 ] main:2::print_person:7 [ idx#8 ] ) always clobbers reg byte a +Statement [23] *((const byte*) SCREEN + (byte) idx#8) ← (byte) ' ' [ idx#8 ] ( main:2::print_person:5 [ idx#8 ] main:2::print_person:7 [ idx#8 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:14 [ idx#8 ] Statement [10] (byte~) print_person::$0 ← (byte) '0' + *((byte*)(struct Person*) print_person::person#2) [ print_person::person#2 idx#15 print_person::$0 ] ( main:2::print_person:5 [ print_person::person#2 idx#15 print_person::$0 ] main:2::print_person:7 [ print_person::person#2 idx#15 print_person::$0 ] ) always clobbers reg byte a reg byte y -Statement [13] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a -Statement [15] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) [ print_person::person#2 idx#5 ] ( main:2::print_person:5 [ print_person::person#2 idx#5 ] main:2::print_person:7 [ print_person::person#2 idx#5 ] ) always clobbers reg byte a reg byte y +Statement [13] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a +Statement [15] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) [ print_person::person#2 idx#5 ] ( main:2::print_person:5 [ print_person::person#2 idx#5 ] main:2::print_person:7 [ print_person::person#2 idx#5 ] ) always clobbers reg byte a reg byte y Statement [17] (byte[4]) print_person::$3 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS [ print_person::person#2 idx#6 print_person::$3 ] ( main:2::print_person:5 [ print_person::person#2 idx#6 print_person::$3 ] main:2::print_person:7 [ print_person::person#2 idx#6 print_person::$3 ] ) always clobbers reg byte a -Statement [18] *((const byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) [ print_person::person#2 idx#6 ] ( main:2::print_person:5 [ print_person::person#2 idx#6 ] main:2::print_person:7 [ print_person::person#2 idx#6 ] ) always clobbers reg byte a reg byte y +Statement [18] *((const byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) [ print_person::person#2 idx#6 ] ( main:2::print_person:5 [ print_person::person#2 idx#6 ] main:2::print_person:7 [ print_person::person#2 idx#6 ] ) always clobbers reg byte a reg byte y Statement [20] (byte[4]) print_person::$4 ← (byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS [ idx#7 print_person::$4 ] ( main:2::print_person:5 [ idx#7 print_person::$4 ] main:2::print_person:7 [ idx#7 print_person::$4 ] ) always clobbers reg byte a -Statement [21] *((const byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) [ idx#7 ] ( main:2::print_person:5 [ idx#7 ] main:2::print_person:7 [ idx#7 ] ) always clobbers reg byte a reg byte y -Statement [23] *((const byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' [ idx#8 ] ( main:2::print_person:5 [ idx#8 ] main:2::print_person:7 [ idx#8 ] ) always clobbers reg byte a +Statement [21] *((const byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) [ idx#7 ] ( main:2::print_person:5 [ idx#7 ] main:2::print_person:7 [ idx#7 ] ) always clobbers reg byte a reg byte y +Statement [23] *((const byte*) SCREEN + (byte) idx#8) ← (byte) ' ' [ idx#8 ] ( main:2::print_person:5 [ idx#8 ] main:2::print_person:7 [ idx#8 ] ) always clobbers reg byte a Potential registers zp ZP_WORD:2 [ print_person::person#2 ] : zp ZP_WORD:2 , Potential registers zp ZP_BYTE:4 [ idx#15 idx#10 ] : zp ZP_BYTE:4 , reg byte x , Potential registers zp ZP_BYTE:5 [ print_person::$0 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y , @@ -596,7 +592,7 @@ main: { print_person_from_main: // [9] phi (byte) idx#15 = (byte) 0 [phi:main->print_person#0] -- vbuxx=vbuc1 ldx #0 - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0 [phi:main->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons [phi:main->print_person#1] -- pssz1=pssc1 lda #persons @@ -634,16 +630,16 @@ print_person: { clc ldy #0 adc (person),y - // [11] *((const byte*) SCREEN#0 + (byte) idx#15) ← (byte~) print_person::$0 -- pbuc1_derefidx_vbuxx=vbuaa + // [11] *((const byte*) SCREEN + (byte) idx#15) ← (byte~) print_person::$0 -- pbuc1_derefidx_vbuxx=vbuaa sta SCREEN,x // [12] (byte) idx#4 ← ++ (byte) idx#15 -- vbuxx=_inc_vbuxx inx - // [13] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [13] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // [14] (byte) idx#5 ← ++ (byte) idx#4 -- vbuxx=_inc_vbuxx inx - // [15] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 + // [15] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 ldy #OFFSET_STRUCT_PERSON_INITIALS lda (person),y sta SCREEN,x @@ -657,7 +653,7 @@ print_person: { lda #0 adc.z person+1 sta.z _3+1 - // [18] *((const byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 + // [18] *((const byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 ldy #1 lda (_3),y sta SCREEN,x @@ -671,13 +667,13 @@ print_person: { bcc !+ inc.z _4+1 !: - // [21] *((const byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 + // [21] *((const byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 ldy #2 lda (_4),y sta SCREEN,x // [22] (byte) idx#8 ← ++ (byte) idx#7 -- vbuxx=_inc_vbuxx inx - // [23] *((const byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [23] *((const byte*) SCREEN + (byte) idx#8) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // [24] (byte) idx#10 ← ++ (byte) idx#8 -- vbuxx=_inc_vbuxx @@ -729,8 +725,7 @@ FINAL SYMBOL TABLE (const byte) OFFSET_STRUCT_PERSON_INITIALS OFFSET_STRUCT_PERSON_INITIALS = (byte) 1 (byte) Person::id (byte[4]) Person::initials -(byte*) SCREEN -(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) SCREEN SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) 5 (byte) idx (byte) idx#10 reg byte x 1.0 @@ -744,9 +739,8 @@ FINAL SYMBOL TABLE (label) main::@1 (label) main::@return (struct Person*) main::person -(const struct Person*) main::person#1 person = (const struct Person[]) persons#0+(const byte) SIZEOF_STRUCT_PERSON -(struct Person[]) persons -(const struct Person[]) persons#0 persons = { { id: (byte) 1, initials: (string) "jgr" }, { id: (byte) 8, initials: (string) "hbg" } } +(const struct Person*) main::person#1 person = (const struct Person[]) persons+(const byte) SIZEOF_STRUCT_PERSON +(const struct Person[]) persons persons = { { id: (byte) 1, initials: (string) "jgr" }, { id: (byte) 8, initials: (string) "hbg" } } (void()) print_person((struct Person*) print_person::person) (byte~) print_person::$0 reg byte a 4.0 (byte[4]) print_person::$3 $3 zp ZP_WORD:4 4.0 @@ -794,7 +788,7 @@ main: { // [9] phi from main to print_person [phi:main->print_person] // [9] phi (byte) idx#15 = (byte) 0 [phi:main->print_person#0] -- vbuxx=vbuc1 ldx #0 - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0 [phi:main->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons [phi:main->print_person#1] -- pssz1=pssc1 lda #persons @@ -830,20 +824,20 @@ print_person: { ldy #0 adc (person),y // SCREEN[idx++] = '0'+person->id - // [11] *((const byte*) SCREEN#0 + (byte) idx#15) ← (byte~) print_person::$0 -- pbuc1_derefidx_vbuxx=vbuaa + // [11] *((const byte*) SCREEN + (byte) idx#15) ← (byte~) print_person::$0 -- pbuc1_derefidx_vbuxx=vbuaa sta SCREEN,x // SCREEN[idx++] = '0'+person->id; // [12] (byte) idx#4 ← ++ (byte) idx#15 -- vbuxx=_inc_vbuxx inx // SCREEN[idx++] = ' ' - // [13] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [13] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // SCREEN[idx++] = ' '; // [14] (byte) idx#5 ← ++ (byte) idx#4 -- vbuxx=_inc_vbuxx inx // SCREEN[idx++] = person->initials[0] - // [15] *((const byte*) SCREEN#0 + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 + // [15] *((const byte*) SCREEN + (byte) idx#5) ← *((byte[4])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_INITIALS) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 ldy #OFFSET_STRUCT_PERSON_INITIALS lda (person),y sta SCREEN,x @@ -859,7 +853,7 @@ print_person: { lda #0 adc.z person+1 sta.z _3+1 - // [18] *((const byte*) SCREEN#0 + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 + // [18] *((const byte*) SCREEN + (byte) idx#6) ← *((byte[4]) print_person::$3 + (byte) 1) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 ldy #1 lda (_3),y sta SCREEN,x @@ -875,7 +869,7 @@ print_person: { bcc !+ inc.z _4+1 !: - // [21] *((const byte*) SCREEN#0 + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 + // [21] *((const byte*) SCREEN + (byte) idx#7) ← *((byte[4]) print_person::$4 + (byte) 2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 ldy #2 lda (_4),y sta SCREEN,x @@ -883,7 +877,7 @@ print_person: { // [22] (byte) idx#8 ← ++ (byte) idx#7 -- vbuxx=_inc_vbuxx inx // SCREEN[idx++] = ' ' - // [23] *((const byte*) SCREEN#0 + (byte) idx#8) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [23] *((const byte*) SCREEN + (byte) idx#8) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // SCREEN[idx++] = ' '; diff --git a/src/test/ref/struct-ptr-23.sym b/src/test/ref/struct-ptr-23.sym index 7d7e2b76c..0764a7e97 100644 --- a/src/test/ref/struct-ptr-23.sym +++ b/src/test/ref/struct-ptr-23.sym @@ -4,8 +4,7 @@ (const byte) OFFSET_STRUCT_PERSON_INITIALS OFFSET_STRUCT_PERSON_INITIALS = (byte) 1 (byte) Person::id (byte[4]) Person::initials -(byte*) SCREEN -(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) SCREEN SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) 5 (byte) idx (byte) idx#10 reg byte x 1.0 @@ -19,9 +18,8 @@ (label) main::@1 (label) main::@return (struct Person*) main::person -(const struct Person*) main::person#1 person = (const struct Person[]) persons#0+(const byte) SIZEOF_STRUCT_PERSON -(struct Person[]) persons -(const struct Person[]) persons#0 persons = { { id: (byte) 1, initials: (string) "jgr" }, { id: (byte) 8, initials: (string) "hbg" } } +(const struct Person*) main::person#1 person = (const struct Person[]) persons+(const byte) SIZEOF_STRUCT_PERSON +(const struct Person[]) persons persons = { { id: (byte) 1, initials: (string) "jgr" }, { id: (byte) 8, initials: (string) "hbg" } } (void()) print_person((struct Person*) print_person::person) (byte~) print_person::$0 reg byte a 4.0 (byte[4]) print_person::$3 $3 zp ZP_WORD:4 4.0 diff --git a/src/test/ref/struct-ptr-31.cfg b/src/test/ref/struct-ptr-31.cfg index 91307495f..9ee2f909e 100644 --- a/src/test/ref/struct-ptr-31.cfg +++ b/src/test/ref/struct-ptr-31.cfg @@ -24,10 +24,10 @@ main::@return: scope:[main] from main::@1 (void()) print_person((struct Person*) print_person::person) print_person: scope:[print_person] from main main::@1 [9] (byte) idx#13 ← phi( main/(byte) 0 main::@1/(byte) idx#16 ) - [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons#0 main::@1/(const struct Person[]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON ) - [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2)) + [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons main::@1/(const struct Person[]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON ) + [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2)) [11] (byte) idx#4 ← ++ (byte) idx#13 - [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [13] (byte) idx#5 ← ++ (byte) idx#4 to:print_person::@1 print_person::@1: scope:[print_person] from print_person print_person::@2 @@ -37,7 +37,7 @@ print_person::@1: scope:[print_person] from print_person print_person::@2 [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 to:print_person::@3 print_person::@3: scope:[print_person] from print_person::@1 - [17] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' + [17] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [18] (byte) idx#16 ← ++ (byte) idx#14 to:print_person::@return print_person::@return: scope:[print_person] from print_person::@3 @@ -45,7 +45,7 @@ print_person::@return: scope:[print_person] from print_person::@3 to:@return print_person::@2: scope:[print_person] from print_person::@1 [20] (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME - [21] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) + [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) [22] (byte) idx#6 ← ++ (byte) idx#14 [23] (byte) print_person::i#1 ← ++ (byte) print_person::i#2 to:print_person::@1 diff --git a/src/test/ref/struct-ptr-31.log b/src/test/ref/struct-ptr-31.log index 7876d4077..a188d1bfe 100644 --- a/src/test/ref/struct-ptr-31.log +++ b/src/test/ref/struct-ptr-31.log @@ -11,20 +11,20 @@ Culled Empty Block (label) print_person::@6 CONTROL FLOW GRAPH SSA @begin: scope:[] from - (struct Person[]) persons#0 ← { { (number) 4, (const string) $0 }, { (number) 7, (const string) $1 } } + (struct Person[]) persons ← { { (number) 4, (const string) $0 }, { (number) 7, (const string) $1 } } to:@1 (void()) main() main: scope:[main] from @2 (byte) idx#18 ← phi( @2/(byte) idx#20 ) - (struct Person*) print_person::person#0 ← (struct Person[]) persons#0 + (struct Person*) print_person::person#0 ← (struct Person[]) persons call print_person to:main::@1 main::@1: scope:[main] from main (byte) idx#10 ← phi( main/(byte) idx#8 ) (byte) idx#0 ← (byte) idx#10 (number~) main::$3 ← (number) 1 * (const byte) SIZEOF_STRUCT_PERSON - (struct Person*~) main::$1 ← (struct Person[]) persons#0 + (number~) main::$3 + (struct Person*~) main::$1 ← (struct Person[]) persons + (number~) main::$3 (struct Person*) print_person::person#1 ← (struct Person*~) main::$1 call print_person to:main::@2 @@ -38,9 +38,9 @@ main::@return: scope:[main] from main::@2 return to:@return @1: scope:[] from @begin - (byte*) SCREEN#0 ← ((byte*)) (number) $400 + (byte*) SCREEN ← ((byte*)) (number) $400 (byte) idx#3 ← (number) 0 - (byte[]) DIGIT#0 ← (const string) $2 + (byte[]) DIGIT ← (const string) $2 to:@2 (void()) print_person((struct Person*) print_person::person) @@ -48,9 +48,9 @@ print_person: scope:[print_person] from main main::@1 (byte) idx#13 ← phi( main/(byte) idx#18 main::@1/(byte) idx#0 ) (struct Person*) print_person::person#2 ← phi( main/(struct Person*) print_person::person#0 main::@1/(struct Person*) print_person::person#1 ) (byte*) print_person::$0 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID - *((byte*) SCREEN#0 + (byte) idx#13) ← *((byte[]) DIGIT#0 + *((byte*) print_person::$0)) + *((byte*) SCREEN + (byte) idx#13) ← *((byte[]) DIGIT + *((byte*) print_person::$0)) (byte) idx#4 ← ++ (byte) idx#13 - *((byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + *((byte*) SCREEN + (byte) idx#4) ← (byte) ' ' (byte) idx#5 ← ++ (byte) idx#4 (byte) print_person::i#0 ← (number) 0 to:print_person::@1 @@ -67,13 +67,13 @@ print_person::@2: scope:[print_person] from print_person::@1 (byte) print_person::i#3 ← phi( print_person::@1/(byte) print_person::i#2 ) (struct Person*) print_person::person#4 ← phi( print_person::@1/(struct Person*) print_person::person#3 ) (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#4 + (const byte) OFFSET_STRUCT_PERSON_NAME - *((byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#3) + *((byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#3) (byte) idx#6 ← ++ (byte) idx#14 (byte) print_person::i#1 ← ++ (byte) print_person::i#3 to:print_person::@1 print_person::@3: scope:[print_person] from print_person::@1 (byte) idx#15 ← phi( print_person::@1/(byte) idx#19 ) - *((byte*) SCREEN#0 + (byte) idx#15) ← (byte) ' ' + *((byte*) SCREEN + (byte) idx#15) ← (byte) ' ' (byte) idx#7 ← ++ (byte) idx#15 to:print_person::@return print_person::@return: scope:[print_person] from print_person::@3 @@ -101,13 +101,11 @@ SYMBOL TABLE SSA (label) @begin (label) @end (byte[]) DIGIT -(byte[]) DIGIT#0 (const byte) OFFSET_STRUCT_PERSON_ID = (byte) 0 (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1 (byte) Person::id (byte[$10]) Person::name (byte*) SCREEN -(byte*) SCREEN#0 (const byte) SIZEOF_STRUCT_PERSON = (byte) $11 (byte) idx (byte) idx#0 @@ -138,7 +136,6 @@ SYMBOL TABLE SSA (label) main::@2 (label) main::@return (struct Person[]) persons -(struct Person[]) persons#0 (void()) print_person((struct Person*) print_person::person) (byte*) print_person::$0 (byte[$10]) print_person::$1 @@ -166,9 +163,9 @@ Adding number conversion cast (unumber) 0 in (byte) idx#3 ← (number) 0 Adding number conversion cast (unumber) 0 in (byte) print_person::i#0 ← (number) 0 Adding number conversion cast (unumber) 0 in (bool~) print_person::$3 ← (number) 0 != *((byte[$10]) print_person::$1 + (byte) print_person::i#2) Successful SSA optimization PassNAddNumberTypeConversions -Added casts to value list in (struct Person[]) persons#0 ← (struct Person[]){ (struct Person){ (byte)(number) 4, (const string) $0 }, (struct Person){ (byte)(number) 7, (const string) $1 } } +Added casts to value list in (struct Person[]) persons ← (struct Person[]){ (struct Person){ (byte)(number) 4, (const string) $0 }, (struct Person){ (byte)(number) 7, (const string) $1 } } Successful SSA optimization PassNAddInitializerValueListTypeCasts -Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400 +Inlining cast (byte*) SCREEN ← (byte*)(number) $400 Inlining cast (byte) idx#3 ← (unumber)(number) 0 Inlining cast (byte) print_person::i#0 ← (unumber)(number) 0 Successful SSA optimization Pass2InlineCast @@ -211,26 +208,26 @@ Identified constant from value list (struct Person) { id: (byte) 7, name: (const Successful SSA optimization Pass2ConstantInitializerValueLists Identified constant from value list (struct Person[]) { { id: (byte) 4, name: (const string) $0 }, { id: (byte) 7, name: (const string) $1 } } Successful SSA optimization Pass2ConstantInitializerValueLists -Constant (const struct Person[]) persons#0 = { { id: 4, name: $0 }, { id: 7, name: $1 } } +Constant (const struct Person[]) persons = { { id: 4, name: $0 }, { id: 7, name: $1 } } Constant (const byte) main::$3 = 1*SIZEOF_STRUCT_PERSON -Constant (const byte*) SCREEN#0 = (byte*) 1024 +Constant (const byte*) SCREEN = (byte*) 1024 Constant (const byte) idx#20 = 0 -Constant (const byte[]) DIGIT#0 = $2 +Constant (const byte[]) DIGIT = $2 Constant (const byte) print_person::i#0 = 0 Successful SSA optimization Pass2ConstantIdentification -Constant (const struct Person*) print_person::person#0 = persons#0 +Constant (const struct Person*) print_person::person#0 = persons Successful SSA optimization Pass2ConstantIdentification -Converting *(pointer+n) to pointer[n] [20] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*) print_person::$0)) -- *((byte*)print_person::person#2 + OFFSET_STRUCT_PERSON_ID) +Converting *(pointer+n) to pointer[n] [20] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*) print_person::$0)) -- *((byte*)print_person::person#2 + OFFSET_STRUCT_PERSON_ID) Successful SSA optimization Pass2InlineDerefIdx Simplifying expression containing zero (byte*)print_person::person#2 in [19] (byte*) print_person::$0 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID -Simplifying expression containing zero (byte*)print_person::person#2 in [20] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID)) +Simplifying expression containing zero (byte*)print_person::person#2 in [20] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID)) Successful SSA optimization PassNSimplifyExpressionWithZero Eliminating unused variable (byte*) print_person::$0 and assignment [5] (byte*) print_person::$0 ← (byte*)(struct Person*) print_person::person#2 Eliminating unused constant (const byte) OFFSET_STRUCT_PERSON_ID Successful SSA optimization PassNEliminateUnusedVars -Constant right-side identified [1] (struct Person*) print_person::person#1 ← (const struct Person[]) persons#0 + (const byte) main::$3 +Constant right-side identified [1] (struct Person*) print_person::person#1 ← (const struct Person[]) persons + (const byte) main::$3 Successful SSA optimization Pass2ConstantRValueConsolidation -Constant (const struct Person*) print_person::person#1 = persons#0+main::$3 +Constant (const struct Person*) print_person::person#1 = persons+main::$3 Successful SSA optimization Pass2ConstantIdentification Inlining constant with var siblings (const byte) print_person::i#0 Inlining constant with var siblings (const struct Person*) print_person::person#0 @@ -238,10 +235,10 @@ Inlining constant with var siblings (const struct Person*) print_person::person# Inlining constant with var siblings (const byte) idx#20 Constant inlined idx#20 = (byte) 0 Constant inlined main::$3 = (byte) 1*(const byte) SIZEOF_STRUCT_PERSON -Constant inlined print_person::person#0 = (const struct Person[]) persons#0 +Constant inlined print_person::person#0 = (const struct Person[]) persons Constant inlined print_person::i#0 = (byte) 0 -Constant inlined $2 = (const byte[]) DIGIT#0 -Constant inlined print_person::person#1 = (const struct Person[]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON +Constant inlined $2 = (const byte[]) DIGIT +Constant inlined print_person::person#1 = (const struct Person[]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON Successful SSA optimization Pass2ConstantInlining Constant array inlined into struct $0 = (string) "jesper" Constant array inlined into struct $1 = (string) "henriette" @@ -300,10 +297,10 @@ main::@return: scope:[main] from main::@1 (void()) print_person((struct Person*) print_person::person) print_person: scope:[print_person] from main main::@1 [9] (byte) idx#13 ← phi( main/(byte) 0 main::@1/(byte) idx#16 ) - [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons#0 main::@1/(const struct Person[]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON ) - [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2)) + [9] (struct Person*) print_person::person#2 ← phi( main/(const struct Person[]) persons main::@1/(const struct Person[]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON ) + [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2)) [11] (byte) idx#4 ← ++ (byte) idx#13 - [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [13] (byte) idx#5 ← ++ (byte) idx#4 to:print_person::@1 print_person::@1: scope:[print_person] from print_person print_person::@2 @@ -313,7 +310,7 @@ print_person::@1: scope:[print_person] from print_person print_person::@2 [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 to:print_person::@3 print_person::@3: scope:[print_person] from print_person::@1 - [17] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' + [17] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [18] (byte) idx#16 ← ++ (byte) idx#14 to:print_person::@return print_person::@return: scope:[print_person] from print_person::@3 @@ -321,17 +318,15 @@ print_person::@return: scope:[print_person] from print_person::@3 to:@return print_person::@2: scope:[print_person] from print_person::@1 [20] (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME - [21] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) + [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) [22] (byte) idx#6 ← ++ (byte) idx#14 [23] (byte) print_person::i#1 ← ++ (byte) print_person::i#2 to:print_person::@1 VARIABLE REGISTER WEIGHTS -(byte[]) DIGIT (byte) Person::id (byte[$10]) Person::name -(byte*) SCREEN (byte) idx (byte) idx#13 3.0 (byte) idx#14 6.5 @@ -340,7 +335,6 @@ VARIABLE REGISTER WEIGHTS (byte) idx#5 4.0 (byte) idx#6 11.0 (void()) main() -(struct Person[]) persons (void()) print_person((struct Person*) print_person::person) (byte[$10]) print_person::$1 22.0 (byte[$10]) print_person::$2 22.0 @@ -416,7 +410,7 @@ main: { // [9] phi (byte) idx#13 = (byte) 0 [phi:main->print_person#0] -- vbuz1=vbuc1 lda #0 sta.z idx_13 - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0 [phi:main->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons [phi:main->print_person#1] -- pssz1=pssc1 lda #persons @@ -431,7 +425,7 @@ main: { // [9] phi from main::@1 to print_person [phi:main::@1->print_person] print_person_from_b1: // [9] phi (byte) idx#13 = (byte) idx#16 [phi:main::@1->print_person#0] -- register_copy - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON [phi:main::@1->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON [phi:main::@1->print_person#1] -- pssz1=pssc1 lda #persons+1*SIZEOF_STRUCT_PERSON @@ -450,7 +444,7 @@ print_person: { .label _2 = $a .label i = 5 .label person = 2 - // [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2)) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_(_deref_pbuz2) + // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2)) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_(_deref_pbuz2) ldx.z idx_13 ldy #0 lda (person),y @@ -461,7 +455,7 @@ print_person: { ldy.z idx_13 iny sty.z idx - // [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 + // [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 lda #' ' ldy.z idx sta SCREEN,y @@ -494,7 +488,7 @@ print_person: { jmp b3 // print_person::@3 b3: - // [17] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 + // [17] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 lda #' ' ldy.z idx_14 sta SCREEN,y @@ -517,7 +511,7 @@ print_person: { lda #0 adc.z person+1 sta.z _2+1 - // [21] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz3 + // [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz3 ldx.z idx_14 ldy.z i lda (_2),y @@ -545,25 +539,25 @@ print_person: { .byte 0 REGISTER UPLIFT POTENTIAL REGISTERS -Statement [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2)) [ print_person::person#2 idx#13 ] ( main:2::print_person:5 [ print_person::person#2 idx#13 ] main:2::print_person:7 [ print_person::person#2 idx#13 ] ) always clobbers reg byte a reg byte y +Statement [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2)) [ print_person::person#2 idx#13 ] ( main:2::print_person:5 [ print_person::person#2 idx#13 ] main:2::print_person:7 [ print_person::person#2 idx#13 ] ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ idx#13 idx#16 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:4 [ idx#13 idx#16 ] -Statement [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a +Statement [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:7 [ idx#4 ] Statement [15] (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME [ print_person::person#2 print_person::i#2 idx#14 print_person::$1 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 print_person::$1 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 print_person::$1 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ print_person::i#2 print_person::i#1 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:6 [ idx#14 idx#5 idx#6 ] Statement [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 [ print_person::person#2 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 ] ) always clobbers reg byte a -Statement [17] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a +Statement [17] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a Statement [20] (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME [ print_person::person#2 print_person::i#2 idx#14 print_person::$2 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 print_person::$2 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 print_person::$2 ] ) always clobbers reg byte a -Statement [21] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) [ print_person::person#2 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 ] ) always clobbers reg byte a -Statement [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2)) [ print_person::person#2 idx#13 ] ( main:2::print_person:5 [ print_person::person#2 idx#13 ] main:2::print_person:7 [ print_person::person#2 idx#13 ] ) always clobbers reg byte a reg byte y -Statement [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a +Statement [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) [ print_person::person#2 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 ] ) always clobbers reg byte a +Statement [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2)) [ print_person::person#2 idx#13 ] ( main:2::print_person:5 [ print_person::person#2 idx#13 ] main:2::print_person:7 [ print_person::person#2 idx#13 ] ) always clobbers reg byte a reg byte y +Statement [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [ print_person::person#2 idx#4 ] ( main:2::print_person:5 [ print_person::person#2 idx#4 ] main:2::print_person:7 [ print_person::person#2 idx#4 ] ) always clobbers reg byte a Statement [15] (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME [ print_person::person#2 print_person::i#2 idx#14 print_person::$1 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 print_person::$1 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 print_person::$1 ] ) always clobbers reg byte a Statement [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 [ print_person::person#2 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 ] ) always clobbers reg byte a -Statement [17] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a +Statement [17] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a Statement [20] (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME [ print_person::person#2 print_person::i#2 idx#14 print_person::$2 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 print_person::$2 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 print_person::$2 ] ) always clobbers reg byte a -Statement [21] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) [ print_person::person#2 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 ] ) always clobbers reg byte a +Statement [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) [ print_person::person#2 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person#2 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person#2 print_person::i#2 idx#14 ] ) always clobbers reg byte a Potential registers zp ZP_WORD:2 [ print_person::person#2 ] : zp ZP_WORD:2 , Potential registers zp ZP_BYTE:4 [ idx#13 idx#16 ] : zp ZP_BYTE:4 , reg byte x , Potential registers zp ZP_BYTE:5 [ print_person::i#2 print_person::i#1 ] : zp ZP_BYTE:5 , reg byte x , reg byte y , @@ -619,7 +613,7 @@ main: { print_person_from_main: // [9] phi (byte) idx#13 = (byte) 0 [phi:main->print_person#0] -- vbuxx=vbuc1 ldx #0 - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0 [phi:main->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons [phi:main->print_person#1] -- pssz1=pssc1 lda #persons @@ -634,7 +628,7 @@ main: { // [9] phi from main::@1 to print_person [phi:main::@1->print_person] print_person_from_b1: // [9] phi (byte) idx#13 = (byte) idx#16 [phi:main::@1->print_person#0] -- register_copy - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON [phi:main::@1->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON [phi:main::@1->print_person#1] -- pssz1=pssc1 lda #persons+1*SIZEOF_STRUCT_PERSON @@ -652,7 +646,7 @@ print_person: { .label _1 = 4 .label _2 = 6 .label person = 2 - // [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2)) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_(_deref_pbuz1) + // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2)) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_(_deref_pbuz1) ldy #0 lda (person),y tay @@ -660,7 +654,7 @@ print_person: { sta SCREEN,x // [11] (byte) idx#4 ← ++ (byte) idx#13 -- vbuxx=_inc_vbuxx inx - // [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // [13] (byte) idx#5 ← ++ (byte) idx#4 -- vbuxx=_inc_vbuxx @@ -688,7 +682,7 @@ print_person: { jmp b3 // print_person::@3 b3: - // [17] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [17] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // [18] (byte) idx#16 ← ++ (byte) idx#14 -- vbuxx=_inc_vbuxx @@ -708,7 +702,7 @@ print_person: { lda #0 adc.z person+1 sta.z _2+1 - // [21] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy + // [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy lda (_2),y sta SCREEN,x // [22] (byte) idx#6 ← ++ (byte) idx#14 -- vbuxx=_inc_vbuxx @@ -768,13 +762,11 @@ FINAL SYMBOL TABLE (label) @1 (label) @begin (label) @end -(byte[]) DIGIT -(const byte[]) DIGIT#0 DIGIT = (string) "0123456789" +(const byte[]) DIGIT DIGIT = (string) "0123456789" (const byte) OFFSET_STRUCT_PERSON_NAME OFFSET_STRUCT_PERSON_NAME = (byte) 1 (byte) Person::id (byte[$10]) Person::name -(byte*) SCREEN -(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) SCREEN SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) $11 (byte) idx (byte) idx#13 reg byte x 3.0 @@ -786,8 +778,7 @@ FINAL SYMBOL TABLE (void()) main() (label) main::@1 (label) main::@return -(struct Person[]) persons -(const struct Person[]) persons#0 persons = { { id: (byte) 4, name: (string) "jesper" }, { id: (byte) 7, name: (string) "henriette" } } +(const struct Person[]) persons persons = { { id: (byte) 4, name: (string) "jesper" }, { id: (byte) 7, name: (string) "henriette" } } (void()) print_person((struct Person*) print_person::person) (byte[$10]) print_person::$1 $1 zp ZP_WORD:4 22.0 (byte[$10]) print_person::$2 $2 zp ZP_WORD:6 22.0 @@ -837,7 +828,7 @@ main: { // [9] phi from main to print_person [phi:main->print_person] // [9] phi (byte) idx#13 = (byte) 0 [phi:main->print_person#0] -- vbuxx=vbuc1 ldx #0 - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0 [phi:main->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons [phi:main->print_person#1] -- pssz1=pssc1 lda #persons @@ -849,7 +840,7 @@ main: { // [7] call print_person // [9] phi from main::@1 to print_person [phi:main::@1->print_person] // [9] phi (byte) idx#13 = (byte) idx#16 [phi:main::@1->print_person#0] -- register_copy - // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON [phi:main::@1->print_person#1] -- pssz1=pssc1 + // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON [phi:main::@1->print_person#1] -- pssz1=pssc1 lda #persons+1*SIZEOF_STRUCT_PERSON @@ -867,7 +858,7 @@ print_person: { .label _2 = 6 .label person = 2 // SCREEN[idx++] = DIGIT[person->id] - // [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + *((byte*)(struct Person*) print_person::person#2)) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_(_deref_pbuz1) + // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2)) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_(_deref_pbuz1) ldy #0 lda (person),y tay @@ -877,7 +868,7 @@ print_person: { // [11] (byte) idx#4 ← ++ (byte) idx#13 -- vbuxx=_inc_vbuxx inx // SCREEN[idx++] = ' ' - // [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // SCREEN[idx++] = ' '; @@ -904,7 +895,7 @@ print_person: { bne b2 // print_person::@3 // SCREEN[idx++] = ' ' - // [17] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [17] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // SCREEN[idx++] = ' '; @@ -925,7 +916,7 @@ print_person: { lda #0 adc.z person+1 sta.z _2+1 - // [21] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy + // [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy lda (_2),y sta SCREEN,x // SCREEN[idx++] = person->name[i]; diff --git a/src/test/ref/struct-ptr-31.sym b/src/test/ref/struct-ptr-31.sym index df56ffe0c..ff4bb9815 100644 --- a/src/test/ref/struct-ptr-31.sym +++ b/src/test/ref/struct-ptr-31.sym @@ -1,13 +1,11 @@ (label) @1 (label) @begin (label) @end -(byte[]) DIGIT -(const byte[]) DIGIT#0 DIGIT = (string) "0123456789" +(const byte[]) DIGIT DIGIT = (string) "0123456789" (const byte) OFFSET_STRUCT_PERSON_NAME OFFSET_STRUCT_PERSON_NAME = (byte) 1 (byte) Person::id (byte[$10]) Person::name -(byte*) SCREEN -(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) SCREEN SCREEN = (byte*) 1024 (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) $11 (byte) idx (byte) idx#13 reg byte x 3.0 @@ -19,8 +17,7 @@ (void()) main() (label) main::@1 (label) main::@return -(struct Person[]) persons -(const struct Person[]) persons#0 persons = { { id: (byte) 4, name: (string) "jesper" }, { id: (byte) 7, name: (string) "henriette" } } +(const struct Person[]) persons persons = { { id: (byte) 4, name: (string) "jesper" }, { id: (byte) 7, name: (string) "henriette" } } (void()) print_person((struct Person*) print_person::person) (byte[$10]) print_person::$1 $1 zp ZP_WORD:4 22.0 (byte[$10]) print_person::$2 $2 zp ZP_WORD:6 22.0 diff --git a/src/test/ref/struct-ptr-32.cfg b/src/test/ref/struct-ptr-32.cfg index 89808b2f4..f0b9979d5 100644 --- a/src/test/ref/struct-ptr-32.cfg +++ b/src/test/ref/struct-ptr-32.cfg @@ -10,14 +10,14 @@ (void()) main() main: scope:[main] from @1 - [4] *((byte*)(const struct Person[2]) persons#0) ← (byte) 7 - [5] *((byte*)(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 - [6] *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' - [7] *((byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' - [8] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 - [9] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b - [10] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) - [11] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) + [4] *((byte*)(const struct Person[2]) persons) ← (byte) 7 + [5] *((byte*)(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 + [6] *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' + [7] *((byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' + [8] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 + [9] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b + [10] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) + [11] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) to:main::@return main::@return: scope:[main] from main [12] return diff --git a/src/test/ref/struct-ptr-32.log b/src/test/ref/struct-ptr-32.log index 301c8e7ab..ba72aa412 100644 --- a/src/test/ref/struct-ptr-32.log +++ b/src/test/ref/struct-ptr-32.log @@ -18,38 +18,38 @@ Rewriting struct pointer member access *((struct Person*) main::person).name CONTROL FLOW GRAPH SSA @begin: scope:[] from - (struct Person[2]) persons#0 ← { fill( 2, 0) } + (struct Person[2]) persons ← { fill( 2, 0) } to:@1 (void()) main() main: scope:[main] from @1 (number~) main::$0 ← (number) 0 * (const byte) SIZEOF_STRUCT_PERSON - (byte*) main::$6 ← (byte*)(struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_ID + (byte*) main::$6 ← (byte*)(struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_ID *((byte*) main::$6 + (number~) main::$0) ← (number) 7 (number~) main::$1 ← (number) 1 * (const byte) SIZEOF_STRUCT_PERSON - (byte*) main::$7 ← (byte*)(struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_ID + (byte*) main::$7 ← (byte*)(struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_ID *((byte*) main::$7 + (number~) main::$1) ← (number) 9 (number~) main::$2 ← (number) 0 * (const byte) SIZEOF_STRUCT_PERSON - (byte[$d]) main::$8 ← (byte[$d])(struct Person[2]) persons#0 + (number~) main::$2 + (byte[$d]) main::$8 ← (byte[$d])(struct Person[2]) persons + (number~) main::$2 (byte[$d]) main::$9 ← (byte[$d]) main::$8 + (const byte) OFFSET_STRUCT_PERSON_NAME *((byte[$d]) main::$9 + (number) 8) ← (byte) 'a' (number~) main::$3 ← (number) 1 * (const byte) SIZEOF_STRUCT_PERSON - (byte[$d]) main::$10 ← (byte[$d])(struct Person[2]) persons#0 + (number~) main::$3 + (byte[$d]) main::$10 ← (byte[$d])(struct Person[2]) persons + (number~) main::$3 (byte[$d]) main::$11 ← (byte[$d]) main::$10 + (const byte) OFFSET_STRUCT_PERSON_NAME *((byte[$d]) main::$11 + (number) 8) ← (byte) 'b' (number~) main::$4 ← (number) 0 * (const byte) SIZEOF_STRUCT_PERSON - (word*) main::$12 ← (word*)(struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_AGE + (word*) main::$12 ← (word*)(struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_AGE *((word*) main::$12 + (number~) main::$4) ← (number) $141 (number~) main::$5 ← (number) 1 * (const byte) SIZEOF_STRUCT_PERSON - (word*) main::$13 ← (word*)(struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_AGE + (word*) main::$13 ← (word*)(struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_AGE *((word*) main::$13 + (number~) main::$5) ← (number) $7b - (byte*) main::SCREEN#0 ← ((byte*)) (number) $400 - (struct Person*) main::person#0 ← (struct Person[2]) persons#0 + (byte*) main::SCREEN ← ((byte*)) (number) $400 + (struct Person*) main::person#0 ← (struct Person[2]) persons (byte[$d]) main::$14 ← (byte[$d])(struct Person*) main::person#0 + (const byte) OFFSET_STRUCT_PERSON_NAME - *((byte*) main::SCREEN#0 + (number) 0) ← *((byte[$d]) main::$14 + (number) 8) + *((byte*) main::SCREEN + (number) 0) ← *((byte[$d]) main::$14 + (number) 8) (struct Person*) main::person#1 ← (struct Person*) main::person#0 + (const byte) SIZEOF_STRUCT_PERSON (byte[$d]) main::$15 ← (byte[$d])(struct Person*) main::person#1 + (const byte) OFFSET_STRUCT_PERSON_NAME - *((byte*) main::SCREEN#0 + (number) 1) ← *((byte[$d]) main::$15 + (number) 8) + *((byte*) main::SCREEN + (number) 1) ← *((byte[$d]) main::$15 + (number) 8) to:main::@return main::@return: scope:[main] from main return @@ -92,12 +92,10 @@ SYMBOL TABLE SSA (byte[$d]) main::$9 (label) main::@return (byte*) main::SCREEN -(byte*) main::SCREEN#0 (struct Person*) main::person (struct Person*) main::person#0 (struct Person*) main::person#1 (struct Person[2]) persons -(struct Person[2]) persons#0 Adding number conversion cast (unumber) 0 in (number~) main::$0 ← (number) 0 * (const byte) SIZEOF_STRUCT_PERSON Adding number conversion cast (unumber) main::$0 in (number~) main::$0 ← (unumber)(number) 0 * (const byte) SIZEOF_STRUCT_PERSON @@ -117,16 +115,16 @@ Adding number conversion cast (unumber) $141 in *((word*) main::$12 + (unumber~) Adding number conversion cast (unumber) 1 in (number~) main::$5 ← (number) 1 * (const byte) SIZEOF_STRUCT_PERSON Adding number conversion cast (unumber) main::$5 in (number~) main::$5 ← (unumber)(number) 1 * (const byte) SIZEOF_STRUCT_PERSON Adding number conversion cast (unumber) $7b in *((word*) main::$13 + (unumber~) main::$5) ← (number) $7b -Adding number conversion cast (unumber) 8 in *((byte*) main::SCREEN#0 + (number) 0) ← *((byte[$d]) main::$14 + (number) 8) -Adding number conversion cast (unumber) 0 in *((byte*) main::SCREEN#0 + (number) 0) ← *((byte[$d]) main::$14 + (unumber)(number) 8) -Adding number conversion cast (unumber) 8 in *((byte*) main::SCREEN#0 + (number) 1) ← *((byte[$d]) main::$15 + (number) 8) -Adding number conversion cast (unumber) 1 in *((byte*) main::SCREEN#0 + (number) 1) ← *((byte[$d]) main::$15 + (unumber)(number) 8) +Adding number conversion cast (unumber) 8 in *((byte*) main::SCREEN + (number) 0) ← *((byte[$d]) main::$14 + (number) 8) +Adding number conversion cast (unumber) 0 in *((byte*) main::SCREEN + (number) 0) ← *((byte[$d]) main::$14 + (unumber)(number) 8) +Adding number conversion cast (unumber) 8 in *((byte*) main::SCREEN + (number) 1) ← *((byte[$d]) main::$15 + (number) 8) +Adding number conversion cast (unumber) 1 in *((byte*) main::SCREEN + (number) 1) ← *((byte[$d]) main::$15 + (unumber)(number) 8) Successful SSA optimization PassNAddNumberTypeConversions Inlining cast *((byte*) main::$6 + (unumber~) main::$0) ← (unumber)(number) 7 Inlining cast *((byte*) main::$7 + (unumber~) main::$1) ← (unumber)(number) 9 Inlining cast *((word*) main::$12 + (unumber~) main::$4) ← (unumber)(number) $141 Inlining cast *((word*) main::$13 + (unumber~) main::$5) ← (unumber)(number) $7b -Inlining cast (byte*) main::SCREEN#0 ← (byte*)(number) $400 +Inlining cast (byte*) main::SCREEN ← (byte*)(number) $400 Successful SSA optimization Pass2InlineCast Simplifying constant integer cast 0 Simplifying constant integer cast 7 @@ -169,7 +167,7 @@ Inferred type updated to byte in (unumber~) main::$2 ← (byte) 0 * (const byte) Inferred type updated to byte in (unumber~) main::$3 ← (byte) 1 * (const byte) SIZEOF_STRUCT_PERSON Inferred type updated to byte in (unumber~) main::$4 ← (byte) 0 * (const byte) SIZEOF_STRUCT_PERSON Inferred type updated to byte in (unumber~) main::$5 ← (byte) 1 * (const byte) SIZEOF_STRUCT_PERSON -Constant right-side identified [0] (struct Person[2]) persons#0 ← { fill( 2, 0) } +Constant right-side identified [0] (struct Person[2]) persons ← { fill( 2, 0) } Constant right-side identified [1] (byte~) main::$0 ← (byte) 0 * (const byte) SIZEOF_STRUCT_PERSON Constant right-side identified [4] (byte~) main::$1 ← (byte) 1 * (const byte) SIZEOF_STRUCT_PERSON Constant right-side identified [7] (byte~) main::$2 ← (byte) 0 * (const byte) SIZEOF_STRUCT_PERSON @@ -177,53 +175,53 @@ Constant right-side identified [11] (byte~) main::$3 ← (byte) 1 * (const byte) Constant right-side identified [15] (byte~) main::$4 ← (byte) 0 * (const byte) SIZEOF_STRUCT_PERSON Constant right-side identified [18] (byte~) main::$5 ← (byte) 1 * (const byte) SIZEOF_STRUCT_PERSON Successful SSA optimization Pass2ConstantRValueConsolidation -Constant (const struct Person[2]) persons#0 = { fill( 2, 0) } +Constant (const struct Person[2]) persons = { fill( 2, 0) } Constant (const byte) main::$0 = 0*SIZEOF_STRUCT_PERSON Constant (const byte) main::$1 = 1*SIZEOF_STRUCT_PERSON Constant (const byte) main::$2 = 0*SIZEOF_STRUCT_PERSON Constant (const byte) main::$3 = 1*SIZEOF_STRUCT_PERSON Constant (const byte) main::$4 = 0*SIZEOF_STRUCT_PERSON Constant (const byte) main::$5 = 1*SIZEOF_STRUCT_PERSON -Constant (const byte*) main::SCREEN#0 = (byte*) 1024 +Constant (const byte*) main::SCREEN = (byte*) 1024 Successful SSA optimization Pass2ConstantIdentification -Constant (const struct Person*) main::person#0 = persons#0 +Constant (const struct Person*) main::person#0 = persons Successful SSA optimization Pass2ConstantIdentification -Constant value identified (byte*)persons#0 in [2] (byte*) main::$6 ← (byte*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_ID -Constant value identified (byte*)persons#0 in [5] (byte*) main::$7 ← (byte*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_ID -Constant value identified (byte[$d])persons#0 in [8] (byte[$d]) main::$8 ← (byte[$d])(const struct Person[2]) persons#0 + (const byte) main::$2 -Constant value identified (byte[$d])persons#0 in [12] (byte[$d]) main::$10 ← (byte[$d])(const struct Person[2]) persons#0 + (const byte) main::$3 -Constant value identified (word*)persons#0 in [16] (word*) main::$12 ← (word*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_AGE -Constant value identified (word*)persons#0 in [19] (word*) main::$13 ← (word*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_AGE +Constant value identified (byte*)persons in [2] (byte*) main::$6 ← (byte*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_ID +Constant value identified (byte*)persons in [5] (byte*) main::$7 ← (byte*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_ID +Constant value identified (byte[$d])persons in [8] (byte[$d]) main::$8 ← (byte[$d])(const struct Person[2]) persons + (const byte) main::$2 +Constant value identified (byte[$d])persons in [12] (byte[$d]) main::$10 ← (byte[$d])(const struct Person[2]) persons + (const byte) main::$3 +Constant value identified (word*)persons in [16] (word*) main::$12 ← (word*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_AGE +Constant value identified (word*)persons in [19] (word*) main::$13 ← (word*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_AGE Constant value identified (byte[$d])main::person#0 in [23] (byte[$d]) main::$14 ← (byte[$d])(const struct Person*) main::person#0 + (const byte) OFFSET_STRUCT_PERSON_NAME Successful SSA optimization Pass2ConstantValues Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_PERSON in Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_PERSON in Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_PERSON in Successful SSA optimization PassNSimplifyConstantZero -Simplifying expression containing zero (byte*)persons#0 in [2] (byte*) main::$6 ← (byte*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_ID +Simplifying expression containing zero (byte*)persons in [2] (byte*) main::$6 ← (byte*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_ID Simplifying expression containing zero main::$6 in [3] *((byte*) main::$6 + (const byte) main::$0) ← (byte) 7 -Simplifying expression containing zero (byte*)persons#0 in [5] (byte*) main::$7 ← (byte*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_ID -Simplifying expression containing zero (byte[$d])persons#0 in [8] (byte[$d]) main::$8 ← (byte[$d])(const struct Person[2]) persons#0 + (const byte) main::$2 +Simplifying expression containing zero (byte*)persons in [5] (byte*) main::$7 ← (byte*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_ID +Simplifying expression containing zero (byte[$d])persons in [8] (byte[$d]) main::$8 ← (byte[$d])(const struct Person[2]) persons + (const byte) main::$2 Simplifying expression containing zero main::$12 in [17] *((word*) main::$12 + (const byte) main::$4) ← (word) $141 -Simplifying expression containing zero main::SCREEN#0 in [24] *((const byte*) main::SCREEN#0 + (byte) 0) ← *((byte[$d]) main::$14 + (byte) 8) +Simplifying expression containing zero main::SCREEN in [24] *((const byte*) main::SCREEN + (byte) 0) ← *((byte[$d]) main::$14 + (byte) 8) Successful SSA optimization PassNSimplifyExpressionWithZero Eliminating unused constant (const byte) main::$0 Eliminating unused constant (const byte) main::$2 Eliminating unused constant (const byte) main::$4 Eliminating unused constant (const byte) OFFSET_STRUCT_PERSON_ID Successful SSA optimization PassNEliminateUnusedVars -Constant right-side identified [7] (byte[$d]) main::$10 ← (byte[$d])(const struct Person[2]) persons#0 + (const byte) main::$3 -Constant right-side identified [10] (word*) main::$12 ← (word*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_AGE -Constant right-side identified [12] (word*) main::$13 ← (word*)(const struct Person[2]) persons#0 + (const byte) OFFSET_STRUCT_PERSON_AGE +Constant right-side identified [7] (byte[$d]) main::$10 ← (byte[$d])(const struct Person[2]) persons + (const byte) main::$3 +Constant right-side identified [10] (word*) main::$12 ← (word*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_AGE +Constant right-side identified [12] (word*) main::$13 ← (word*)(const struct Person[2]) persons + (const byte) OFFSET_STRUCT_PERSON_AGE Constant right-side identified [14] (byte[$d]) main::$14 ← (byte[$d])(const struct Person*) main::person#0 + (const byte) OFFSET_STRUCT_PERSON_NAME Constant right-side identified [16] (struct Person*) main::person#1 ← (const struct Person*) main::person#0 + (const byte) SIZEOF_STRUCT_PERSON Successful SSA optimization Pass2ConstantRValueConsolidation -Constant (const byte*) main::$6 = (byte*)persons#0 -Constant (const byte*) main::$7 = (byte*)persons#0 -Constant (const byte[$d]) main::$8 = (byte[$d])persons#0 -Constant (const byte[$d]) main::$10 = (byte[$d])persons#0+main::$3 -Constant (const word*) main::$12 = (word*)persons#0+OFFSET_STRUCT_PERSON_AGE -Constant (const word*) main::$13 = (word*)persons#0+OFFSET_STRUCT_PERSON_AGE +Constant (const byte*) main::$6 = (byte*)persons +Constant (const byte*) main::$7 = (byte*)persons +Constant (const byte[$d]) main::$8 = (byte[$d])persons +Constant (const byte[$d]) main::$10 = (byte[$d])persons+main::$3 +Constant (const word*) main::$12 = (word*)persons+OFFSET_STRUCT_PERSON_AGE +Constant (const word*) main::$13 = (word*)persons+OFFSET_STRUCT_PERSON_AGE Constant (const byte[$d]) main::$14 = (byte[$d])main::person#0+OFFSET_STRUCT_PERSON_NAME Constant (const struct Person*) main::person#1 = main::person#0+SIZEOF_STRUCT_PERSON Successful SSA optimization Pass2ConstantIdentification @@ -238,28 +236,28 @@ Constant (const byte[$d]) main::$11 = main::$10+OFFSET_STRUCT_PERSON_NAME Constant (const byte[$d]) main::$15 = (byte[$d])main::person#1+OFFSET_STRUCT_PERSON_NAME Successful SSA optimization Pass2ConstantIdentification Inlining constant with different constant siblings (const struct Person*) main::person#0 -Constant inlined main::$12 = (word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE -Constant inlined main::$13 = (word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE -Constant inlined main::$14 = (byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME +Constant inlined main::$12 = (word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE +Constant inlined main::$13 = (word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE +Constant inlined main::$14 = (byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME Constant inlined main::$15 = (byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME -Constant inlined main::$10 = (byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON -Constant inlined main::$11 = (byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME +Constant inlined main::$10 = (byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON +Constant inlined main::$11 = (byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME Constant inlined main::$1 = (byte) 1*(const byte) SIZEOF_STRUCT_PERSON Constant inlined main::$5 = (byte) 1*(const byte) SIZEOF_STRUCT_PERSON -Constant inlined main::$6 = (byte*)(const struct Person[2]) persons#0 +Constant inlined main::$6 = (byte*)(const struct Person[2]) persons Constant inlined main::$3 = (byte) 1*(const byte) SIZEOF_STRUCT_PERSON -Constant inlined main::$9 = (byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME -Constant inlined main::$7 = (byte*)(const struct Person[2]) persons#0 -Constant inlined main::person#0 = (const struct Person[2]) persons#0 -Constant inlined main::$8 = (byte[$d])(const struct Person[2]) persons#0 +Constant inlined main::$9 = (byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME +Constant inlined main::$7 = (byte*)(const struct Person[2]) persons +Constant inlined main::person#0 = (const struct Person[2]) persons +Constant inlined main::$8 = (byte[$d])(const struct Person[2]) persons Successful SSA optimization Pass2ConstantInlining -Consolidated array index constant in *((byte*)persons#0+1*SIZEOF_STRUCT_PERSON) -Consolidated array index constant in *((byte[$d])persons#0+OFFSET_STRUCT_PERSON_NAME+8) -Consolidated array index constant in *((byte[$d])persons#0+1*SIZEOF_STRUCT_PERSON+OFFSET_STRUCT_PERSON_NAME+8) -Consolidated array index constant in *((word*)persons#0+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON) -Consolidated array index constant in *((byte[$d])persons#0+OFFSET_STRUCT_PERSON_NAME+8) +Consolidated array index constant in *((byte*)persons+1*SIZEOF_STRUCT_PERSON) +Consolidated array index constant in *((byte[$d])persons+OFFSET_STRUCT_PERSON_NAME+8) +Consolidated array index constant in *((byte[$d])persons+1*SIZEOF_STRUCT_PERSON+OFFSET_STRUCT_PERSON_NAME+8) +Consolidated array index constant in *((word*)persons+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON) +Consolidated array index constant in *((byte[$d])persons+OFFSET_STRUCT_PERSON_NAME+8) Consolidated array index constant in *((byte[$d])main::person#1+OFFSET_STRUCT_PERSON_NAME+8) -Consolidated array index constant in *(main::SCREEN#0+1) +Consolidated array index constant in *(main::SCREEN+1) Successful SSA optimization Pass2ConstantAdditionElimination Adding NOP phi() at start of @begin Adding NOP phi() at start of @1 @@ -288,14 +286,14 @@ FINAL CONTROL FLOW GRAPH (void()) main() main: scope:[main] from @1 - [4] *((byte*)(const struct Person[2]) persons#0) ← (byte) 7 - [5] *((byte*)(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 - [6] *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' - [7] *((byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' - [8] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 - [9] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b - [10] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) - [11] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) + [4] *((byte*)(const struct Person[2]) persons) ← (byte) 7 + [5] *((byte*)(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 + [6] *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' + [7] *((byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' + [8] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 + [9] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b + [10] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) + [11] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) to:main::@return main::@return: scope:[main] from main [12] return @@ -307,9 +305,7 @@ VARIABLE REGISTER WEIGHTS (byte) Person::id (byte[$d]) Person::name (void()) main() -(byte*) main::SCREEN (struct Person*) main::person -(struct Person[2]) persons Initial phi equivalence classes Complete equivalence classes @@ -344,32 +340,32 @@ bend: main: { .label SCREEN = $400 .label person = persons+SIZEOF_STRUCT_PERSON - // [4] *((byte*)(const struct Person[2]) persons#0) ← (byte) 7 -- _deref_pbuc1=vbuc2 + // [4] *((byte*)(const struct Person[2]) persons) ← (byte) 7 -- _deref_pbuc1=vbuc2 lda #7 sta persons - // [5] *((byte*)(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 -- _deref_pbuc1=vbuc2 + // [5] *((byte*)(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 -- _deref_pbuc1=vbuc2 lda #9 sta persons+1*SIZEOF_STRUCT_PERSON - // [6] *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' -- _deref_pbuc1=vbuc2 + // [6] *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' -- _deref_pbuc1=vbuc2 lda #'a' sta persons+OFFSET_STRUCT_PERSON_NAME+8 - // [7] *((byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' -- _deref_pbuc1=vbuc2 + // [7] *((byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' -- _deref_pbuc1=vbuc2 lda #'b' sta persons+1*SIZEOF_STRUCT_PERSON+OFFSET_STRUCT_PERSON_NAME+8 - // [8] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 -- _deref_pwuc1=vwuc2 + // [8] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 -- _deref_pwuc1=vwuc2 lda #<$141 sta persons+OFFSET_STRUCT_PERSON_AGE lda #>$141 sta persons+OFFSET_STRUCT_PERSON_AGE+1 - // [9] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b -- _deref_pwuc1=vbuc2 + // [9] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b -- _deref_pwuc1=vbuc2 lda #0 sta persons+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON+1 lda #<$7b sta persons+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON - // [10] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 + // [10] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 lda persons+OFFSET_STRUCT_PERSON_NAME+8 sta SCREEN - // [11] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 + // [11] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 lda person+OFFSET_STRUCT_PERSON_NAME+8 sta SCREEN+1 jmp breturn @@ -382,14 +378,14 @@ main: { persons: .fill $10*2, 0 REGISTER UPLIFT POTENTIAL REGISTERS -Statement [4] *((byte*)(const struct Person[2]) persons#0) ← (byte) 7 [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [5] *((byte*)(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [6] *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [7] *((byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [8] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [9] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [10] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [11] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [4] *((byte*)(const struct Person[2]) persons) ← (byte) 7 [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [5] *((byte*)(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [6] *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [7] *((byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [8] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [9] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [10] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [11] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) [ ] ( main:2 [ ] ) always clobbers reg byte a REGISTER UPLIFT SCOPES Uplift Scope [Person] @@ -429,32 +425,32 @@ bend: main: { .label SCREEN = $400 .label person = persons+SIZEOF_STRUCT_PERSON - // [4] *((byte*)(const struct Person[2]) persons#0) ← (byte) 7 -- _deref_pbuc1=vbuc2 + // [4] *((byte*)(const struct Person[2]) persons) ← (byte) 7 -- _deref_pbuc1=vbuc2 lda #7 sta persons - // [5] *((byte*)(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 -- _deref_pbuc1=vbuc2 + // [5] *((byte*)(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 -- _deref_pbuc1=vbuc2 lda #9 sta persons+1*SIZEOF_STRUCT_PERSON - // [6] *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' -- _deref_pbuc1=vbuc2 + // [6] *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' -- _deref_pbuc1=vbuc2 lda #'a' sta persons+OFFSET_STRUCT_PERSON_NAME+8 - // [7] *((byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' -- _deref_pbuc1=vbuc2 + // [7] *((byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' -- _deref_pbuc1=vbuc2 lda #'b' sta persons+1*SIZEOF_STRUCT_PERSON+OFFSET_STRUCT_PERSON_NAME+8 - // [8] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 -- _deref_pwuc1=vwuc2 + // [8] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 -- _deref_pwuc1=vwuc2 lda #<$141 sta persons+OFFSET_STRUCT_PERSON_AGE lda #>$141 sta persons+OFFSET_STRUCT_PERSON_AGE+1 - // [9] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b -- _deref_pwuc1=vbuc2 + // [9] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b -- _deref_pwuc1=vbuc2 lda #0 sta persons+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON+1 lda #<$7b sta persons+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON - // [10] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 + // [10] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 lda persons+OFFSET_STRUCT_PERSON_NAME+8 sta SCREEN - // [11] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 + // [11] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 lda person+OFFSET_STRUCT_PERSON_NAME+8 sta SCREEN+1 jmp breturn @@ -496,12 +492,10 @@ FINAL SYMBOL TABLE (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return -(byte*) main::SCREEN -(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) main::SCREEN SCREEN = (byte*) 1024 (struct Person*) main::person -(const struct Person*) main::person#1 person = (const struct Person[2]) persons#0+(const byte) SIZEOF_STRUCT_PERSON -(struct Person[2]) persons -(const struct Person[2]) persons#0 persons = { fill( 2, 0) } +(const struct Person*) main::person#1 person = (const struct Person[2]) persons+(const byte) SIZEOF_STRUCT_PERSON +(const struct Person[2]) persons persons = { fill( 2, 0) } @@ -529,39 +523,39 @@ main: { .label SCREEN = $400 .label person = persons+SIZEOF_STRUCT_PERSON // persons[0].id = 7 - // [4] *((byte*)(const struct Person[2]) persons#0) ← (byte) 7 -- _deref_pbuc1=vbuc2 + // [4] *((byte*)(const struct Person[2]) persons) ← (byte) 7 -- _deref_pbuc1=vbuc2 lda #7 sta persons // persons[1].id = 9 - // [5] *((byte*)(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 -- _deref_pbuc1=vbuc2 + // [5] *((byte*)(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) 9 -- _deref_pbuc1=vbuc2 lda #9 sta persons+1*SIZEOF_STRUCT_PERSON // persons[0].name[8] = 'a' - // [6] *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' -- _deref_pbuc1=vbuc2 + // [6] *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'a' -- _deref_pbuc1=vbuc2 lda #'a' sta persons+OFFSET_STRUCT_PERSON_NAME+8 // persons[1].name[8] = 'b' - // [7] *((byte[$d])(const struct Person[2]) persons#0+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' -- _deref_pbuc1=vbuc2 + // [7] *((byte[$d])(const struct Person[2]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) ← (byte) 'b' -- _deref_pbuc1=vbuc2 lda #'b' sta persons+1*SIZEOF_STRUCT_PERSON+OFFSET_STRUCT_PERSON_NAME+8 // persons[0].age = 321 - // [8] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 -- _deref_pwuc1=vwuc2 + // [8] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE) ← (word) $141 -- _deref_pwuc1=vwuc2 lda #<$141 sta persons+OFFSET_STRUCT_PERSON_AGE lda #>$141 sta persons+OFFSET_STRUCT_PERSON_AGE+1 // persons[1].age = 123 - // [9] *((word*)(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b -- _deref_pwuc1=vbuc2 + // [9] *((word*)(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_AGE+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON) ← (byte) $7b -- _deref_pwuc1=vbuc2 lda #0 sta persons+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON+1 lda #<$7b sta persons+OFFSET_STRUCT_PERSON_AGE+1*SIZEOF_STRUCT_PERSON // SCREEN[0] = person->name[8] - // [10] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 + // [10] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 lda persons+OFFSET_STRUCT_PERSON_NAME+8 sta SCREEN // SCREEN[1] = person->name[8] - // [11] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 + // [11] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 8) -- _deref_pbuc1=_deref_pbuc2 lda person+OFFSET_STRUCT_PERSON_NAME+8 sta SCREEN+1 // main::@return diff --git a/src/test/ref/struct-ptr-32.sym b/src/test/ref/struct-ptr-32.sym index 391f6aea2..fb77a04c5 100644 --- a/src/test/ref/struct-ptr-32.sym +++ b/src/test/ref/struct-ptr-32.sym @@ -9,10 +9,8 @@ (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return -(byte*) main::SCREEN -(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) main::SCREEN SCREEN = (byte*) 1024 (struct Person*) main::person -(const struct Person*) main::person#1 person = (const struct Person[2]) persons#0+(const byte) SIZEOF_STRUCT_PERSON -(struct Person[2]) persons -(const struct Person[2]) persons#0 persons = { fill( 2, 0) } +(const struct Person*) main::person#1 person = (const struct Person[2]) persons+(const byte) SIZEOF_STRUCT_PERSON +(const struct Person[2]) persons persons = { fill( 2, 0) } diff --git a/src/test/ref/struct-ptr-33.cfg b/src/test/ref/struct-ptr-33.cfg index 566948f74..053536da4 100644 --- a/src/test/ref/struct-ptr-33.cfg +++ b/src/test/ref/struct-ptr-33.cfg @@ -10,8 +10,8 @@ (void()) main() main: scope:[main] from @1 - [4] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) - [5] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) + [4] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) + [5] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) to:main::@return main::@return: scope:[main] from main [6] return diff --git a/src/test/ref/struct-ptr-33.log b/src/test/ref/struct-ptr-33.log index c7f04efa8..ca26f66cc 100644 --- a/src/test/ref/struct-ptr-33.log +++ b/src/test/ref/struct-ptr-33.log @@ -6,18 +6,18 @@ Rewriting struct pointer member access *((struct Person*) main::person).name CONTROL FLOW GRAPH SSA @begin: scope:[] from - (struct Person[2]) persons#0 ← { { (number) 7, (const string) $0, (number) $141 }, { (number) 9, (const string) $1, (number) $7b } } + (struct Person[2]) persons ← { { (number) 7, (const string) $0, (number) $141 }, { (number) 9, (const string) $1, (number) $7b } } to:@1 (void()) main() main: scope:[main] from @1 - (byte*) main::SCREEN#0 ← ((byte*)) (number) $400 - (struct Person*) main::person#0 ← (struct Person[2]) persons#0 + (byte*) main::SCREEN ← ((byte*)) (number) $400 + (struct Person*) main::person#0 ← (struct Person[2]) persons (byte[$d]) main::$0 ← (byte[$d])(struct Person*) main::person#0 + (const byte) OFFSET_STRUCT_PERSON_NAME - *((byte*) main::SCREEN#0 + (number) 0) ← *((byte[$d]) main::$0 + (number) 2) + *((byte*) main::SCREEN + (number) 0) ← *((byte[$d]) main::$0 + (number) 2) (struct Person*) main::person#1 ← (struct Person*) main::person#0 + (const byte) SIZEOF_STRUCT_PERSON (byte[$d]) main::$1 ← (byte[$d])(struct Person*) main::person#1 + (const byte) OFFSET_STRUCT_PERSON_NAME - *((byte*) main::SCREEN#0 + (number) 1) ← *((byte[$d]) main::$1 + (number) 2) + *((byte*) main::SCREEN + (number) 1) ← *((byte[$d]) main::$1 + (number) 2) to:main::@return main::@return: scope:[main] from main return @@ -46,21 +46,19 @@ SYMBOL TABLE SSA (byte[$d]) main::$1 (label) main::@return (byte*) main::SCREEN -(byte*) main::SCREEN#0 (struct Person*) main::person (struct Person*) main::person#0 (struct Person*) main::person#1 (struct Person[2]) persons -(struct Person[2]) persons#0 -Adding number conversion cast (unumber) 2 in *((byte*) main::SCREEN#0 + (number) 0) ← *((byte[$d]) main::$0 + (number) 2) -Adding number conversion cast (unumber) 0 in *((byte*) main::SCREEN#0 + (number) 0) ← *((byte[$d]) main::$0 + (unumber)(number) 2) -Adding number conversion cast (unumber) 2 in *((byte*) main::SCREEN#0 + (number) 1) ← *((byte[$d]) main::$1 + (number) 2) -Adding number conversion cast (unumber) 1 in *((byte*) main::SCREEN#0 + (number) 1) ← *((byte[$d]) main::$1 + (unumber)(number) 2) +Adding number conversion cast (unumber) 2 in *((byte*) main::SCREEN + (number) 0) ← *((byte[$d]) main::$0 + (number) 2) +Adding number conversion cast (unumber) 0 in *((byte*) main::SCREEN + (number) 0) ← *((byte[$d]) main::$0 + (unumber)(number) 2) +Adding number conversion cast (unumber) 2 in *((byte*) main::SCREEN + (number) 1) ← *((byte[$d]) main::$1 + (number) 2) +Adding number conversion cast (unumber) 1 in *((byte*) main::SCREEN + (number) 1) ← *((byte[$d]) main::$1 + (unumber)(number) 2) Successful SSA optimization PassNAddNumberTypeConversions -Added casts to value list in (struct Person[2]) persons#0 ← (struct Person[2]){ (struct Person){ (byte)(number) 7, (const string) $0, (word)(number) $141 }, (struct Person){ (byte)(number) 9, (const string) $1, (word)(number) $7b } } +Added casts to value list in (struct Person[2]) persons ← (struct Person[2]){ (struct Person){ (byte)(number) 7, (const string) $0, (word)(number) $141 }, (struct Person){ (byte)(number) 9, (const string) $1, (word)(number) $7b } } Successful SSA optimization PassNAddInitializerValueListTypeCasts -Inlining cast (byte*) main::SCREEN#0 ← (byte*)(number) $400 +Inlining cast (byte*) main::SCREEN ← (byte*)(number) $400 Successful SSA optimization Pass2InlineCast Simplifying constant integer cast 7 Simplifying constant integer cast $141 @@ -82,14 +80,14 @@ Identified constant from value list (struct Person) { id: (byte) 9, name: (const Successful SSA optimization Pass2ConstantInitializerValueLists Identified constant from value list (struct Person[2]) { { id: (byte) 7, name: (const string) $0, age: (word) $141 }, { id: (byte) 9, name: (const string) $1, age: (word) $7b } } Successful SSA optimization Pass2ConstantInitializerValueLists -Constant (const struct Person[2]) persons#0 = { { id: 7, name: $0, age: $141 }, { id: 9, name: $1, age: $7b } } -Constant (const byte*) main::SCREEN#0 = (byte*) 1024 +Constant (const struct Person[2]) persons = { { id: 7, name: $0, age: $141 }, { id: 9, name: $1, age: $7b } } +Constant (const byte*) main::SCREEN = (byte*) 1024 Successful SSA optimization Pass2ConstantIdentification -Constant (const struct Person*) main::person#0 = persons#0 +Constant (const struct Person*) main::person#0 = persons Successful SSA optimization Pass2ConstantIdentification Constant value identified (byte[$d])main::person#0 in [3] (byte[$d]) main::$0 ← (byte[$d])(const struct Person*) main::person#0 + (const byte) OFFSET_STRUCT_PERSON_NAME Successful SSA optimization Pass2ConstantValues -Simplifying expression containing zero main::SCREEN#0 in [4] *((const byte*) main::SCREEN#0 + (byte) 0) ← *((byte[$d]) main::$0 + (byte) 2) +Simplifying expression containing zero main::SCREEN in [4] *((const byte*) main::SCREEN + (byte) 0) ← *((byte[$d]) main::$0 + (byte) 2) Successful SSA optimization PassNSimplifyExpressionWithZero Constant right-side identified [0] (byte[$d]) main::$0 ← (byte[$d])(const struct Person*) main::person#0 + (const byte) OFFSET_STRUCT_PERSON_NAME Constant right-side identified [2] (struct Person*) main::person#1 ← (const struct Person*) main::person#0 + (const byte) SIZEOF_STRUCT_PERSON @@ -105,15 +103,15 @@ Constant (const byte[$d]) main::$1 = (byte[$d])main::person#1+OFFSET_STRUCT_PERS Successful SSA optimization Pass2ConstantIdentification Inlining constant with different constant siblings (const struct Person*) main::person#0 Constant inlined main::$1 = (byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME -Constant inlined main::person#0 = (const struct Person[2]) persons#0 -Constant inlined main::$0 = (byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME +Constant inlined main::person#0 = (const struct Person[2]) persons +Constant inlined main::$0 = (byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME Successful SSA optimization Pass2ConstantInlining Constant array inlined into struct $0 = (string) "jesper" Constant array inlined into struct $1 = (string) "henry" Successful SSA optimization Pass2ArrayInStructInlining -Consolidated array index constant in *((byte[$d])persons#0+OFFSET_STRUCT_PERSON_NAME+2) +Consolidated array index constant in *((byte[$d])persons+OFFSET_STRUCT_PERSON_NAME+2) Consolidated array index constant in *((byte[$d])main::person#1+OFFSET_STRUCT_PERSON_NAME+2) -Consolidated array index constant in *(main::SCREEN#0+1) +Consolidated array index constant in *(main::SCREEN+1) Successful SSA optimization Pass2ConstantAdditionElimination Adding NOP phi() at start of @begin Adding NOP phi() at start of @1 @@ -142,8 +140,8 @@ FINAL CONTROL FLOW GRAPH (void()) main() main: scope:[main] from @1 - [4] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) - [5] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) + [4] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) + [5] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) to:main::@return main::@return: scope:[main] from main [6] return @@ -155,9 +153,7 @@ VARIABLE REGISTER WEIGHTS (byte) Person::id (byte[$d]) Person::name (void()) main() -(byte*) main::SCREEN (struct Person*) main::person -(struct Person[2]) persons Initial phi equivalence classes Complete equivalence classes @@ -191,10 +187,10 @@ bend: main: { .label SCREEN = $400 .label person = persons+SIZEOF_STRUCT_PERSON - // [4] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 + // [4] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 lda persons+OFFSET_STRUCT_PERSON_NAME+2 sta SCREEN - // [5] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 + // [5] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 lda person+OFFSET_STRUCT_PERSON_NAME+2 sta SCREEN+1 jmp breturn @@ -216,8 +212,8 @@ main: { .word $7b REGISTER UPLIFT POTENTIAL REGISTERS -Statement [4] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) [ ] ( main:2 [ ] ) always clobbers reg byte a -Statement [5] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [4] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [5] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) [ ] ( main:2 [ ] ) always clobbers reg byte a REGISTER UPLIFT SCOPES Uplift Scope [Person] @@ -256,10 +252,10 @@ bend: main: { .label SCREEN = $400 .label person = persons+SIZEOF_STRUCT_PERSON - // [4] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 + // [4] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 lda persons+OFFSET_STRUCT_PERSON_NAME+2 sta SCREEN - // [5] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 + // [5] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 lda person+OFFSET_STRUCT_PERSON_NAME+2 sta SCREEN+1 jmp breturn @@ -309,12 +305,10 @@ FINAL SYMBOL TABLE (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return -(byte*) main::SCREEN -(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) main::SCREEN SCREEN = (byte*) 1024 (struct Person*) main::person -(const struct Person*) main::person#1 person = (const struct Person[2]) persons#0+(const byte) SIZEOF_STRUCT_PERSON -(struct Person[2]) persons -(const struct Person[2]) persons#0 persons = { { id: (byte) 7, name: (string) "jesper", age: (word) $141 }, { id: (byte) 9, name: (string) "henry", age: (word) $7b } } +(const struct Person*) main::person#1 person = (const struct Person[2]) persons+(const byte) SIZEOF_STRUCT_PERSON +(const struct Person[2]) persons persons = { { id: (byte) 7, name: (string) "jesper", age: (word) $141 }, { id: (byte) 9, name: (string) "henry", age: (word) $7b } } @@ -341,11 +335,11 @@ main: { .label SCREEN = $400 .label person = persons+SIZEOF_STRUCT_PERSON // SCREEN[0] = person->name[2] - // [4] *((const byte*) main::SCREEN#0) ← *((byte[$d])(const struct Person[2]) persons#0+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 + // [4] *((const byte*) main::SCREEN) ← *((byte[$d])(const struct Person[2]) persons+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 lda persons+OFFSET_STRUCT_PERSON_NAME+2 sta SCREEN // SCREEN[1] = person->name[2] - // [5] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 + // [5] *((const byte*) main::SCREEN+(byte) 1) ← *((byte[$d])(const struct Person*) main::person#1+(const byte) OFFSET_STRUCT_PERSON_NAME+(byte) 2) -- _deref_pbuc1=_deref_pbuc2 lda person+OFFSET_STRUCT_PERSON_NAME+2 sta SCREEN+1 // main::@return diff --git a/src/test/ref/struct-ptr-33.sym b/src/test/ref/struct-ptr-33.sym index 4a708a8bd..ee0036a44 100644 --- a/src/test/ref/struct-ptr-33.sym +++ b/src/test/ref/struct-ptr-33.sym @@ -8,10 +8,8 @@ (const byte) SIZEOF_STRUCT_PERSON SIZEOF_STRUCT_PERSON = (byte) $10 (void()) main() (label) main::@return -(byte*) main::SCREEN -(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) main::SCREEN SCREEN = (byte*) 1024 (struct Person*) main::person -(const struct Person*) main::person#1 person = (const struct Person[2]) persons#0+(const byte) SIZEOF_STRUCT_PERSON -(struct Person[2]) persons -(const struct Person[2]) persons#0 persons = { { id: (byte) 7, name: (string) "jesper", age: (word) $141 }, { id: (byte) 9, name: (string) "henry", age: (word) $7b } } +(const struct Person*) main::person#1 person = (const struct Person[2]) persons+(const byte) SIZEOF_STRUCT_PERSON +(const struct Person[2]) persons persons = { { id: (byte) 7, name: (string) "jesper", age: (word) $141 }, { id: (byte) 9, name: (string) "henry", age: (word) $7b } } diff --git a/src/test/ref/struct-ptr-34.cfg b/src/test/ref/struct-ptr-34.cfg index 35c43e312..48e752863 100644 --- a/src/test/ref/struct-ptr-34.cfg +++ b/src/test/ref/struct-ptr-34.cfg @@ -26,9 +26,9 @@ print_person: scope:[print_person] from main main::@1 [9] (byte[$10]) print_person::person_name#4 ← phi( main/(const byte[$10]) main::jesper_name#0 main::@1/(const byte[$10]) main::henriette_name#0 ) [9] (byte) idx#13 ← phi( main/(byte) 0 main::@1/(byte) idx#16 ) [9] (byte) print_person::person_id#2 ← phi( main/(const byte) main::jesper_id#0 main::@1/(const byte) main::henriette_id#0 ) - [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + (byte) print_person::person_id#2) + [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + (byte) print_person::person_id#2) [11] (byte) idx#4 ← ++ (byte) idx#13 - [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [13] (byte) idx#5 ← ++ (byte) idx#4 to:print_person::@1 print_person::@1: scope:[print_person] from print_person print_person::@2 @@ -37,14 +37,14 @@ print_person::@1: scope:[print_person] from print_person print_person::@2 [15] if((byte) 0!=*((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2)) goto print_person::@2 to:print_person::@3 print_person::@3: scope:[print_person] from print_person::@1 - [16] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' + [16] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [17] (byte) idx#16 ← ++ (byte) idx#14 to:print_person::@return print_person::@return: scope:[print_person] from print_person::@3 [18] return to:@return print_person::@2: scope:[print_person] from print_person::@1 - [19] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) + [19] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) [20] (byte) idx#6 ← ++ (byte) idx#14 [21] (byte) print_person::i#1 ← ++ (byte) print_person::i#2 to:print_person::@1 diff --git a/src/test/ref/struct-ptr-34.log b/src/test/ref/struct-ptr-34.log index 3977ecc08..0c6e7b97d 100644 --- a/src/test/ref/struct-ptr-34.log +++ b/src/test/ref/struct-ptr-34.log @@ -61,9 +61,9 @@ main::@return: scope:[main] from main::@2 return to:@return @1: scope:[] from @begin - (byte*) SCREEN#0 ← ((byte*)) (number) $400 + (byte*) SCREEN ← ((byte*)) (number) $400 (byte) idx#3 ← (number) 0 - (byte[]) DIGIT#0 ← (const string) $0 + (byte[]) DIGIT ← (const string) $0 to:@2 (void()) print_person((byte) print_person::person_id , (byte[$10]) print_person::person_name) @@ -71,9 +71,9 @@ print_person: scope:[print_person] from main main::@1 (byte[$10]) print_person::person_name#4 ← phi( main/(byte[$10]) print_person::person_name#0 main::@1/(byte[$10]) print_person::person_name#1 ) (byte) idx#13 ← phi( main/(byte) idx#18 main::@1/(byte) idx#0 ) (byte) print_person::person_id#2 ← phi( main/(byte) print_person::person_id#0 main::@1/(byte) print_person::person_id#1 ) - *((byte*) SCREEN#0 + (byte) idx#13) ← *((byte[]) DIGIT#0 + (byte) print_person::person_id#2) + *((byte*) SCREEN + (byte) idx#13) ← *((byte[]) DIGIT + (byte) print_person::person_id#2) (byte) idx#4 ← ++ (byte) idx#13 - *((byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + *((byte*) SCREEN + (byte) idx#4) ← (byte) ' ' (byte) idx#5 ← ++ (byte) idx#4 (byte) print_person::i#0 ← (number) 0 to:print_person::@1 @@ -88,13 +88,13 @@ print_person::@2: scope:[print_person] from print_person::@1 (byte) idx#14 ← phi( print_person::@1/(byte) idx#19 ) (byte) print_person::i#3 ← phi( print_person::@1/(byte) print_person::i#2 ) (byte[$10]) print_person::person_name#3 ← phi( print_person::@1/(byte[$10]) print_person::person_name#2 ) - *((byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#3 + (byte) print_person::i#3) + *((byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#3 + (byte) print_person::i#3) (byte) idx#6 ← ++ (byte) idx#14 (byte) print_person::i#1 ← ++ (byte) print_person::i#3 to:print_person::@1 print_person::@3: scope:[print_person] from print_person::@1 (byte) idx#15 ← phi( print_person::@1/(byte) idx#19 ) - *((byte*) SCREEN#0 + (byte) idx#15) ← (byte) ' ' + *((byte*) SCREEN + (byte) idx#15) ← (byte) ' ' (byte) idx#7 ← ++ (byte) idx#15 to:print_person::@return print_person::@return: scope:[print_person] from print_person::@3 @@ -120,11 +120,9 @@ SYMBOL TABLE SSA (label) @begin (label) @end (byte[]) DIGIT -(byte[]) DIGIT#0 (byte) Person::id (byte[$10]) Person::name (byte*) SCREEN -(byte*) SCREEN#0 (byte) idx (byte) idx#0 (byte) idx#1 @@ -192,7 +190,7 @@ Adding number conversion cast (unumber) 0 in (bool~) print_person::$0 ← (numbe Successful SSA optimization PassNAddNumberTypeConversions Inlining cast (byte) main::jesper_id#0 ← (unumber)(number) 4 Inlining cast (byte) main::henriette_id#0 ← (unumber)(number) 7 -Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400 +Inlining cast (byte*) SCREEN ← (byte*)(number) $400 Inlining cast (byte) idx#3 ← (unumber)(number) 0 Inlining cast (byte) print_person::i#0 ← (unumber)(number) 0 Successful SSA optimization Pass2InlineCast @@ -230,9 +228,9 @@ Constant (const byte) main::jesper_id#0 = 4 Constant (const byte[$10]) main::jesper_name#0 = main::$2 Constant (const byte) main::henriette_id#0 = 7 Constant (const byte[$10]) main::henriette_name#0 = main::$3 -Constant (const byte*) SCREEN#0 = (byte*) 1024 +Constant (const byte*) SCREEN = (byte*) 1024 Constant (const byte) idx#20 = 0 -Constant (const byte[]) DIGIT#0 = $0 +Constant (const byte[]) DIGIT = $0 Constant (const byte) print_person::i#0 = 0 Successful SSA optimization Pass2ConstantIdentification Constant (const byte) print_person::person_id#0 = main::jesper_id#0 @@ -253,7 +251,7 @@ Constant inlined main::$2 = (const byte[$10]) main::jesper_name#0 Constant inlined print_person::i#0 = (byte) 0 Constant inlined print_person::person_name#1 = (const byte[$10]) main::henriette_name#0 Constant inlined main::$3 = (const byte[$10]) main::henriette_name#0 -Constant inlined $0 = (const byte[]) DIGIT#0 +Constant inlined $0 = (const byte[]) DIGIT Constant inlined print_person::person_name#0 = (const byte[$10]) main::jesper_name#0 Successful SSA optimization Pass2ConstantInlining Adding NOP phi() at start of @begin @@ -312,9 +310,9 @@ print_person: scope:[print_person] from main main::@1 [9] (byte[$10]) print_person::person_name#4 ← phi( main/(const byte[$10]) main::jesper_name#0 main::@1/(const byte[$10]) main::henriette_name#0 ) [9] (byte) idx#13 ← phi( main/(byte) 0 main::@1/(byte) idx#16 ) [9] (byte) print_person::person_id#2 ← phi( main/(const byte) main::jesper_id#0 main::@1/(const byte) main::henriette_id#0 ) - [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + (byte) print_person::person_id#2) + [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + (byte) print_person::person_id#2) [11] (byte) idx#4 ← ++ (byte) idx#13 - [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' + [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [13] (byte) idx#5 ← ++ (byte) idx#4 to:print_person::@1 print_person::@1: scope:[print_person] from print_person print_person::@2 @@ -323,24 +321,22 @@ print_person::@1: scope:[print_person] from print_person print_person::@2 [15] if((byte) 0!=*((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2)) goto print_person::@2 to:print_person::@3 print_person::@3: scope:[print_person] from print_person::@1 - [16] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' + [16] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [17] (byte) idx#16 ← ++ (byte) idx#14 to:print_person::@return print_person::@return: scope:[print_person] from print_person::@3 [18] return to:@return print_person::@2: scope:[print_person] from print_person::@1 - [19] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) + [19] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) [20] (byte) idx#6 ← ++ (byte) idx#14 [21] (byte) print_person::i#1 ← ++ (byte) print_person::i#2 to:print_person::@1 VARIABLE REGISTER WEIGHTS -(byte[]) DIGIT (byte) Person::id (byte[$10]) Person::name -(byte*) SCREEN (byte) idx (byte) idx#13 3.0 (byte) idx#14 9.75 @@ -471,7 +467,7 @@ print_person: { .label i = 6 .label person_id = 2 .label person_name = 4 - // [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + (byte) print_person::person_id#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 + // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + (byte) print_person::person_id#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 ldy.z person_id lda DIGIT,y ldy.z idx_13 @@ -480,7 +476,7 @@ print_person: { ldy.z idx_13 iny sty.z idx - // [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 + // [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 lda #' ' ldy.z idx sta SCREEN,y @@ -505,7 +501,7 @@ print_person: { jmp b3 // print_person::@3 b3: - // [16] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 + // [16] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuz1=vbuc2 lda #' ' ldy.z idx_14 sta SCREEN,y @@ -520,7 +516,7 @@ print_person: { rts // print_person::@2 b2: - // [19] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz3 + // [19] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz3 ldx.z idx_14 ldy.z i lda (person_name),y @@ -540,20 +536,20 @@ print_person: { .byte 0 REGISTER UPLIFT POTENTIAL REGISTERS -Statement [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + (byte) print_person::person_id#2) [ idx#13 print_person::person_name#4 ] ( main:2::print_person:5 [ idx#13 print_person::person_name#4 ] main:2::print_person:7 [ idx#13 print_person::person_name#4 ] ) always clobbers reg byte a +Statement [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + (byte) print_person::person_id#2) [ idx#13 print_person::person_name#4 ] ( main:2::print_person:5 [ idx#13 print_person::person_name#4 ] main:2::print_person:7 [ idx#13 print_person::person_name#4 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ idx#13 idx#16 ] -Statement [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' [ print_person::person_name#4 idx#4 ] ( main:2::print_person:5 [ print_person::person_name#4 idx#4 ] main:2::print_person:7 [ print_person::person_name#4 idx#4 ] ) always clobbers reg byte a +Statement [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [ print_person::person_name#4 idx#4 ] ( main:2::print_person:5 [ print_person::person_name#4 idx#4 ] main:2::print_person:7 [ print_person::person_name#4 idx#4 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:8 [ idx#4 ] Statement [15] if((byte) 0!=*((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2)) goto print_person::@2 [ print_person::person_name#4 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person_name#4 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person_name#4 print_person::i#2 idx#14 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:6 [ print_person::i#2 print_person::i#1 ] Removing always clobbered register reg byte a as potential for zp ZP_BYTE:7 [ idx#14 idx#5 idx#6 ] -Statement [16] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a -Statement [19] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) [ print_person::person_name#4 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person_name#4 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person_name#4 print_person::i#2 idx#14 ] ) always clobbers reg byte a -Statement [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + (byte) print_person::person_id#2) [ idx#13 print_person::person_name#4 ] ( main:2::print_person:5 [ idx#13 print_person::person_name#4 ] main:2::print_person:7 [ idx#13 print_person::person_name#4 ] ) always clobbers reg byte a -Statement [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' [ print_person::person_name#4 idx#4 ] ( main:2::print_person:5 [ print_person::person_name#4 idx#4 ] main:2::print_person:7 [ print_person::person_name#4 idx#4 ] ) always clobbers reg byte a +Statement [16] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a +Statement [19] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) [ print_person::person_name#4 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person_name#4 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person_name#4 print_person::i#2 idx#14 ] ) always clobbers reg byte a +Statement [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + (byte) print_person::person_id#2) [ idx#13 print_person::person_name#4 ] ( main:2::print_person:5 [ idx#13 print_person::person_name#4 ] main:2::print_person:7 [ idx#13 print_person::person_name#4 ] ) always clobbers reg byte a +Statement [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' [ print_person::person_name#4 idx#4 ] ( main:2::print_person:5 [ print_person::person_name#4 idx#4 ] main:2::print_person:7 [ print_person::person_name#4 idx#4 ] ) always clobbers reg byte a Statement [15] if((byte) 0!=*((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2)) goto print_person::@2 [ print_person::person_name#4 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person_name#4 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person_name#4 print_person::i#2 idx#14 ] ) always clobbers reg byte a -Statement [16] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a -Statement [19] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) [ print_person::person_name#4 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person_name#4 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person_name#4 print_person::i#2 idx#14 ] ) always clobbers reg byte a +Statement [16] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' [ idx#14 ] ( main:2::print_person:5 [ idx#14 ] main:2::print_person:7 [ idx#14 ] ) always clobbers reg byte a +Statement [19] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) [ print_person::person_name#4 print_person::i#2 idx#14 ] ( main:2::print_person:5 [ print_person::person_name#4 print_person::i#2 idx#14 ] main:2::print_person:7 [ print_person::person_name#4 print_person::i#2 idx#14 ] ) always clobbers reg byte a Potential registers zp ZP_BYTE:2 [ print_person::person_id#2 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y , Potential registers zp ZP_BYTE:3 [ idx#13 idx#16 ] : zp ZP_BYTE:3 , reg byte x , reg byte y , Potential registers zp ZP_WORD:4 [ print_person::person_name#4 ] : zp ZP_WORD:4 , @@ -648,14 +644,14 @@ main: { // print_person(byte register(X) person_id, byte[$10] zeropage(2) person_name) print_person: { .label person_name = 2 - // [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + (byte) print_person::person_id#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx + // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + (byte) print_person::person_id#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx lda DIGIT,x sta SCREEN,y // [11] (byte) idx#4 ← ++ (byte) idx#13 -- vbuxx=_inc_vbuyy tya tax inx - // [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // [13] (byte) idx#5 ← ++ (byte) idx#4 -- vbuxx=_inc_vbuxx @@ -675,7 +671,7 @@ print_person: { jmp b3 // print_person::@3 b3: - // [16] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [16] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // [17] (byte) idx#16 ← ++ (byte) idx#14 -- vbuyy=_inc_vbuxx @@ -689,7 +685,7 @@ print_person: { rts // print_person::@2 b2: - // [19] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy + // [19] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy lda (person_name),y sta SCREEN,x // [20] (byte) idx#6 ← ++ (byte) idx#14 -- vbuxx=_inc_vbuxx @@ -741,12 +737,10 @@ FINAL SYMBOL TABLE (label) @1 (label) @begin (label) @end -(byte[]) DIGIT -(const byte[]) DIGIT#0 DIGIT = (string) "0123456789" +(const byte[]) DIGIT DIGIT = (string) "0123456789" (byte) Person::id (byte[$10]) Person::name -(byte*) SCREEN -(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) SCREEN SCREEN = (byte*) 1024 (byte) idx (byte) idx#13 reg byte y 3.0 (byte) idx#14 reg byte x 9.75 @@ -852,7 +846,7 @@ main: { print_person: { .label person_name = 2 // SCREEN[idx++] = DIGIT[person.id] - // [10] *((const byte*) SCREEN#0 + (byte) idx#13) ← *((const byte[]) DIGIT#0 + (byte) print_person::person_id#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx + // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + (byte) print_person::person_id#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx lda DIGIT,x sta SCREEN,y // SCREEN[idx++] = DIGIT[person.id]; @@ -861,7 +855,7 @@ print_person: { tax inx // SCREEN[idx++] = ' ' - // [12] *((const byte*) SCREEN#0 + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [12] *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // SCREEN[idx++] = ' '; @@ -880,7 +874,7 @@ print_person: { bne b2 // print_person::@3 // SCREEN[idx++] = ' ' - // [16] *((const byte*) SCREEN#0 + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 + // [16] *((const byte*) SCREEN + (byte) idx#14) ← (byte) ' ' -- pbuc1_derefidx_vbuxx=vbuc2 lda #' ' sta SCREEN,x // SCREEN[idx++] = ' '; @@ -895,7 +889,7 @@ print_person: { // print_person::@2 b2: // SCREEN[idx++] = person.name[i] - // [19] *((const byte*) SCREEN#0 + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy + // [19] *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::person_name#4 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy lda (person_name),y sta SCREEN,x // SCREEN[idx++] = person.name[i]; diff --git a/src/test/ref/struct-ptr-34.sym b/src/test/ref/struct-ptr-34.sym index ce93b6fe9..9777b3125 100644 --- a/src/test/ref/struct-ptr-34.sym +++ b/src/test/ref/struct-ptr-34.sym @@ -1,12 +1,10 @@ (label) @1 (label) @begin (label) @end -(byte[]) DIGIT -(const byte[]) DIGIT#0 DIGIT = (string) "0123456789" +(const byte[]) DIGIT DIGIT = (string) "0123456789" (byte) Person::id (byte[$10]) Person::name -(byte*) SCREEN -(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(const byte*) SCREEN SCREEN = (byte*) 1024 (byte) idx (byte) idx#13 reg byte y 3.0 (byte) idx#14 reg byte x 9.75