From 4f5064a372dfe5fe206691000c77c1581ac7ce6d Mon Sep 17 00:00:00 2001
From: jespergravgaard <jesper@balmangravgaard.dk>
Date: Mon, 18 Nov 2019 23:19:58 +0100
Subject: [PATCH] Cleaning up old usages of SymbolTypeArray.

---
 .../passes/Pass2ArrayInStructInlining.java    |  17 +-
 .../dk/camelot64/kickc/test/TestPrograms.java |   9 +-
 src/test/ref/struct-ptr-31.asm                |   4 +-
 src/test/ref/struct-ptr-31.cfg                |  12 +-
 src/test/ref/struct-ptr-31.log                | 189 ++++++++----------
 src/test/ref/struct-ptr-31.sym                |  10 +-
 6 files changed, 106 insertions(+), 135 deletions(-)

diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2ArrayInStructInlining.java b/src/main/java/dk/camelot64/kickc/passes/Pass2ArrayInStructInlining.java
index 97048f155..08b8f590b 100644
--- a/src/main/java/dk/camelot64/kickc/passes/Pass2ArrayInStructInlining.java
+++ b/src/main/java/dk/camelot64/kickc/passes/Pass2ArrayInStructInlining.java
@@ -5,7 +5,6 @@ import dk.camelot64.kickc.model.iterator.ProgramValue;
 import dk.camelot64.kickc.model.iterator.ProgramValueIterator;
 import dk.camelot64.kickc.model.symbols.Variable;
 import dk.camelot64.kickc.model.types.SymbolType;
-import dk.camelot64.kickc.model.types.SymbolTypeArray;
 import dk.camelot64.kickc.model.values.ConstantRef;
 import dk.camelot64.kickc.model.values.ConstantValue;
 import dk.camelot64.kickc.model.values.SymbolVariableRef;
@@ -58,15 +57,13 @@ public class Pass2ArrayInStructInlining extends Pass2SsaOptimization {
          if(programValue instanceof ProgramValue.ProgramValueConstantStructMember) {
             SymbolVariableRef memberRef = ((ProgramValue.ProgramValueConstantStructMember) programValue).getMemberRef();
             Variable structMemberVar = getScope().getVariable(memberRef);
-            if(structMemberVar.getType() instanceof SymbolTypeArray) {
-               if(((SymbolTypeArray) structMemberVar.getType()).getSize() != null) {
-                  if(value instanceof ConstantValue) {
-                     ConstantValue constantValue = (ConstantValue) value;
-                     if(constantValue.getType(getProgram().getScope()).equals(SymbolType.STRING)) {
-                        if(constantValue instanceof ConstantRef) {
-                           Variable constantStringVar = getScope().getConstant((ConstantRef) constantValue);
-                           inline.put((ConstantRef) constantValue, constantStringVar.getConstantValue());
-                        }
+            if(structMemberVar.isArray() && structMemberVar.getArraySize() != null) {
+               if(value instanceof ConstantValue) {
+                  ConstantValue constantValue = (ConstantValue) value;
+                  if(constantValue.getType(getProgram().getScope()).equals(SymbolType.STRING)) {
+                     if(constantValue instanceof ConstantRef) {
+                        Variable constantStringVar = getScope().getConstant((ConstantRef) constantValue);
+                        inline.put((ConstantRef) constantValue, constantStringVar.getConstantValue());
                      }
                   }
                }
diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java
index 8df5f3d1d..0922eccb5 100644
--- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java
+++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java
@@ -814,11 +814,10 @@ public class TestPrograms {
       compileAndCompare("struct-ptr-32");
    }
 
-   // TODO: Fix problem with structs containing arrays
-   // @Test
-   // public void testStructPtr31() throws IOException, URISyntaxException {
-   //  compileAndCompare("struct-ptr-31");
-   // }
+    @Test
+    public void testStructPtr31() throws IOException, URISyntaxException {
+     compileAndCompare("struct-ptr-31");
+    }
 
    @Test
    public void testStructPtr30() throws IOException, URISyntaxException {
diff --git a/src/test/ref/struct-ptr-31.asm b/src/test/ref/struct-ptr-31.asm
index 727a903c0..228d1e0ff 100644
--- a/src/test/ref/struct-ptr-31.asm
+++ b/src/test/ref/struct-ptr-31.asm
@@ -63,8 +63,6 @@ print_person: {
     iny
     jmp __b1
 }
-  DIGIT: .text "0123456789"
-  .byte 0
   persons: .byte 4
   .text "jesper"
   .byte 0
@@ -73,3 +71,5 @@ print_person: {
   .text "henriette"
   .byte 0
   .fill 6, 0
+  DIGIT: .text "0123456789"
+  .byte 0
diff --git a/src/test/ref/struct-ptr-31.cfg b/src/test/ref/struct-ptr-31.cfg
index 9ee2f909e..c69794605 100644
--- a/src/test/ref/struct-ptr-31.cfg
+++ b/src/test/ref/struct-ptr-31.cfg
@@ -24,8 +24,8 @@ 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 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))
+  [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 + (byte) idx#4) ← (byte) ' '
   [13] (byte) idx#5 ← ++ (byte) idx#4
@@ -33,8 +33,8 @@ print_person: scope:[print_person]  from main main::@1
 print_person::@1: scope:[print_person]  from print_person print_person::@2
   [14] (byte) idx#14 ← phi( print_person/(byte) idx#5 print_person::@2/(byte) idx#6 )
   [14] (byte) print_person::i#2 ← phi( print_person/(byte) 0 print_person::@2/(byte) print_person::i#1 )
-  [15] (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME
-  [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2
+  [15] (byte*~) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME
+  [16] if((byte) 0!=*((byte*~) 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 + (byte) idx#14) ← (byte) ' '
@@ -44,8 +44,8 @@ print_person::@return: scope:[print_person]  from print_person::@3
   [19] return 
   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 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2)
+  [20] (byte*~) print_person::$2 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME
+  [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte*~) 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 80d7a693f..0b615d60b 100644
--- a/src/test/ref/struct-ptr-31.log
+++ b/src/test/ref/struct-ptr-31.log
@@ -1,31 +1,28 @@
 Fixing struct type size struct Person to 17
 Fixing struct type size struct Person to 17
-Fixing pointer addition (struct Person*~) main::$1 ← (struct Person[]) persons + (number) 1
+Fixing constant pointer addition (const struct Person*) persons+(number) 1
 Rewriting struct pointer member access *((struct Person*) print_person::person).id
 Rewriting struct pointer member access *((struct Person*) print_person::person).name
 Rewriting struct pointer member access *((struct Person*) print_person::person).name
-Warning! Adding boolean cast to non-boolean condition *((byte[$10]) print_person::$1 + (byte) print_person::i)
+Warning! Adding boolean cast to non-boolean condition *((byte*~) print_person::$1 + (byte) print_person::i)
 Culled Empty Block (label) print_person::@4
 Culled Empty Block (label) print_person::@5
 Culled Empty Block (label) print_person::@6
 
 CONTROL FLOW GRAPH SSA
 @begin: scope:[]  from
-  (struct Person[]) persons ← { (struct Person){ (byte)(number) 4, (const string) $0 }, (struct Person){ (byte)(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
+  (struct Person*) print_person::person#0 ← (const 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 + (number~) main::$3
-  (struct Person*) print_person::person#1 ← (struct Person*~) main::$1
+  (struct Person*) print_person::person#1 ← (const struct Person*) persons+(number) 1*(const byte) SIZEOF_STRUCT_PERSON
   call print_person 
   to:main::@2
 main::@2: scope:[main]  from main::@1
@@ -45,8 +42,8 @@ main::@return: scope:[main]  from main::@2
 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
-  *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*) print_person::$0))
+  (byte*~) print_person::$0 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID
+  *((const byte*) SCREEN + (byte) idx#13) ← *((const byte*) DIGIT + *((byte*~) print_person::$0))
   (byte) idx#4 ← ++ (byte) idx#13
   *((const byte*) SCREEN + (byte) idx#4) ← (byte) ' '
   (byte) idx#5 ← ++ (byte) idx#4
@@ -56,16 +53,16 @@ print_person::@1: scope:[print_person]  from print_person print_person::@2
   (byte) idx#19 ← phi( print_person/(byte) idx#5 print_person::@2/(byte) idx#6 )
   (byte) print_person::i#2 ← phi( print_person/(byte) print_person::i#0 print_person::@2/(byte) print_person::i#1 )
   (struct Person*) print_person::person#3 ← phi( print_person/(struct Person*) print_person::person#2 print_person::@2/(struct Person*) print_person::person#4 )
-  (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#3 + (const byte) OFFSET_STRUCT_PERSON_NAME
-  (bool~) print_person::$3 ← (number) 0 != *((byte[$10]) print_person::$1 + (byte) print_person::i#2)
+  (byte*~) print_person::$1 ← (byte*)(struct Person*) print_person::person#3 + (const byte) OFFSET_STRUCT_PERSON_NAME
+  (bool~) print_person::$3 ← (number) 0 != *((byte*~) print_person::$1 + (byte) print_person::i#2)
   if((bool~) print_person::$3) goto print_person::@2
   to:print_person::@3
 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 )
   (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
-  *((const byte*) SCREEN + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#3)
+  (byte*~) print_person::$2 ← (byte*)(struct Person*) print_person::person#4 + (const byte) OFFSET_STRUCT_PERSON_NAME
+  *((const byte*) SCREEN + (byte) idx#14) ← *((byte*~) 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
@@ -90,18 +87,16 @@ print_person::@return: scope:[print_person]  from print_person::@3
 @end: scope:[]  from @3
 
 SYMBOL TABLE SSA
-(const string) $0 = (string) "jesper"
-(const string) $1 = (string) "henriette"
 (label) @1
 (label) @2
 (label) @3
 (label) @begin
 (label) @end
-(const byte[]) DIGIT = (string) "0123456789"
+(const byte*) DIGIT = (string) "0123456789"
 (const byte) OFFSET_STRUCT_PERSON_ID = (byte) 0
 (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1
 (byte) Person::id
-(byte[$10]) Person::name
+(byte*) Person::name
 (const byte*) SCREEN = (byte*)(number) $400
 (const byte) SIZEOF_STRUCT_PERSON = (byte) $11
 (byte) idx
@@ -127,16 +122,14 @@ SYMBOL TABLE SSA
 (byte) idx#8
 (byte) idx#9
 (void()) main()
-(struct Person*~) main::$1
-(number~) main::$3
 (label) main::@1
 (label) main::@2
 (label) main::@return
-(struct Person[]) persons
+(const struct Person*) persons = { { id: (byte)(number) 4, name: (string) "jesper" }, { id: (byte)(number) 7, name: (string) "henriette" } }
 (void()) print_person((struct Person*) print_person::person)
-(byte*) print_person::$0
-(byte[$10]) print_person::$1
-(byte[$10]) print_person::$2
+(byte*~) print_person::$0
+(byte*~) print_person::$1
+(byte*~) print_person::$2
 (bool~) print_person::$3
 (label) print_person::@1
 (label) print_person::@2
@@ -154,18 +147,19 @@ SYMBOL TABLE SSA
 (struct Person*) print_person::person#3
 (struct Person*) print_person::person#4
 
-Adding number conversion cast (unumber) 1 in (number~) main::$3 ← (number) 1 * (const byte) SIZEOF_STRUCT_PERSON
-Adding number conversion cast (unumber) main::$3 in (number~) main::$3 ← (unumber)(number) 1 * (const byte) SIZEOF_STRUCT_PERSON
+Adding number conversion cast (unumber) 1*SIZEOF_STRUCT_PERSON in (struct Person*) print_person::person#1 ← (const struct Person*) persons+(number) 1*(const byte) SIZEOF_STRUCT_PERSON
+Adding number conversion cast (unumber) 1 in (struct Person*) print_person::person#1 ← (const struct Person*) persons+(unumber)(number) 1*(const byte) SIZEOF_STRUCT_PERSON
 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)
+Adding number conversion cast (unumber) 0 in (bool~) print_person::$3 ← (number) 0 != *((byte*~) print_person::$1 + (byte) print_person::i#2)
 Successful SSA optimization PassNAddNumberTypeConversions
 Inlining cast (byte) idx#3 ← (unumber)(number) 0
 Inlining cast (byte) print_person::i#0 ← (unumber)(number) 0
 Successful SSA optimization Pass2InlineCast
-Simplifying constant pointer cast (byte*) 1024
 Simplifying constant integer cast 4
 Simplifying constant integer cast 7
+Simplifying constant pointer cast (byte*) 1024
+Simplifying constant integer cast (unumber)(number) 1*(const byte) SIZEOF_STRUCT_PERSON
 Simplifying constant integer cast 1
 Simplifying constant integer cast 0
 Simplifying constant integer cast 0
@@ -176,9 +170,7 @@ Finalized unsigned number type (byte) 0
 Finalized unsigned number type (byte) 0
 Finalized unsigned number type (byte) 0
 Successful SSA optimization PassNFinalizeNumberTypeConversions
-Inferred type updated to byte in (unumber~) main::$3 ← (byte) 1 * (const byte) SIZEOF_STRUCT_PERSON
 Alias (byte) idx#0 = (byte) idx#10 
-Alias (struct Person*) print_person::person#1 = (struct Person*~) main::$1 
 Alias (byte) idx#1 = (byte) idx#11 (byte) idx#12 (byte) idx#2 
 Alias (struct Person*) print_person::person#3 = (struct Person*) print_person::person#4 
 Alias (byte) print_person::i#2 = (byte) print_person::i#3 
@@ -193,47 +185,30 @@ Identical Phi Values (byte) idx#1 (byte) idx#16
 Identical Phi Values (struct Person*) print_person::person#3 (struct Person*) print_person::person#2
 Identical Phi Values (byte) idx#17 (byte) idx#1
 Successful SSA optimization Pass2IdenticalPhiElimination
-Simple Condition (bool~) print_person::$3 [26] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2
+Simple Condition (bool~) print_person::$3 [23] if((byte) 0!=*((byte*~) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2
 Successful SSA optimization Pass2ConditionalJumpSimplification
-Constant right-side identified [6] (byte~) main::$3 ← (byte) 1 * (const byte) SIZEOF_STRUCT_PERSON
-Successful SSA optimization Pass2ConstantRValueConsolidation
-Identified constant from value list (struct Person) { id: (byte) 4, name: (const string) $0 }
-Identified constant from value list (struct Person) { id: (byte) 7, name: (const string) $1 }
-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 = { { id: 4, name: $0 }, { id: 7, name: $1 } }
-Constant (const byte) main::$3 = 1*SIZEOF_STRUCT_PERSON
+Constant (const struct Person*) print_person::person#0 = persons
+Constant (const struct Person*) print_person::person#1 = persons+1*SIZEOF_STRUCT_PERSON
 Constant (const byte) idx#20 = 0
 Constant (const byte) print_person::i#0 = 0
 Successful SSA optimization Pass2ConstantIdentification
-Constant (const struct Person*) print_person::person#0 = persons
-Successful SSA optimization Pass2ConstantIdentification
-Converting *(pointer+n) to pointer[n] [18] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*) print_person::$0))  -- *((byte*)print_person::person#2 + OFFSET_STRUCT_PERSON_ID)
+Converting *(pointer+n) to pointer[n] [15] *((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 [17] (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 [18] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_ID))
+Simplifying expression containing zero (byte*)print_person::person#2 in [14] (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 [15] *((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 variable (byte*~) print_person::$0 and assignment [4] (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 + (const byte) main::$3
-Successful SSA optimization Pass2ConstantRValueConsolidation
-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
 Inlining constant with var siblings (const struct Person*) print_person::person#1
+Inlining constant with var siblings (const byte) print_person::i#0
 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
+Constant inlined print_person::person#0 = (const struct Person*) persons
 Constant inlined print_person::i#0 = (byte) 0
-Constant inlined print_person::person#1 = (const struct Person[]) persons+(byte) 1*(const byte) SIZEOF_STRUCT_PERSON
+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"
-Successful SSA optimization Pass2ArrayInStructInlining
 Adding NOP phi() at start of @begin
 Adding NOP phi() at start of @1
 Adding NOP phi() at start of @2
@@ -288,8 +263,8 @@ 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 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))
+  [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 + (byte) idx#4) ← (byte) ' '
   [13] (byte) idx#5 ← ++ (byte) idx#4
@@ -297,8 +272,8 @@ print_person: scope:[print_person]  from main main::@1
 print_person::@1: scope:[print_person]  from print_person print_person::@2
   [14] (byte) idx#14 ← phi( print_person/(byte) idx#5 print_person::@2/(byte) idx#6 )
   [14] (byte) print_person::i#2 ← phi( print_person/(byte) 0 print_person::@2/(byte) print_person::i#1 )
-  [15] (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME
-  [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2
+  [15] (byte*~) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME
+  [16] if((byte) 0!=*((byte*~) 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 + (byte) idx#14) ← (byte) ' '
@@ -308,8 +283,8 @@ print_person::@return: scope:[print_person]  from print_person::@3
   [19] return 
   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 + (byte) idx#14) ← *((byte[$10]) print_person::$2 + (byte) print_person::i#2)
+  [20] (byte*~) print_person::$2 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME
+  [21] *((const byte*) SCREEN + (byte) idx#14) ← *((byte*~) 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
@@ -317,7 +292,7 @@ print_person::@2: scope:[print_person]  from print_person::@1
 
 VARIABLE REGISTER WEIGHTS
 (byte) Person::id
-(byte[$10]) Person::name
+(byte*) Person::name
 (byte) idx
 (byte) idx#13 3.0
 (byte) idx#14 6.5
@@ -327,8 +302,8 @@ VARIABLE REGISTER WEIGHTS
 (byte) idx#6 11.0
 (void()) main()
 (void()) print_person((struct Person*) print_person::person)
-(byte[$10]) print_person::$1 22.0
-(byte[$10]) print_person::$2 22.0
+(byte*~) print_person::$1 22.0
+(byte*~) print_person::$2 22.0
 (byte) print_person::i
 (byte) print_person::i#1 22.0
 (byte) print_person::i#2 7.333333333333333
@@ -398,7 +373,7 @@ main: {
     // [9] phi (byte) idx#13 = (byte) 0 [phi:main->print_person#0] -- vbuz1=vbuc1 
     lda #0
     sta.z idx_2
-    // [9] phi (struct Person*) print_person::person#2 = (const struct Person[]) persons [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
     sta.z print_person.person
     lda #>persons
@@ -413,7 +388,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+(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
     sta.z print_person.person
     lda #>persons+1*SIZEOF_STRUCT_PERSON
@@ -432,7 +407,7 @@ print_person: {
     .label __2 = $a
     .label i = 5
     .label person = 2
-    // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((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_2
     ldy #0
     lda (person),y
@@ -460,7 +435,7 @@ print_person: {
     jmp __b1
     // print_person::@1
   __b1:
-    // [15] (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
+    // [15] (byte*~) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
     lda #OFFSET_STRUCT_PERSON_NAME
     clc
     adc.z person
@@ -468,7 +443,7 @@ print_person: {
     lda #0
     adc.z person+1
     sta.z __1+1
-    // [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 -- vbuc1_neq_pbuz1_derefidx_vbuz2_then_la1 
+    // [16] if((byte) 0!=*((byte*~) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 -- vbuc1_neq_pbuz1_derefidx_vbuz2_then_la1 
     ldy.z i
     lda (__1),y
     cmp #0
@@ -491,7 +466,7 @@ print_person: {
     rts
     // print_person::@2
   __b2:
-    // [20] (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
+    // [20] (byte*~) print_person::$2 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
     lda #OFFSET_STRUCT_PERSON_NAME
     clc
     adc.z person
@@ -499,7 +474,7 @@ print_person: {
     lda #0
     adc.z person+1
     sta.z __2+1
-    // [21] *((const byte*) SCREEN + (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*~) print_person::$2 + (byte) print_person::i#2) -- pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz3 
     ldx.z idx_1
     ldy.z i
     lda (__2),y
@@ -515,8 +490,6 @@ print_person: {
     jmp __b1
 }
   // File Data
-  DIGIT: .text "0123456789"
-  .byte 0
   persons: .byte 4
   .text "jesper"
   .byte 0
@@ -525,27 +498,29 @@ print_person: {
   .text "henriette"
   .byte 0
   .fill 6, 0
+  DIGIT: .text "0123456789"
+  .byte 0
 
 REGISTER UPLIFT POTENTIAL REGISTERS
-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 [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[1]:4 [ idx#13 idx#16 ]
 Removing always clobbered register reg byte y as potential for zp[1]:4 [ idx#13 idx#16 ]
 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[1]: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 
+Statement [15] (byte*~) print_person::$1 ← (byte*)(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[1]:5 [ print_person::i#2 print_person::i#1 ]
 Removing always clobbered register reg byte a as potential for zp[1]: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 [16] if((byte) 0!=*((byte*~) 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 + (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 + (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 [20] (byte*~) print_person::$2 ← (byte*)(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 + (byte) idx#14) ← *((byte*~) 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 [15] (byte*~) print_person::$1 ← (byte*)(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*~) 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 + (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 + (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 [20] (byte*~) print_person::$2 ← (byte*)(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 + (byte) idx#14) ← *((byte*~) 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[2]:2 [ print_person::person#2 ] : zp[2]:2 , 
 Potential registers zp[1]:4 [ idx#13 idx#16 ] : zp[1]:4 , reg byte x , 
 Potential registers zp[1]:5 [ print_person::i#2 print_person::i#1 ] : zp[1]:5 , reg byte x , reg byte y , 
@@ -601,7 +576,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 [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
     sta.z print_person.person
     lda #>persons
@@ -616,7 +591,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+(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
     sta.z print_person.person
     lda #>persons+1*SIZEOF_STRUCT_PERSON
@@ -634,7 +609,7 @@ print_person: {
     .label __1 = 4
     .label __2 = 6
     .label person = 2
-    // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((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
@@ -655,7 +630,7 @@ print_person: {
     jmp __b1
     // print_person::@1
   __b1:
-    // [15] (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
+    // [15] (byte*~) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
     lda #OFFSET_STRUCT_PERSON_NAME
     clc
     adc.z person
@@ -663,7 +638,7 @@ print_person: {
     lda #0
     adc.z person+1
     sta.z __1+1
-    // [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 -- vbuc1_neq_pbuz1_derefidx_vbuyy_then_la1 
+    // [16] if((byte) 0!=*((byte*~) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 -- vbuc1_neq_pbuz1_derefidx_vbuyy_then_la1 
     lda (__1),y
     cmp #0
     bne __b2
@@ -682,7 +657,7 @@ print_person: {
     rts
     // print_person::@2
   __b2:
-    // [20] (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
+    // [20] (byte*~) print_person::$2 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
     lda #OFFSET_STRUCT_PERSON_NAME
     clc
     adc.z person
@@ -690,7 +665,7 @@ print_person: {
     lda #0
     adc.z person+1
     sta.z __2+1
-    // [21] *((const byte*) SCREEN + (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*~) 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 
@@ -704,8 +679,6 @@ print_person: {
     jmp __b1
 }
   // File Data
-  DIGIT: .text "0123456789"
-  .byte 0
   persons: .byte 4
   .text "jesper"
   .byte 0
@@ -714,6 +687,8 @@ print_person: {
   .text "henriette"
   .byte 0
   .fill 6, 0
+  DIGIT: .text "0123456789"
+  .byte 0
 
 ASSEMBLER OPTIMIZATIONS
 Removing instruction jmp __b1
@@ -751,10 +726,10 @@ FINAL SYMBOL TABLE
 (label) @1
 (label) @begin
 (label) @end
-(const byte[]) DIGIT = (string) "0123456789"
+(const byte*) DIGIT = (string) "0123456789"
 (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1
 (byte) Person::id
-(byte[$10]) Person::name
+(byte*) Person::name
 (const byte*) SCREEN = (byte*) 1024
 (const byte) SIZEOF_STRUCT_PERSON = (byte) $11
 (byte) idx
@@ -767,10 +742,10 @@ FINAL SYMBOL TABLE
 (void()) main()
 (label) main::@1
 (label) main::@return
-(const struct Person[]) persons = { { id: (byte) 4, name: (string) "jesper" }, { id: (byte) 7, name: (string) "henriette" } }
+(const struct Person*) 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 zp[2]:4 22.0
-(byte[$10]) print_person::$2 zp[2]:6 22.0
+(byte*~) print_person::$1 zp[2]:4 22.0
+(byte*~) print_person::$2 zp[2]:6 22.0
 (label) print_person::@1
 (label) print_person::@2
 (label) print_person::@3
@@ -817,7 +792,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 [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
     sta.z print_person.person
     lda #>persons
@@ -829,7 +804,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+(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
     sta.z print_person.person
     lda #>persons+1*SIZEOF_STRUCT_PERSON
@@ -847,7 +822,7 @@ print_person: {
     .label __2 = 6
     .label person = 2
     // SCREEN[idx++] = DIGIT[person->id]
-    // [10] *((const byte*) SCREEN + (byte) idx#13) ← *((const byte[]) DIGIT + *((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
@@ -870,7 +845,7 @@ print_person: {
     // print_person::@1
   __b1:
     // for(byte i=0; person->name[i]; i++)
-    // [15] (byte[$10]) print_person::$1 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
+    // [15] (byte*~) print_person::$1 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
     lda #OFFSET_STRUCT_PERSON_NAME
     clc
     adc.z person
@@ -878,7 +853,7 @@ print_person: {
     lda #0
     adc.z person+1
     sta.z __1+1
-    // [16] if((byte) 0!=*((byte[$10]) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 -- vbuc1_neq_pbuz1_derefidx_vbuyy_then_la1 
+    // [16] if((byte) 0!=*((byte*~) print_person::$1 + (byte) print_person::i#2)) goto print_person::@2 -- vbuc1_neq_pbuz1_derefidx_vbuyy_then_la1 
     lda (__1),y
     cmp #0
     bne __b2
@@ -897,7 +872,7 @@ print_person: {
     // print_person::@2
   __b2:
     // SCREEN[idx++] = person->name[i]
-    // [20] (byte[$10]) print_person::$2 ← (byte[$10])(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
+    // [20] (byte*~) print_person::$2 ← (byte*)(struct Person*) print_person::person#2 + (const byte) OFFSET_STRUCT_PERSON_NAME -- pbuz1=pbuz2_plus_vbuc1 
     lda #OFFSET_STRUCT_PERSON_NAME
     clc
     adc.z person
@@ -905,7 +880,7 @@ print_person: {
     lda #0
     adc.z person+1
     sta.z __2+1
-    // [21] *((const byte*) SCREEN + (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*~) 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];
@@ -920,8 +895,6 @@ print_person: {
     jmp __b1
 }
   // File Data
-  DIGIT: .text "0123456789"
-  .byte 0
   persons: .byte 4
   .text "jesper"
   .byte 0
@@ -930,4 +903,6 @@ print_person: {
   .text "henriette"
   .byte 0
   .fill 6, 0
+  DIGIT: .text "0123456789"
+  .byte 0
 
diff --git a/src/test/ref/struct-ptr-31.sym b/src/test/ref/struct-ptr-31.sym
index c5267d4fe..5f8f1fb0c 100644
--- a/src/test/ref/struct-ptr-31.sym
+++ b/src/test/ref/struct-ptr-31.sym
@@ -1,10 +1,10 @@
 (label) @1
 (label) @begin
 (label) @end
-(const byte[]) DIGIT = (string) "0123456789"
+(const byte*) DIGIT = (string) "0123456789"
 (const byte) OFFSET_STRUCT_PERSON_NAME = (byte) 1
 (byte) Person::id
-(byte[$10]) Person::name
+(byte*) Person::name
 (const byte*) SCREEN = (byte*) 1024
 (const byte) SIZEOF_STRUCT_PERSON = (byte) $11
 (byte) idx
@@ -17,10 +17,10 @@
 (void()) main()
 (label) main::@1
 (label) main::@return
-(const struct Person[]) persons = { { id: (byte) 4, name: (string) "jesper" }, { id: (byte) 7, name: (string) "henriette" } }
+(const struct Person*) 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 zp[2]:4 22.0
-(byte[$10]) print_person::$2 zp[2]:6 22.0
+(byte*~) print_person::$1 zp[2]:4 22.0
+(byte*~) print_person::$2 zp[2]:6 22.0
 (label) print_person::@1
 (label) print_person::@2
 (label) print_person::@3